forked from enlightenment/efl
Ecore_Wayland: Add actual code to handle drag-n-drop (not complete
yet). Update shm_format to newer wayland ones. SVN revision: 67176
This commit is contained in:
parent
7bace75fcc
commit
0216b83173
|
@ -43,6 +43,16 @@ static void _ecore_wl_cb_handle_touch_up(void *data __UNUSED__, struct wl_input_
|
||||||
static void _ecore_wl_cb_handle_touch_motion(void *data __UNUSED__, struct wl_input_device *dev __UNUSED__, uint32_t timestamp, int32_t id, int32_t x, int32_t y);
|
static void _ecore_wl_cb_handle_touch_motion(void *data __UNUSED__, struct wl_input_device *dev __UNUSED__, uint32_t timestamp, int32_t id, int32_t x, int32_t y);
|
||||||
static void _ecore_wl_cb_handle_touch_frame(void *data __UNUSED__, struct wl_input_device *dev __UNUSED__);
|
static void _ecore_wl_cb_handle_touch_frame(void *data __UNUSED__, struct wl_input_device *dev __UNUSED__);
|
||||||
static void _ecore_wl_cb_handle_touch_cancel(void *data __UNUSED__, struct wl_input_device *dev __UNUSED__);
|
static void _ecore_wl_cb_handle_touch_cancel(void *data __UNUSED__, struct wl_input_device *dev __UNUSED__);
|
||||||
|
static void _ecore_wl_cb_source_target(void *data, struct wl_data_source *source, const char *mime_type);
|
||||||
|
static void _ecore_wl_cb_source_send(void *data, struct wl_data_source *source, const char *mime_type, int32_t fd);
|
||||||
|
static void _ecore_wl_cb_source_cancelled(void *data, struct wl_data_source *source);
|
||||||
|
static void _ecore_wl_cb_source_offer(void *data, struct wl_data_offer *offer __UNUSED__, const char *type);
|
||||||
|
static void _ecore_wl_cb_data_offer(void *data, struct wl_data_device *data_dev, uint32_t id);
|
||||||
|
static void _ecore_wl_cb_data_enter(void *data, struct wl_data_device *data_dev, uint32_t timestamp, struct wl_surface *surface, int32_t x, int32_t y, struct wl_data_offer *offer);
|
||||||
|
static void _ecore_wl_cb_data_leave(void *data, struct wl_data_device *data_dev __UNUSED__);
|
||||||
|
static void _ecore_wl_cb_data_motion(void *data, struct wl_data_device *data_dev, uint32_t timestamp, int32_t x, int32_t y);
|
||||||
|
static void _ecore_wl_cb_data_drop(void *data, struct wl_data_device *data_dev);
|
||||||
|
static void _ecore_wl_cb_data_selection(void *data, struct wl_data_device *data_dev, struct wl_data_offer *offer);
|
||||||
|
|
||||||
static void _ecore_wl_mouse_move_send(uint32_t timestamp);
|
static void _ecore_wl_mouse_move_send(uint32_t timestamp);
|
||||||
static void _ecore_wl_mouse_out_send(struct wl_surface *surface, uint32_t timestamp);
|
static void _ecore_wl_mouse_out_send(struct wl_surface *surface, uint32_t timestamp);
|
||||||
|
@ -56,7 +66,7 @@ static void _ecore_wl_focus_in_send(struct wl_surface *surface, uint32_t timesta
|
||||||
static int _ecore_wl_init_count = 0;
|
static int _ecore_wl_init_count = 0;
|
||||||
static struct wl_display *_ecore_wl_disp = NULL;
|
static struct wl_display *_ecore_wl_disp = NULL;
|
||||||
static uint32_t _ecore_wl_disp_mask = 0;
|
static uint32_t _ecore_wl_disp_mask = 0;
|
||||||
static uint32_t _ecore_wl_disp_format = WL_SHM_FORMAT_PREMULTIPLIED_ARGB32;
|
static uint32_t _ecore_wl_disp_format = WL_SHM_FORMAT_ARGB8888;
|
||||||
static Eina_Rectangle _ecore_wl_screen;
|
static Eina_Rectangle _ecore_wl_screen;
|
||||||
static Ecore_Fd_Handler *_ecore_wl_fd_hdl = NULL;
|
static Ecore_Fd_Handler *_ecore_wl_fd_hdl = NULL;
|
||||||
static int _ecore_wl_screen_x = 0;
|
static int _ecore_wl_screen_x = 0;
|
||||||
|
@ -73,11 +83,11 @@ static struct wl_compositor *_ecore_wl_comp;
|
||||||
static struct wl_shm *_ecore_wl_shm;
|
static struct wl_shm *_ecore_wl_shm;
|
||||||
static struct wl_shell *_ecore_wl_shell;
|
static struct wl_shell *_ecore_wl_shell;
|
||||||
static struct wl_output *_ecore_wl_output;
|
static struct wl_output *_ecore_wl_output;
|
||||||
static struct wl_input_device *_ecore_wl_input;
|
static struct wl_input_device *_ecore_wl_input_dev;
|
||||||
static struct wl_surface *_ecore_wl_input_surface;
|
static struct wl_surface *_ecore_wl_input_surface;
|
||||||
static struct wl_surface *_ecore_wl_touch_surface;
|
static struct wl_surface *_ecore_wl_touch_surface;
|
||||||
static struct wl_data_device_manager *_ecore_wl_dnd_manager;
|
static struct wl_data_device_manager *_ecore_wl_data_manager;
|
||||||
static struct wl_data_device *_ecore_wl_dnd_dev;
|
static struct wl_data_device *_ecore_wl_data_dev;
|
||||||
|
|
||||||
static const struct wl_shm_listener _ecore_wl_shm_listener =
|
static const struct wl_shm_listener _ecore_wl_shm_listener =
|
||||||
{
|
{
|
||||||
|
@ -101,21 +111,25 @@ static const struct wl_input_device_listener _ecore_wl_input_listener =
|
||||||
_ecore_wl_cb_handle_touch_frame,
|
_ecore_wl_cb_handle_touch_frame,
|
||||||
_ecore_wl_cb_handle_touch_cancel,
|
_ecore_wl_cb_handle_touch_cancel,
|
||||||
};
|
};
|
||||||
/* static const struct wl_data_source_listener _ecore_wl_dnd_listener = */
|
static const struct wl_data_source_listener _ecore_wl_source_listener =
|
||||||
/* { */
|
{
|
||||||
/* _ecore_wl_cb_dnd_target, */
|
_ecore_wl_cb_source_target,
|
||||||
/* _ecore_wl_cb_dnd_send, */
|
_ecore_wl_cb_source_send,
|
||||||
/* _ecore_wl_cb_dnd_cancelled */
|
_ecore_wl_cb_source_cancelled
|
||||||
/* }; */
|
};
|
||||||
/* static const struct wl_data_device_listener _ecore_wl_data_listener = */
|
static const struct wl_data_device_listener _ecore_wl_data_listener =
|
||||||
/* { */
|
{
|
||||||
/* _ecore_wl_cb_dnd_offer, */
|
_ecore_wl_cb_data_offer,
|
||||||
/* _ecore_wl_cb_dnd_enter, */
|
_ecore_wl_cb_data_enter,
|
||||||
/* _ecore_wl_cb_dnd_leave, */
|
_ecore_wl_cb_data_leave,
|
||||||
/* _ecore_wl_cb_dnd_motion, */
|
_ecore_wl_cb_data_motion,
|
||||||
/* _ecore_wl_cb_dnd_drop, */
|
_ecore_wl_cb_data_drop,
|
||||||
/* _ecore_wl_cb_dnd_selection */
|
_ecore_wl_cb_data_selection
|
||||||
/* }; */
|
};
|
||||||
|
static const struct wl_data_offer_listener _ecore_wl_offer_listener =
|
||||||
|
{
|
||||||
|
_ecore_wl_cb_source_offer,
|
||||||
|
};
|
||||||
|
|
||||||
/* external variables */
|
/* external variables */
|
||||||
int _ecore_wl_log_dom = -1;
|
int _ecore_wl_log_dom = -1;
|
||||||
|
@ -261,7 +275,7 @@ ecore_wl_shell_get(void)
|
||||||
EAPI struct wl_input_device *
|
EAPI struct wl_input_device *
|
||||||
ecore_wl_input_device_get(void)
|
ecore_wl_input_device_get(void)
|
||||||
{
|
{
|
||||||
return _ecore_wl_input;
|
return _ecore_wl_input_dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI void
|
EAPI void
|
||||||
|
@ -314,10 +328,10 @@ _ecore_wl_shutdown(Eina_Bool close_display)
|
||||||
|
|
||||||
if (close_display)
|
if (close_display)
|
||||||
{
|
{
|
||||||
if (_ecore_wl_dnd_dev) wl_data_device_destroy(_ecore_wl_dnd_dev);
|
if (_ecore_wl_data_dev) wl_data_device_destroy(_ecore_wl_data_dev);
|
||||||
if (_ecore_wl_input) wl_input_device_destroy(_ecore_wl_input);
|
if (_ecore_wl_input_dev) wl_input_device_destroy(_ecore_wl_input_dev);
|
||||||
if (_ecore_wl_dnd_manager)
|
if (_ecore_wl_data_manager)
|
||||||
wl_data_device_manager_destroy(_ecore_wl_dnd_manager);
|
wl_data_device_manager_destroy(_ecore_wl_data_manager);
|
||||||
if (_ecore_wl_shell) wl_shell_destroy(_ecore_wl_shell);
|
if (_ecore_wl_shell) wl_shell_destroy(_ecore_wl_shell);
|
||||||
if (_ecore_wl_shm) wl_shm_destroy(_ecore_wl_shm);
|
if (_ecore_wl_shm) wl_shm_destroy(_ecore_wl_shm);
|
||||||
if (_ecore_wl_comp) wl_compositor_destroy(_ecore_wl_comp);
|
if (_ecore_wl_comp) wl_compositor_destroy(_ecore_wl_comp);
|
||||||
|
@ -366,20 +380,20 @@ _ecore_wl_cb_disp_handle_global(struct wl_display *disp, uint32_t id, const char
|
||||||
}
|
}
|
||||||
else if (!strcmp(interface, "wl_input_device"))
|
else if (!strcmp(interface, "wl_input_device"))
|
||||||
{
|
{
|
||||||
_ecore_wl_input =
|
_ecore_wl_input_dev =
|
||||||
wl_display_bind(_ecore_wl_disp, id, &wl_input_device_interface);
|
wl_display_bind(_ecore_wl_disp, id, &wl_input_device_interface);
|
||||||
wl_input_device_add_listener(_ecore_wl_input,
|
wl_input_device_add_listener(_ecore_wl_input_dev,
|
||||||
&_ecore_wl_input_listener, NULL);
|
&_ecore_wl_input_listener, NULL);
|
||||||
|
|
||||||
_ecore_wl_dnd_dev =
|
_ecore_wl_data_dev =
|
||||||
wl_data_device_manager_get_data_device(_ecore_wl_dnd_manager,
|
wl_data_device_manager_get_data_device(_ecore_wl_data_manager,
|
||||||
_ecore_wl_input);
|
_ecore_wl_input_dev);
|
||||||
/* wl_data_device_add_listener(_ecore_wl_dnd_dev, */
|
wl_data_device_add_listener(_ecore_wl_data_dev,
|
||||||
/* &_ecore_wl_data_listener, NULL); */
|
&_ecore_wl_data_listener, NULL);
|
||||||
}
|
}
|
||||||
else if (!strcmp(interface, "wl_data_device_manager"))
|
else if (!strcmp(interface, "wl_data_device_manager"))
|
||||||
{
|
{
|
||||||
_ecore_wl_dnd_manager =
|
_ecore_wl_data_manager =
|
||||||
wl_display_bind(_ecore_wl_disp, id,
|
wl_display_bind(_ecore_wl_disp, id,
|
||||||
&wl_data_device_manager_interface);
|
&wl_data_device_manager_interface);
|
||||||
}
|
}
|
||||||
|
@ -400,16 +414,10 @@ _ecore_wl_cb_shm_format_iterate(void *data __UNUSED__, struct wl_shm *shm __UNUS
|
||||||
{
|
{
|
||||||
// LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
// LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
||||||
|
|
||||||
if (_ecore_wl_disp_format < 2) return;
|
// if (_ecore_wl_disp_format < 1) return;
|
||||||
switch (format)
|
switch (format)
|
||||||
{
|
{
|
||||||
case WL_SHM_FORMAT_ARGB32:
|
case WL_SHM_FORMAT_XRGB8888:
|
||||||
/* NB: Ignore argb32. We prefer premul */
|
|
||||||
break;
|
|
||||||
case WL_SHM_FORMAT_PREMULTIPLIED_ARGB32:
|
|
||||||
_ecore_wl_disp_format = format;
|
|
||||||
break;
|
|
||||||
case WL_SHM_FORMAT_XRGB32:
|
|
||||||
_ecore_wl_disp_format = format;
|
_ecore_wl_disp_format = format;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -456,7 +464,7 @@ _ecore_wl_cb_fd_handle(void *data, Ecore_Fd_Handler *hdl __UNUSED__)
|
||||||
static void
|
static void
|
||||||
_ecore_wl_cb_handle_motion(void *data __UNUSED__, struct wl_input_device *dev, uint32_t t, int32_t x, int32_t y, int32_t sx, int32_t sy)
|
_ecore_wl_cb_handle_motion(void *data __UNUSED__, struct wl_input_device *dev, uint32_t t, int32_t x, int32_t y, int32_t sx, int32_t sy)
|
||||||
{
|
{
|
||||||
if (dev != _ecore_wl_input) return;
|
if (dev != _ecore_wl_input_dev) return;
|
||||||
|
|
||||||
_ecore_wl_screen_x = x;
|
_ecore_wl_screen_x = x;
|
||||||
_ecore_wl_screen_y = y;
|
_ecore_wl_screen_y = y;
|
||||||
|
@ -469,7 +477,7 @@ _ecore_wl_cb_handle_motion(void *data __UNUSED__, struct wl_input_device *dev, u
|
||||||
static void
|
static void
|
||||||
_ecore_wl_cb_handle_button(void *data __UNUSED__, struct wl_input_device *dev, uint32_t t, uint32_t btn, uint32_t state)
|
_ecore_wl_cb_handle_button(void *data __UNUSED__, struct wl_input_device *dev, uint32_t t, uint32_t btn, uint32_t state)
|
||||||
{
|
{
|
||||||
if (dev != _ecore_wl_input) return;
|
if (dev != _ecore_wl_input_dev) return;
|
||||||
|
|
||||||
if ((btn >= BTN_SIDE) && (btn <= BTN_BACK))
|
if ((btn >= BTN_SIDE) && (btn <= BTN_BACK))
|
||||||
{
|
{
|
||||||
|
@ -512,9 +520,21 @@ _ecore_wl_cb_handle_button(void *data __UNUSED__, struct wl_input_device *dev, u
|
||||||
{
|
{
|
||||||
_ecore_wl_input_button = btn;
|
_ecore_wl_input_button = btn;
|
||||||
_ecore_wl_mouse_down_send(_ecore_wl_input_surface, btn, t);
|
_ecore_wl_mouse_down_send(_ecore_wl_input_surface, btn, t);
|
||||||
|
if ((_ecore_wl_input_surface) || (_ecore_wl_touch_surface))
|
||||||
|
{
|
||||||
|
/* record item which was grabbed */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if ((_ecore_wl_input_surface) || (_ecore_wl_touch_surface))
|
||||||
|
{
|
||||||
|
/* release grabbed button and finish drag */
|
||||||
|
if ((_ecore_wl_input_button) && (_ecore_wl_input_button == btn))
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
_ecore_wl_input_button = 0;
|
_ecore_wl_input_button = 0;
|
||||||
_ecore_wl_mouse_up_send(_ecore_wl_input_surface, btn, t);
|
_ecore_wl_mouse_up_send(_ecore_wl_input_surface, btn, t);
|
||||||
}
|
}
|
||||||
|
@ -526,7 +546,7 @@ _ecore_wl_cb_handle_key(void *data __UNUSED__, struct wl_input_device *dev, uint
|
||||||
{
|
{
|
||||||
unsigned int keycode = 0;
|
unsigned int keycode = 0;
|
||||||
|
|
||||||
if (dev != _ecore_wl_input) return;
|
if (dev != _ecore_wl_input_dev) return;
|
||||||
|
|
||||||
keycode = key + _ecore_wl_xkb->min_key_code;
|
keycode = key + _ecore_wl_xkb->min_key_code;
|
||||||
|
|
||||||
|
@ -539,7 +559,7 @@ _ecore_wl_cb_handle_key(void *data __UNUSED__, struct wl_input_device *dev, uint
|
||||||
static void
|
static void
|
||||||
_ecore_wl_cb_handle_pointer_focus(void *data __UNUSED__, struct wl_input_device *dev, uint32_t t, struct wl_surface *surface, int32_t x, int32_t y, int32_t sx, int32_t sy)
|
_ecore_wl_cb_handle_pointer_focus(void *data __UNUSED__, struct wl_input_device *dev, uint32_t t, struct wl_surface *surface, int32_t x, int32_t y, int32_t sx, int32_t sy)
|
||||||
{
|
{
|
||||||
if (dev != _ecore_wl_input) return;
|
if (dev != _ecore_wl_input_dev) return;
|
||||||
|
|
||||||
/* NB: Wayland pointer focus is weird. It's not pointer focus in the normal
|
/* NB: Wayland pointer focus is weird. It's not pointer focus in the normal
|
||||||
* sense...Wayland 'moving/resizing' (and maybe other stuff) has a habit
|
* sense...Wayland 'moving/resizing' (and maybe other stuff) has a habit
|
||||||
|
@ -576,7 +596,7 @@ _ecore_wl_cb_handle_keyboard_focus(void *data __UNUSED__, struct wl_input_device
|
||||||
{
|
{
|
||||||
unsigned int *keyend = 0, *i = 0;
|
unsigned int *keyend = 0, *i = 0;
|
||||||
|
|
||||||
if (dev != _ecore_wl_input) return;
|
if (dev != _ecore_wl_input_dev) return;
|
||||||
|
|
||||||
/* NB: Remove old keyboard focus */
|
/* NB: Remove old keyboard focus */
|
||||||
if ((_ecore_wl_input_surface) && (_ecore_wl_input_surface != surface))
|
if ((_ecore_wl_input_surface) && (_ecore_wl_input_surface != surface))
|
||||||
|
@ -760,6 +780,86 @@ _ecore_wl_cb_handle_touch_cancel(void *data __UNUSED__, struct wl_input_device *
|
||||||
_ecore_wl_touch_surface = NULL;
|
_ecore_wl_touch_surface = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_ecore_wl_cb_source_target(void *data, struct wl_data_source *source, const char *mime_type)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_ecore_wl_cb_source_send(void *data, struct wl_data_source *source, const char *mime_type, int32_t fd)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_ecore_wl_cb_source_cancelled(void *data, struct wl_data_source *source)
|
||||||
|
{
|
||||||
|
/* The cancelled event usually means source is no longer in use by
|
||||||
|
* the drag (or selection). */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_ecore_wl_cb_source_offer(void *data, struct wl_data_offer *offer __UNUSED__, const char *type)
|
||||||
|
{
|
||||||
|
Ecore_Wl_Dnd_Source *s;
|
||||||
|
|
||||||
|
if (!(s = data)) return;
|
||||||
|
eina_array_push(s->types, strdup(type));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_ecore_wl_cb_data_offer(void *data, struct wl_data_device *data_dev, uint32_t id)
|
||||||
|
{
|
||||||
|
Ecore_Wl_Dnd_Source *source;
|
||||||
|
|
||||||
|
/* data being offered. Could be dnd, or selection */
|
||||||
|
|
||||||
|
/* create a new 'data offer' structure and setup a listener for it */
|
||||||
|
if (!(source = calloc(1, sizeof(Ecore_Wl_Dnd_Source)))) return;
|
||||||
|
source->types = eina_array_new(1);
|
||||||
|
source->data = data;
|
||||||
|
source->refs = 1;
|
||||||
|
|
||||||
|
/* NB: This will need to change when Wayland has typesafe wrappers for this */
|
||||||
|
source->offer = (struct wl_data_offer *)
|
||||||
|
wl_proxy_create_for_id((struct wl_proxy *)data_dev,
|
||||||
|
id, &wl_data_offer_interface);
|
||||||
|
|
||||||
|
wl_data_device_set_user_data(data_dev, source);
|
||||||
|
wl_data_offer_add_listener(source->offer, &_ecore_wl_offer_listener, source);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_ecore_wl_cb_data_enter(void *data, struct wl_data_device *data_dev, uint32_t timestamp, struct wl_surface *surface, int32_t x, int32_t y, struct wl_data_offer *offer)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_ecore_wl_cb_data_leave(void *data __UNUSED__, struct wl_data_device *data_dev __UNUSED__)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_ecore_wl_cb_data_motion(void *data, struct wl_data_device *data_dev, uint32_t timestamp, int32_t x, int32_t y)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_ecore_wl_cb_data_drop(void *data, struct wl_data_device *data_dev)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_ecore_wl_cb_data_selection(void *data, struct wl_data_device *data_dev, struct wl_data_offer *offer)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_ecore_wl_mouse_move_send(uint32_t timestamp)
|
_ecore_wl_mouse_move_send(uint32_t timestamp)
|
||||||
{
|
{
|
||||||
|
|
|
@ -44,4 +44,19 @@ extern int _ecore_wl_log_dom;
|
||||||
# endif
|
# endif
|
||||||
# define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_wl_log_dom, __VA_ARGS__)
|
# define CRIT(...) EINA_LOG_DOM_CRIT(_ecore_wl_log_dom, __VA_ARGS__)
|
||||||
|
|
||||||
|
typedef struct _Ecore_Wl_Dnd_Source
|
||||||
|
{
|
||||||
|
struct wl_data_offer *offer;
|
||||||
|
int refs;
|
||||||
|
|
||||||
|
Eina_Array *types;
|
||||||
|
|
||||||
|
void *data;
|
||||||
|
} Ecore_Wl_Dnd_Source;
|
||||||
|
|
||||||
|
typedef struct _Ecore_Wl_Dnd_Target
|
||||||
|
{
|
||||||
|
|
||||||
|
} Ecore_Wl_Dnd_Target;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue