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:
Christopher Michael 2012-01-13 06:18:04 +00:00
parent 7bace75fcc
commit 0216b83173
2 changed files with 160 additions and 45 deletions

View File

@ -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_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_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_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 struct wl_display *_ecore_wl_disp = NULL;
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 Ecore_Fd_Handler *_ecore_wl_fd_hdl = NULL;
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_shell *_ecore_wl_shell;
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_touch_surface;
static struct wl_data_device_manager *_ecore_wl_dnd_manager;
static struct wl_data_device *_ecore_wl_dnd_dev;
static struct wl_data_device_manager *_ecore_wl_data_manager;
static struct wl_data_device *_ecore_wl_data_dev;
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_cancel,
};
/* static const struct wl_data_source_listener _ecore_wl_dnd_listener = */
/* { */
/* _ecore_wl_cb_dnd_target, */
/* _ecore_wl_cb_dnd_send, */
/* _ecore_wl_cb_dnd_cancelled */
/* }; */
/* static const struct wl_data_device_listener _ecore_wl_data_listener = */
/* { */
/* _ecore_wl_cb_dnd_offer, */
/* _ecore_wl_cb_dnd_enter, */
/* _ecore_wl_cb_dnd_leave, */
/* _ecore_wl_cb_dnd_motion, */
/* _ecore_wl_cb_dnd_drop, */
/* _ecore_wl_cb_dnd_selection */
/* }; */
static const struct wl_data_source_listener _ecore_wl_source_listener =
{
_ecore_wl_cb_source_target,
_ecore_wl_cb_source_send,
_ecore_wl_cb_source_cancelled
};
static const struct wl_data_device_listener _ecore_wl_data_listener =
{
_ecore_wl_cb_data_offer,
_ecore_wl_cb_data_enter,
_ecore_wl_cb_data_leave,
_ecore_wl_cb_data_motion,
_ecore_wl_cb_data_drop,
_ecore_wl_cb_data_selection
};
static const struct wl_data_offer_listener _ecore_wl_offer_listener =
{
_ecore_wl_cb_source_offer,
};
/* external variables */
int _ecore_wl_log_dom = -1;
@ -261,7 +275,7 @@ ecore_wl_shell_get(void)
EAPI struct wl_input_device *
ecore_wl_input_device_get(void)
{
return _ecore_wl_input;
return _ecore_wl_input_dev;
}
EAPI void
@ -314,10 +328,10 @@ _ecore_wl_shutdown(Eina_Bool close_display)
if (close_display)
{
if (_ecore_wl_dnd_dev) wl_data_device_destroy(_ecore_wl_dnd_dev);
if (_ecore_wl_input) wl_input_device_destroy(_ecore_wl_input);
if (_ecore_wl_dnd_manager)
wl_data_device_manager_destroy(_ecore_wl_dnd_manager);
if (_ecore_wl_data_dev) wl_data_device_destroy(_ecore_wl_data_dev);
if (_ecore_wl_input_dev) wl_input_device_destroy(_ecore_wl_input_dev);
if (_ecore_wl_data_manager)
wl_data_device_manager_destroy(_ecore_wl_data_manager);
if (_ecore_wl_shell) wl_shell_destroy(_ecore_wl_shell);
if (_ecore_wl_shm) wl_shm_destroy(_ecore_wl_shm);
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"))
{
_ecore_wl_input =
_ecore_wl_input_dev =
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_dnd_dev =
wl_data_device_manager_get_data_device(_ecore_wl_dnd_manager,
_ecore_wl_input);
/* wl_data_device_add_listener(_ecore_wl_dnd_dev, */
/* &_ecore_wl_data_listener, NULL); */
_ecore_wl_data_dev =
wl_data_device_manager_get_data_device(_ecore_wl_data_manager,
_ecore_wl_input_dev);
wl_data_device_add_listener(_ecore_wl_data_dev,
&_ecore_wl_data_listener, NULL);
}
else if (!strcmp(interface, "wl_data_device_manager"))
{
_ecore_wl_dnd_manager =
_ecore_wl_data_manager =
wl_display_bind(_ecore_wl_disp, id,
&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__);
if (_ecore_wl_disp_format < 2) return;
// if (_ecore_wl_disp_format < 1) return;
switch (format)
{
case WL_SHM_FORMAT_ARGB32:
/* NB: Ignore argb32. We prefer premul */
break;
case WL_SHM_FORMAT_PREMULTIPLIED_ARGB32:
_ecore_wl_disp_format = format;
break;
case WL_SHM_FORMAT_XRGB32:
case WL_SHM_FORMAT_XRGB8888:
_ecore_wl_disp_format = format;
break;
default:
@ -456,7 +464,7 @@ _ecore_wl_cb_fd_handle(void *data, Ecore_Fd_Handler *hdl __UNUSED__)
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)
{
if (dev != _ecore_wl_input) return;
if (dev != _ecore_wl_input_dev) return;
_ecore_wl_screen_x = x;
_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
_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))
{
@ -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_mouse_down_send(_ecore_wl_input_surface, btn, t);
if ((_ecore_wl_input_surface) || (_ecore_wl_touch_surface))
{
/* record item which was grabbed */
}
}
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_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;
if (dev != _ecore_wl_input) return;
if (dev != _ecore_wl_input_dev) return;
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
_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
* 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;
if (dev != _ecore_wl_input) return;
if (dev != _ecore_wl_input_dev) return;
/* NB: Remove old keyboard focus */
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;
}
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
_ecore_wl_mouse_move_send(uint32_t timestamp)
{

View File

@ -44,4 +44,19 @@ extern int _ecore_wl_log_dom;
# endif
# 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