devilhorns pushed a commit to branch master.

commit 9d2f29f0ae9a1f6d78345eec2d0a2733963c12a6
Author: Chris Michael <[email protected]>
Date:   Mon May 13 09:02:37 2013 +0100

    Add functions to allow wayland clients to run inside Enlightenment
    again.
    
    Wayland moved the input handling to be inside the "compositor" now, so
    we need to add functions/support for that.
    
    Signed-off-by: Chris Michael <[email protected]>
---
 src/bin/e_comp_wl.c                       | 1070 ++++++++++++++++++++++++++++-
 src/bin/e_comp_wl.h                       |  203 +++++-
 src/modules/wl_desktop_shell/e_mod_main.c |   22 +-
 3 files changed, 1267 insertions(+), 28 deletions(-)

diff --git a/src/bin/e_comp_wl.c b/src/bin/e_comp_wl.c
index 4484c9b..72652b6 100644
--- a/src/bin/e_comp_wl.c
+++ b/src/bin/e_comp_wl.c
@@ -4,6 +4,59 @@
 #include <sys/mman.h>
 
 /* compositor function prototypes */
+static void _seat_send_updated_caps(struct wl_seat *seat);
+static void _lose_pointer_focus(struct wl_listener *listener, void *data 
EINA_UNUSED);
+static void _lose_keyboard_focus(struct wl_listener *listener, void *data 
EINA_UNUSED);
+static void _lose_touch_focus(struct wl_listener *listener, void *data 
EINA_UNUSED);
+
+static struct wl_resource *_find_resource_for_surface(struct wl_list *list, 
struct wl_resource *surface);
+static struct wl_resource *_find_resource_for_client(struct wl_list *list, 
struct wl_client *client);
+
+static void _default_grab_focus(struct wl_pointer_grab *grab, struct 
wl_resource *surface, wl_fixed_t x, wl_fixed_t y);
+static void _default_grab_motion(struct wl_pointer_grab *grab, uint32_t 
timestamp, wl_fixed_t x, wl_fixed_t y);
+static void _default_grab_button(struct wl_pointer_grab *grab, uint32_t 
timestamp, uint32_t button, uint32_t state_w);
+
+static void _default_grab_touch_down(struct wl_touch_grab *grab, uint32_t 
timestamp, int touch_id, wl_fixed_t sx, wl_fixed_t sy);
+static void _default_grab_touch_up(struct wl_touch_grab *grab, uint32_t 
timestamp, int touch_id);
+static void _default_grab_touch_motion(struct wl_touch_grab *grab, uint32_t 
timestamp, int touch_id, wl_fixed_t sx, wl_fixed_t sy);
+
+static void _data_offer_accept(struct wl_client *client EINA_UNUSED, struct 
wl_resource *resource, uint32_t serial, const char *mime_type);
+static void _data_offer_receive(struct wl_client *client EINA_UNUSED, struct 
wl_resource *resource, const char *mime_type, int32_t fd);
+static void _data_offer_destroy(struct wl_client *client EINA_UNUSED, struct 
wl_resource *resource);
+
+static void _destroy_data_offer(struct wl_resource *resource);
+static void _destroy_offer_data_source(struct wl_listener *listener, void 
*data EINA_UNUSED);
+
+static void _create_data_source(struct wl_client *client, struct wl_resource 
*resource, uint32_t id);
+static void _get_data_device(struct wl_client *client, struct wl_resource 
*manager_resource EINA_UNUSED, uint32_t id, struct wl_resource *seat_resource);
+
+static void _current_surface_destroy(struct wl_listener *listener, void *data 
EINA_UNUSED);
+static void _bind_manager(struct wl_client *client, void *data EINA_UNUSED, 
uint32_t version EINA_UNUSED, uint32_t id);
+
+static void _default_grab_key(struct wl_keyboard_grab *grab, uint32_t 
timestamp, uint32_t key, uint32_t state);
+static void _default_grab_modifiers(struct wl_keyboard_grab *grab, uint32_t 
serial, uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked, 
uint32_t group);
+
+static void _data_device_start_drag(struct wl_client *client, struct 
wl_resource *resource, struct wl_resource *source_resource, struct wl_resource 
*origin_resource EINA_UNUSED, struct wl_resource *icon_resource, uint32_t 
serial EINA_UNUSED);
+static void _data_device_set_selection(struct wl_client *client EINA_UNUSED, 
struct wl_resource *resource, struct wl_resource *source_resource, uint32_t 
serial);
+static void _destroy_data_device_icon(struct wl_listener *listener, void *data 
EINA_UNUSED);
+
+static void _destroy_selection_data_source(struct wl_listener *listener, void 
*data EINA_UNUSED);
+static void _data_source_offer(struct wl_client *client EINA_UNUSED, struct 
wl_resource *resource, const char *type);
+static void _data_source_destroy(struct wl_client *client EINA_UNUSED, struct 
wl_resource *resource);
+static void _destroy_data_source(struct wl_resource *resource);
+static void _destroy_data_device_source(struct wl_listener *listener, void 
*data EINA_UNUSED);
+static void _data_device_end_drag_grab(struct wl_seat *seat);
+
+static void _drag_grab_button(struct wl_pointer_grab *grab, uint32_t timestamp 
EINA_UNUSED, uint32_t button, uint32_t state_w);
+static void _drag_grab_motion(struct wl_pointer_grab *grab, uint32_t 
timestamp, wl_fixed_t x, wl_fixed_t y);
+
+static void _destroy_drag_focus(struct wl_listener *listener, void *data 
EINA_UNUSED);
+static void _drag_grab_focus(struct wl_pointer_grab *grab, struct wl_resource 
*surface, wl_fixed_t x, wl_fixed_t y);
+
+static void _client_source_accept(struct wl_data_source *source, uint32_t 
timestamp EINA_UNUSED, const char *mime_type);
+static void _client_source_send(struct wl_data_source *source, const char 
*mime_type, int32_t fd);
+static void _client_source_cancel(struct wl_data_source *source);
+
 static void _e_comp_wl_cb_bind(struct wl_client *client, void *data 
EINA_UNUSED, unsigned int version EINA_UNUSED, unsigned int id);
 static Eina_Bool _e_comp_wl_cb_read(void *data EINA_UNUSED, Ecore_Fd_Handler 
*hdl EINA_UNUSED);
 static Eina_Bool _e_comp_wl_cb_idle(void *data EINA_UNUSED);
@@ -96,6 +149,58 @@ static const struct wl_surface_interface 
_e_surface_interface =
    NULL // cb_buffer_transform_set
 };
 
+static const struct wl_pointer_grab_interface _e_pointer_grab_interface = 
+{
+   _default_grab_focus,
+   _default_grab_motion,
+   _default_grab_button
+};
+
+static const struct wl_keyboard_grab_interface 
_e_default_keyboard_grab_interface = 
+{
+   _default_grab_key,
+   _default_grab_modifiers,
+};
+
+static const struct wl_data_offer_interface _e_data_offer_interface = 
+{
+   _data_offer_accept,
+   _data_offer_receive,
+   _data_offer_destroy,
+};
+
+static const struct wl_data_device_manager_interface _e_manager_interface = 
+{
+   _create_data_source,
+   _get_data_device
+};
+
+static const struct wl_data_device_interface _e_data_device_interface = 
+{
+   _data_device_start_drag,
+   _data_device_set_selection,
+};
+
+static const struct wl_touch_grab_interface _e_default_touch_grab_interface = 
+{
+   _default_grab_touch_down,
+   _default_grab_touch_up,
+   _default_grab_touch_motion
+};
+
+static struct wl_data_source_interface _e_data_source_interface = 
+{
+   _data_source_offer,
+   _data_source_destroy
+};
+
+static const struct wl_pointer_grab_interface _e_drag_grab_interface = 
+{
+   _drag_grab_focus,
+   _drag_grab_motion,
+   _drag_grab_button,
+};
+
 /* local variables */
 static Ecore_Idler *_module_idler = NULL;
 
@@ -331,6 +436,394 @@ e_comp_wl_shutdown(void)
      e_module_disable(mod);
 }
 
+EAPI void 
+wl_seat_init(struct wl_seat *seat)
+{
+   memset(seat, 0, sizeof *seat);
+
+   wl_signal_init(&seat->destroy_signal);
+
+   seat->selection_data_source = NULL;
+   wl_list_init(&seat->base_resource_list);
+   wl_signal_init(&seat->selection_signal);
+   wl_list_init(&seat->drag_resource_list);
+   wl_signal_init(&seat->drag_icon_signal);
+}
+
+EAPI void 
+wl_seat_release(struct wl_seat *seat)
+{
+   wl_signal_emit(&seat->destroy_signal, seat);
+
+   if (seat->pointer) wl_pointer_release(seat->pointer);
+   if (seat->keyboard) wl_keyboard_release(seat->keyboard);
+   if (seat->touch) wl_touch_release(seat->touch);
+}
+
+EAPI void 
+wl_seat_set_pointer(struct wl_seat *seat, struct wl_pointer *pointer)
+{
+   if (pointer && (seat->pointer || pointer->seat)) return; /* XXX: error? */
+   if (!pointer && !seat->pointer) return;
+
+   seat->pointer = pointer;
+   if (pointer) pointer->seat = seat;
+
+   _seat_send_updated_caps(seat);
+}
+
+EAPI void 
+wl_seat_set_keyboard(struct wl_seat *seat, struct wl_keyboard *keyboard)
+{
+   if (keyboard && (seat->keyboard || keyboard->seat)) return; /* XXX: error? 
*/
+   if (!keyboard && !seat->keyboard) return;
+
+   seat->keyboard = keyboard;
+   if (keyboard) keyboard->seat = seat;
+
+   _seat_send_updated_caps(seat);
+}
+
+EAPI void 
+wl_seat_set_touch(struct wl_seat *seat, struct wl_touch *touch)
+{
+   if (touch && (seat->touch || touch->seat)) return; /* XXX: error? */
+   if (!touch && !seat->touch) return;
+
+   seat->touch = touch;
+   if (touch) touch->seat = seat;
+
+   _seat_send_updated_caps(seat);
+}
+
+EAPI void 
+wl_pointer_init(struct wl_pointer *pointer)
+{
+   memset(pointer, 0, sizeof *pointer);
+   wl_list_init(&pointer->resource_list);
+   pointer->focus_listener.notify = _lose_pointer_focus;
+   pointer->default_grab.interface = &_e_pointer_grab_interface;
+   pointer->default_grab.pointer = pointer;
+   pointer->grab = &pointer->default_grab;
+   wl_signal_init(&pointer->focus_signal);
+
+   pointer->x = wl_fixed_from_int(100);
+   pointer->y = wl_fixed_from_int(100);
+}
+
+EAPI void 
+wl_pointer_release(struct wl_pointer *pointer)
+{
+   if (pointer->focus_resource)
+     wl_list_remove(&pointer->focus_listener.link);
+}
+
+EAPI void 
+wl_pointer_set_focus(struct wl_pointer *pointer, struct wl_resource *surface, 
wl_fixed_t sx, wl_fixed_t sy)
+{
+   struct wl_keyboard *kbd = pointer->seat->keyboard;
+   struct wl_resource *resource, *kr;
+   uint32_t serial;
+
+   resource = pointer->focus_resource;
+   if (resource && pointer->focus != surface) 
+     {
+        struct wl_display *disp;
+
+        disp = wl_client_get_display(resource->client);
+        serial = wl_display_next_serial(disp);
+        wl_pointer_send_leave(resource, serial, pointer->focus);
+        wl_list_remove(&pointer->focus_listener.link);
+     }
+
+   resource = _find_resource_for_surface(&pointer->resource_list, surface);
+   if (resource &&
+       (pointer->focus != surface ||
+           pointer->focus_resource != resource)) 
+     {
+        struct wl_display *disp;
+
+        disp = wl_client_get_display(resource->client);
+        serial = wl_display_next_serial(disp);
+        if (kbd) 
+          {
+             kr = _find_resource_for_surface(&kbd->resource_list, surface);
+             if (kr) 
+               {
+                  wl_keyboard_send_modifiers(kr,
+                                             serial,
+                                             kbd->modifiers.mods_depressed,
+                                             kbd->modifiers.mods_latched,
+                                             kbd->modifiers.mods_locked,
+                                             kbd->modifiers.group);
+               }
+          }
+
+        wl_pointer_send_enter(resource, serial, surface, sx, sy);
+        wl_signal_add(&resource->destroy_signal, &pointer->focus_listener);
+        pointer->focus_serial = serial;
+     }
+
+   pointer->focus_resource = resource;
+   pointer->focus = surface;
+   pointer->default_grab.focus = surface;
+   wl_signal_emit(&pointer->focus_signal, pointer);
+}
+
+EAPI void 
+wl_pointer_start_grab(struct wl_pointer *pointer, struct wl_pointer_grab *grab)
+{
+   const struct wl_pointer_grab_interface *interface;
+
+   pointer->grab = grab;
+   interface = pointer->grab->interface;
+   grab->pointer = pointer;
+
+   if (pointer->current)
+     interface->focus(pointer->grab, pointer->current,
+                       pointer->current_x, pointer->current_y);
+}
+
+EAPI void 
+wl_pointer_end_grab(struct wl_pointer *pointer)
+{
+   const struct wl_pointer_grab_interface *interface;
+
+   pointer->grab = &pointer->default_grab;
+   interface = pointer->grab->interface;
+   interface->focus(pointer->grab, pointer->current,
+                    pointer->current_x, pointer->current_y);
+}
+
+EAPI void 
+wl_pointer_set_current(struct wl_pointer *pointer, struct wl_resource *surface)
+{
+   if (pointer->current)
+     wl_list_remove(&pointer->current_listener.link);
+
+   pointer->current = surface;
+
+   if (!surface) return;
+
+   wl_signal_add(&surface->destroy_signal, &pointer->current_listener);
+   pointer->current_listener.notify = _current_surface_destroy;
+}
+
+EAPI void 
+wl_keyboard_init(struct wl_keyboard *keyboard)
+{
+   memset(keyboard, 0, sizeof *keyboard);
+   wl_list_init(&keyboard->resource_list);
+   wl_array_init(&keyboard->keys);
+   keyboard->focus_listener.notify = _lose_keyboard_focus;
+   keyboard->default_grab.interface = &_e_default_keyboard_grab_interface;
+   keyboard->default_grab.keyboard = keyboard;
+   keyboard->grab = &keyboard->default_grab;
+   wl_signal_init(&keyboard->focus_signal);
+}
+
+EAPI void 
+wl_keyboard_release(struct wl_keyboard *keyboard)
+{
+   if (keyboard->focus_resource) 
+     wl_list_remove(&keyboard->focus_listener.link);
+   wl_array_release(&keyboard->keys);
+}
+
+EAPI void 
+wl_keyboard_set_focus(struct wl_keyboard *keyboard, struct wl_resource 
*surface)
+{
+   struct wl_resource *resource;
+   uint32_t serial;
+
+   if (keyboard->focus_resource && keyboard->focus != surface) 
+     {
+        struct wl_display *disp;
+
+        disp = wl_client_get_display(keyboard->focus_resource->client);
+        serial = wl_display_next_serial(disp);
+        resource = keyboard->focus_resource;
+        wl_keyboard_send_leave(resource, serial, keyboard->focus);
+        wl_list_remove(&keyboard->focus_listener.link);
+     }
+
+   resource = _find_resource_for_surface(&keyboard->resource_list,
+                                         surface);
+   if (resource &&
+       (keyboard->focus != surface ||
+           keyboard->focus_resource != resource)) 
+     {
+        struct wl_display *disp;
+
+        disp = wl_client_get_display(resource->client);
+        serial = wl_display_next_serial(disp);
+        wl_keyboard_send_modifiers(resource, serial,
+                                   keyboard->modifiers.mods_depressed,
+                                   keyboard->modifiers.mods_latched,
+                                   keyboard->modifiers.mods_locked,
+                                   keyboard->modifiers.group);
+        wl_keyboard_send_enter(resource, serial, surface, &keyboard->keys);
+        wl_signal_add(&resource->destroy_signal,
+                      &keyboard->focus_listener);
+        keyboard->focus_serial = serial;
+     }
+
+   keyboard->focus_resource = resource;
+   keyboard->focus = surface;
+   wl_signal_emit(&keyboard->focus_signal, keyboard);
+}
+
+EAPI void 
+wl_keyboard_start_grab(struct wl_keyboard *device, struct wl_keyboard_grab 
*grab)
+{
+   device->grab = grab;
+   grab->keyboard = device;
+}
+
+EAPI void 
+wl_keyboard_end_grab(struct wl_keyboard *keyboard)
+{
+   keyboard->grab = &keyboard->default_grab;
+}
+
+EAPI void 
+wl_touch_init(struct wl_touch *touch)
+{
+   memset(touch, 0, sizeof *touch);
+   wl_list_init(&touch->resource_list);
+   touch->focus_listener.notify = _lose_touch_focus;
+   touch->default_grab.interface = &_e_default_touch_grab_interface;
+   touch->default_grab.touch = touch;
+   touch->grab = &touch->default_grab;
+   wl_signal_init(&touch->focus_signal);
+}
+
+EAPI void 
+wl_touch_release(struct wl_touch *touch)
+{
+   if (touch->focus_resource)
+     wl_list_remove(&touch->focus_listener.link);
+}
+
+EAPI void 
+wl_touch_start_grab(struct wl_touch *device, struct wl_touch_grab *grab)
+{
+   device->grab = grab;
+   grab->touch = device;
+}
+
+EAPI void 
+wl_touch_end_grab(struct wl_touch *touch)
+{
+   touch->grab = &touch->default_grab;
+}
+
+EAPI void 
+wl_data_device_set_keyboard_focus(struct wl_seat *seat)
+{
+   struct wl_resource *data_device, *focus, *offer;
+   struct wl_data_source *source;
+
+   if (!seat->keyboard) return;
+
+   focus = seat->keyboard->focus_resource;
+   if (!focus) return;
+
+   data_device = 
+     _find_resource_for_client(&seat->drag_resource_list, focus->client);
+   if (!data_device) return;
+
+   source = seat->selection_data_source;
+   if (source) 
+     {
+        offer = wl_data_source_send_offer(source, data_device);
+        wl_data_device_send_selection(data_device, offer);
+     }
+}
+
+EAPI int 
+wl_data_device_manager_init(struct wl_display *display)
+{
+   if (wl_display_add_global(display,
+                             &wl_data_device_manager_interface,
+                             NULL, _bind_manager) == NULL)
+     return -1;
+   return 0;
+}
+
+EAPI struct wl_resource *
+wl_data_source_send_offer(struct wl_data_source *source, struct wl_resource 
*target)
+{
+   struct wl_data_offer *offer;
+   char **p;
+
+   offer = malloc(sizeof *offer);
+   if (offer == NULL) return NULL;
+
+   wl_resource_init(&offer->resource, &wl_data_offer_interface,
+                    &_e_data_offer_interface, 0, offer);
+   offer->resource.destroy = _destroy_data_offer;
+
+   offer->source = source;
+   offer->source_destroy_listener.notify = _destroy_offer_data_source;
+   wl_signal_add(&source->resource.destroy_signal,
+                 &offer->source_destroy_listener);
+
+   wl_client_add_resource(target->client, &offer->resource);
+   wl_data_device_send_data_offer(target, &offer->resource);
+   wl_array_for_each(p, &source->mime_types)
+     wl_data_offer_send_offer(&offer->resource, *p);
+
+   return &offer->resource;
+}
+
+EAPI void
+wl_seat_set_selection(struct wl_seat *seat, struct wl_data_source *source, 
uint32_t serial)
+{
+   struct wl_resource *data_device, *offer;
+   struct wl_resource *focus = NULL;
+
+   if (seat->selection_data_source &&
+       seat->selection_serial - serial < UINT32_MAX / 2)
+     return;
+
+   if (seat->selection_data_source) 
+     {
+        seat->selection_data_source->cancel(seat->selection_data_source);
+        wl_list_remove(&seat->selection_data_source_listener.link);
+        seat->selection_data_source = NULL;
+     }
+
+   seat->selection_data_source = source;
+   seat->selection_serial = serial;
+   if (seat->keyboard)
+     focus = seat->keyboard->focus_resource;
+   if (focus) 
+     {
+        data_device = _find_resource_for_client(&seat->drag_resource_list,
+                                                focus->client);
+        if (data_device && source) 
+          {
+             offer = wl_data_source_send_offer(seat->selection_data_source,
+                                               data_device);
+             wl_data_device_send_selection(data_device, offer);
+          }
+        else if (data_device) 
+          {
+             wl_data_device_send_selection(data_device, NULL);
+          }
+     }
+
+   wl_signal_emit(&seat->selection_signal, seat);
+   if (source) 
+     {
+        seat->selection_data_source_listener.notify =
+          _destroy_selection_data_source;
+        wl_signal_add(&source->resource.destroy_signal,
+                      &seat->selection_data_source_listener);
+     }
+}
+
 EAPI unsigned int 
 e_comp_wl_time_get(void)
 {
@@ -387,6 +880,553 @@ e_comp_wl_input_modifiers_update(unsigned int serial)
 }
 
 /* local functions */
+static void
+_seat_send_updated_caps(struct wl_seat *seat)
+{
+   struct wl_resource *r;
+   enum wl_seat_capability caps = 0;
+
+   if (seat->pointer)
+     caps |= WL_SEAT_CAPABILITY_POINTER;
+   if (seat->keyboard)
+     caps |= WL_SEAT_CAPABILITY_KEYBOARD;
+   if (seat->touch)
+     caps |= WL_SEAT_CAPABILITY_TOUCH;
+
+   wl_list_for_each(r, &seat->base_resource_list, link)
+     wl_seat_send_capabilities(r, caps);
+}
+
+static void
+_lose_pointer_focus(struct wl_listener *listener, void *data EINA_UNUSED)
+{
+   struct wl_pointer *pointer =
+     container_of(listener, struct wl_pointer, focus_listener);
+   pointer->focus_resource = NULL;
+}
+
+static void
+_lose_keyboard_focus(struct wl_listener *listener, void *data EINA_UNUSED)
+{
+   struct wl_keyboard *keyboard =
+     container_of(listener, struct wl_keyboard, focus_listener);
+   keyboard->focus_resource = NULL;
+}
+
+static void
+_lose_touch_focus(struct wl_listener *listener, void *data EINA_UNUSED)
+{
+   struct wl_touch *touch =
+     container_of(listener, struct wl_touch, focus_listener);
+   touch->focus_resource = NULL;
+}
+
+static struct wl_resource *
+_find_resource_for_surface(struct wl_list *list, struct wl_resource *surface)
+{
+   struct wl_resource *r;
+
+   if (!surface) return NULL;
+   wl_list_for_each(r, list, link) 
+     {
+        if (r->client == surface->client)
+          return r;
+     }
+
+   return NULL;
+}
+
+static struct wl_resource *
+_find_resource_for_client(struct wl_list *list, struct wl_client *client)
+{
+   struct wl_resource *r;
+
+   if (!client) return NULL;
+   wl_list_for_each(r, list, link) 
+     {
+        if (r->client == client)
+          return r;
+     }
+
+   return NULL;
+}
+
+static void
+_default_grab_focus(struct wl_pointer_grab *grab, struct wl_resource *surface, 
wl_fixed_t x, wl_fixed_t y)
+{
+   struct wl_pointer *pointer = grab->pointer;
+
+   if (pointer->button_count > 0) return;
+
+   wl_pointer_set_focus(pointer, surface, x, y);
+}
+
+static void
+_default_grab_motion(struct wl_pointer_grab *grab, uint32_t timestamp, 
wl_fixed_t x, wl_fixed_t y)
+{
+   struct wl_resource *resource;
+
+   resource = grab->pointer->focus_resource;
+   if (resource)
+     wl_pointer_send_motion(resource, timestamp, x, y);
+}
+
+static void
+_default_grab_button(struct wl_pointer_grab *grab, uint32_t timestamp, 
uint32_t button, uint32_t state_w)
+{
+   struct wl_pointer *pointer = grab->pointer;
+   struct wl_resource *resource;
+   uint32_t serial;
+   enum wl_pointer_button_state state = state_w;
+
+   resource = pointer->focus_resource;
+   if (resource) 
+     {
+        struct wl_display *disp;
+
+        disp = wl_client_get_display(resource->client);
+        serial = wl_display_next_serial(disp);
+        wl_pointer_send_button(resource, serial, timestamp, button, state_w);
+     }
+
+   if (pointer->button_count == 0 &&
+       state == WL_POINTER_BUTTON_STATE_RELEASED)
+     wl_pointer_set_focus(pointer, pointer->current,
+                          pointer->current_x, pointer->current_y);
+}
+
+static void 
+_default_grab_touch_down(struct wl_touch_grab *grab, uint32_t timestamp, int 
touch_id, wl_fixed_t sx, wl_fixed_t sy)
+{
+   struct wl_touch *touch = grab->touch;
+   uint32_t serial;
+
+   if (touch->focus_resource && touch->focus) 
+     {
+        struct wl_display *disp;
+
+        disp = wl_client_get_display(touch->focus_resource->client);
+        serial = wl_display_next_serial(disp);
+
+        wl_touch_send_down(touch->focus_resource, serial, timestamp,
+                           touch->focus, touch_id, sx, sy);
+     }
+}
+
+static void 
+_default_grab_touch_up(struct wl_touch_grab *grab, uint32_t timestamp, int 
touch_id)
+{
+   struct wl_touch *touch = grab->touch;
+   uint32_t serial;
+
+   if (touch->focus_resource) 
+     {
+        struct wl_display *disp;
+
+        disp = wl_client_get_display(touch->focus_resource->client);
+        serial = wl_display_next_serial(disp);
+
+        wl_touch_send_up(touch->focus_resource, serial, timestamp, touch_id);
+     }
+}
+
+static void 
+_default_grab_touch_motion(struct wl_touch_grab *grab, uint32_t timestamp, int 
touch_id, wl_fixed_t sx, wl_fixed_t sy)
+{
+   struct wl_touch *touch = grab->touch;
+
+   if (touch->focus_resource) 
+     {
+        wl_touch_send_motion(touch->focus_resource, timestamp,
+                             touch_id, sx, sy);
+     }
+}
+
+static void
+_data_offer_accept(struct wl_client *client EINA_UNUSED, struct wl_resource 
*resource, uint32_t serial, const char *mime_type)
+{
+   struct wl_data_offer *offer = resource->data;
+
+   if (offer->source)
+     offer->source->accept(offer->source, serial, mime_type);
+}
+
+static void
+_data_offer_receive(struct wl_client *client EINA_UNUSED, struct wl_resource 
*resource, const char *mime_type, int32_t fd)
+{
+   struct wl_data_offer *offer = resource->data;
+
+   if (offer->source)
+     offer->source->send(offer->source, mime_type, fd);
+   else
+     close(fd);
+}
+
+static void
+_data_offer_destroy(struct wl_client *client EINA_UNUSED, struct wl_resource 
*resource)
+{
+   wl_resource_destroy(resource);
+}
+
+static void
+_destroy_data_offer(struct wl_resource *resource)
+{
+   struct wl_data_offer *offer = resource->data;
+
+   if (offer->source)
+     wl_list_remove(&offer->source_destroy_listener.link);
+   free(offer);
+}
+
+static void
+_destroy_offer_data_source(struct wl_listener *listener, void *data 
EINA_UNUSED)
+{
+   struct wl_data_offer *offer;
+
+   offer = container_of(listener, struct wl_data_offer,
+                        source_destroy_listener);
+   offer->source = NULL;
+}
+
+static void
+_create_data_source(struct wl_client *client, struct wl_resource *resource, 
uint32_t id)
+{
+   struct wl_data_source *source;
+
+   source = malloc(sizeof *source);
+   if (source == NULL) 
+     {
+        wl_resource_post_no_memory(resource);
+        return;
+     }
+
+   wl_resource_init(&source->resource, &wl_data_source_interface,
+                    &_e_data_source_interface, id, source);
+   source->resource.destroy = _destroy_data_source;
+
+   source->accept = _client_source_accept;
+   source->send = _client_source_send;
+   source->cancel = _client_source_cancel;
+
+   wl_array_init(&source->mime_types);
+   wl_client_add_resource(client, &source->resource);
+}
+
+static void 
+_unbind_data_device(struct wl_resource *resource)
+{
+   wl_list_remove(&resource->link);
+   free(resource);
+}
+
+static void
+_get_data_device(struct wl_client *client, struct wl_resource 
*manager_resource EINA_UNUSED, uint32_t id, struct wl_resource *seat_resource)
+{
+   struct wl_seat *seat = seat_resource->data;
+   struct wl_resource *resource;
+
+   resource = wl_client_add_object(client, &wl_data_device_interface,
+                                   &_e_data_device_interface, id,
+                                   seat);
+
+   wl_list_insert(&seat->drag_resource_list, &resource->link);
+   resource->destroy = _unbind_data_device;
+}
+
+static void
+_current_surface_destroy(struct wl_listener *listener, void *data EINA_UNUSED)
+{
+   struct wl_pointer *pointer =
+     container_of(listener, struct wl_pointer, current_listener);
+   pointer->current = NULL;
+}
+
+static void
+_bind_manager(struct wl_client *client, void *data EINA_UNUSED, uint32_t 
version EINA_UNUSED, uint32_t id)
+{
+   wl_client_add_object(client, &wl_data_device_manager_interface,
+                        &_e_manager_interface, id, NULL);
+}
+
+static void
+_default_grab_key(struct wl_keyboard_grab *grab, uint32_t timestamp, uint32_t 
key, uint32_t state)
+{
+   struct wl_keyboard *keyboard = grab->keyboard;
+   struct wl_resource *resource;
+   uint32_t serial;
+
+   resource = keyboard->focus_resource;
+   if (resource) 
+     {
+        struct wl_display *disp;
+
+        disp = wl_client_get_display(resource->client);
+        serial = wl_display_next_serial(disp);
+        wl_keyboard_send_key(resource, serial, timestamp, key, state);
+     }
+}
+
+static void
+_default_grab_modifiers(struct wl_keyboard_grab *grab, uint32_t serial, 
uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked, uint32_t 
group)
+{
+   struct wl_keyboard *keyboard = grab->keyboard;
+   struct wl_pointer *pointer = keyboard->seat->pointer;
+   struct wl_resource *resource, *pr;
+
+   resource = keyboard->focus_resource;
+   if (!resource) return;
+
+   wl_keyboard_send_modifiers(resource, serial, mods_depressed,
+                              mods_latched, mods_locked, group);
+
+   if (pointer && pointer->focus && pointer->focus != keyboard->focus) 
+     {
+        pr = _find_resource_for_surface(&keyboard->resource_list,
+                                        pointer->focus);
+        if (pr) 
+          {
+             wl_keyboard_send_modifiers(pr,
+                                        serial,
+                                        keyboard->modifiers.mods_depressed,
+                                        keyboard->modifiers.mods_latched,
+                                        keyboard->modifiers.mods_locked,
+                                        keyboard->modifiers.group);
+          }
+     }
+}
+
+static void
+_data_device_start_drag(struct wl_client *client, struct wl_resource 
*resource, struct wl_resource *source_resource, struct wl_resource 
*origin_resource EINA_UNUSED, struct wl_resource *icon_resource, uint32_t 
serial EINA_UNUSED)
+{
+   struct wl_seat *seat = resource->data;
+
+   seat->drag_grab.interface = &_e_drag_grab_interface;
+   seat->drag_client = client;
+   seat->drag_data_source = NULL;
+
+   if (source_resource) 
+     {
+        seat->drag_data_source = source_resource->data;
+        seat->drag_data_source_listener.notify =
+          _destroy_data_device_source;
+        wl_signal_add(&source_resource->destroy_signal,
+                      &seat->drag_data_source_listener);
+       }
+
+   if (icon_resource) 
+     {
+        seat->drag_surface = icon_resource->data;
+        seat->drag_icon_listener.notify = _destroy_data_device_icon;
+        wl_signal_add(&icon_resource->destroy_signal,
+                      &seat->drag_icon_listener);
+        wl_signal_emit(&seat->drag_icon_signal, icon_resource);
+     }
+
+   wl_pointer_set_focus(seat->pointer, NULL,
+                        wl_fixed_from_int(0), wl_fixed_from_int(0));
+   wl_pointer_start_grab(seat->pointer, &seat->drag_grab);
+}
+
+static void
+_data_device_set_selection(struct wl_client *client EINA_UNUSED, struct 
wl_resource *resource, struct wl_resource *source_resource, uint32_t serial)
+{
+   if (!source_resource) return;
+   wl_seat_set_selection(resource->data, source_resource->data,
+                         serial);
+}
+
+static void
+_destroy_data_device_icon(struct wl_listener *listener, void *data EINA_UNUSED)
+{
+   struct wl_seat *seat = 
+     container_of(listener, struct wl_seat, drag_icon_listener);
+
+   seat->drag_surface = NULL;
+}
+
+static void
+_destroy_selection_data_source(struct wl_listener *listener, void *data 
EINA_UNUSED)
+{
+   struct wl_seat *seat = 
+     container_of(listener, struct wl_seat, selection_data_source_listener);
+   struct wl_resource *data_device;
+   struct wl_resource *focus = NULL;
+
+   seat->selection_data_source = NULL;
+
+   if (seat->keyboard)
+     focus = seat->keyboard->focus_resource;
+   if (focus) 
+     {
+        data_device = _find_resource_for_client(&seat->drag_resource_list,
+                                                focus->client);
+        if (data_device)
+          wl_data_device_send_selection(data_device, NULL);
+     }
+
+   wl_signal_emit(&seat->selection_signal, seat);
+}
+
+static void
+_destroy_data_device_source(struct wl_listener *listener, void *data 
EINA_UNUSED)
+{
+   struct wl_seat *seat = 
+     container_of(listener, struct wl_seat, drag_data_source_listener);
+   _data_device_end_drag_grab(seat);
+}
+
+static void
+_data_source_offer(struct wl_client *client EINA_UNUSED, struct wl_resource 
*resource, const char *type)
+{
+   struct wl_data_source *source = resource->data;
+   char **p;
+
+   p = wl_array_add(&source->mime_types, sizeof *p);
+   if (p) *p = strdup(type);
+
+   if (!p || !*p) wl_resource_post_no_memory(resource);
+}
+
+static void
+_data_source_destroy(struct wl_client *client EINA_UNUSED, struct wl_resource 
*resource)
+{
+   wl_resource_destroy(resource);
+}
+
+static void
+_destroy_data_source(struct wl_resource *resource)
+{
+   struct wl_data_source *source =
+     container_of(resource, struct wl_data_source, resource);
+   char **p;
+
+   wl_array_for_each(p, &source->mime_types)
+     free(*p);
+
+   wl_array_release(&source->mime_types);
+
+   source->resource.object.id = 0;
+}
+
+static void
+_data_device_end_drag_grab(struct wl_seat *seat)
+{
+   if (seat->drag_surface) 
+     {
+        seat->drag_surface = NULL;
+        wl_signal_emit(&seat->drag_icon_signal, NULL);
+        wl_list_remove(&seat->drag_icon_listener.link);
+     }
+
+   _drag_grab_focus(&seat->drag_grab, NULL,
+                    wl_fixed_from_int(0), wl_fixed_from_int(0));
+   wl_pointer_end_grab(seat->pointer);
+   seat->drag_data_source = NULL;
+   seat->drag_client = NULL;
+}
+
+static void
+_drag_grab_button(struct wl_pointer_grab *grab, uint32_t timestamp 
EINA_UNUSED, uint32_t button, uint32_t state_w)
+{
+   struct wl_seat *seat = container_of(grab, struct wl_seat, drag_grab);
+   enum wl_pointer_button_state state = state_w;
+
+   if (seat->drag_focus_resource &&
+       seat->pointer->grab_button == button &&
+       state == WL_POINTER_BUTTON_STATE_RELEASED)
+     wl_data_device_send_drop(seat->drag_focus_resource);
+
+   if (seat->pointer->button_count == 0 &&
+       state == WL_POINTER_BUTTON_STATE_RELEASED) 
+     {
+        if (seat->drag_data_source)
+          wl_list_remove(&seat->drag_data_source_listener.link);
+
+        _data_device_end_drag_grab(seat);
+     }
+}
+
+static void
+_drag_grab_motion(struct wl_pointer_grab *grab, uint32_t timestamp, wl_fixed_t 
x, wl_fixed_t y)
+{
+   struct wl_seat *seat = container_of(grab, struct wl_seat, drag_grab);
+
+   if (seat->drag_focus_resource)
+     wl_data_device_send_motion(seat->drag_focus_resource,
+                                timestamp, x, y);
+}
+
+static void
+_destroy_drag_focus(struct wl_listener *listener, void *data EINA_UNUSED)
+{
+   struct wl_seat *seat =
+     container_of(listener, struct wl_seat, drag_focus_listener);
+
+   seat->drag_focus_resource = NULL;
+}
+
+static void
+_drag_grab_focus(struct wl_pointer_grab *grab, struct wl_resource *surface, 
wl_fixed_t x, wl_fixed_t y)
+{
+   struct wl_seat *seat = container_of(grab, struct wl_seat, drag_grab);
+   struct wl_resource *resource, *offer = NULL;
+   struct wl_display *display;
+   uint32_t serial;
+
+   if (seat->drag_focus_resource) 
+     {
+        wl_data_device_send_leave(seat->drag_focus_resource);
+        wl_list_remove(&seat->drag_focus_listener.link);
+        seat->drag_focus_resource = NULL;
+        seat->drag_focus = NULL;
+     }
+
+   if (!surface) return;
+
+   if (!seat->drag_data_source &&
+       surface->client != seat->drag_client)
+     return;
+
+   resource = _find_resource_for_client(&seat->drag_resource_list,
+                                        surface->client);
+   if (!resource) return;
+
+   display = wl_client_get_display(resource->client);
+   serial = wl_display_next_serial(display);
+
+   if (seat->drag_data_source)
+     offer = wl_data_source_send_offer(seat->drag_data_source,
+                                       resource);
+
+   wl_data_device_send_enter(resource, serial, surface, x, y, offer);
+
+   seat->drag_focus = surface;
+   seat->drag_focus_listener.notify = _destroy_drag_focus;
+   wl_signal_add(&resource->destroy_signal,
+                 &seat->drag_focus_listener);
+   seat->drag_focus_resource = resource;
+   grab->focus = surface;
+}
+
+static void
+_client_source_accept(struct wl_data_source *source, uint32_t timestamp 
EINA_UNUSED, const char *mime_type)
+{
+   wl_data_source_send_target(&source->resource, mime_type);
+}
+
+static void
+_client_source_send(struct wl_data_source *source, const char *mime_type, 
int32_t fd)
+{
+   wl_data_source_send_send(&source->resource, mime_type, fd);
+   close(fd);
+}
+
+static void
+_client_source_cancel(struct wl_data_source *source)
+{
+   wl_data_source_send_cancelled(&source->resource);
+}
+
 static void 
 _e_comp_wl_cb_bind(struct wl_client *client, void *data EINA_UNUSED, unsigned 
int version EINA_UNUSED, unsigned int id)
 {
@@ -455,8 +1495,6 @@ _e_comp_wl_cb_keymap_changed(void *data EINA_UNUSED, int 
type EINA_UNUSED, void
 {
    struct xkb_keymap *keymap;
 
-   printf("Kbd Changed\n");
-
    /* try to fetch the keymap */
    if (!(keymap = _e_comp_wl_input_keymap_get())) 
      return ECORE_CALLBACK_PASS_ON;
@@ -529,7 +1567,7 @@ _e_comp_wl_cb_surface_create(struct wl_client *client, 
struct wl_resource *resou
      }
 
    /* initialize the destroy signal */
-   wl_signal_init(&ews->wl.surface.resource.destroy_signal);
+   wl_signal_init(&ews->wl.surface.destroy_signal);
 
    /* initialize the link */
    wl_list_init(&ews->wl.link);
@@ -538,7 +1576,7 @@ _e_comp_wl_cb_surface_create(struct wl_client *client, 
struct wl_resource *resou
    wl_list_init(&ews->wl.frames);
    wl_list_init(&ews->pending.frames);
 
-   ews->wl.surface.resource.client = NULL;
+   ews->wl.surface.client = NULL;
 
    /* set destroy function for pending buffers */
    ews->pending.buffer_destroy.notify = 
@@ -558,15 +1596,15 @@ _e_comp_wl_cb_surface_create(struct wl_client *client, 
struct wl_resource *resou
                              UINT32_MAX, UINT32_MAX);
 
    /* set some properties of the surface */
-   ews->wl.surface.resource.destroy = _e_comp_wl_cb_surface_destroy;
-   ews->wl.surface.resource.object.id = id;
-   ews->wl.surface.resource.object.interface = &wl_surface_interface;
-   ews->wl.surface.resource.object.implementation = 
+   ews->wl.surface.destroy = _e_comp_wl_cb_surface_destroy;
+   ews->wl.surface.object.id = id;
+   ews->wl.surface.object.interface = &wl_surface_interface;
+   ews->wl.surface.object.implementation = 
      (void (**)(void))&_e_surface_interface;
-   ews->wl.surface.resource.data = ews;
+   ews->wl.surface.data = ews;
 
    /* add this surface to the client */
-   wl_client_add_resource(client, &ews->wl.surface.resource);
+   wl_client_add_resource(client, &ews->wl.surface);
 
    /* add this surface to the list of surfaces */
    _e_wl_comp->surfaces = eina_list_append(_e_wl_comp->surfaces, ews);
@@ -579,7 +1617,7 @@ _e_comp_wl_cb_surface_destroy(struct wl_resource *resource)
    E_Wayland_Surface_Frame_Callback *cb = NULL, *ncb = NULL;
 
    /* try to get the surface from this resource */
-   if (!(ews = container_of(resource, E_Wayland_Surface, wl.surface.resource)))
+   if (!(ews = container_of(resource, E_Wayland_Surface, wl.surface)))
      return;
 
    /* if this surface is mapped, unmap it */
@@ -1001,7 +2039,7 @@ _e_comp_wl_input_cb_pointer_get(struct wl_client *client, 
struct wl_resource *re
 
    /* if the pointer has a focused surface, set it */
    if ((input->wl.seat.pointer->focus) && 
-       (input->wl.seat.pointer->focus->resource.client == client))
+       (input->wl.seat.pointer->focus->client == client))
      {
         /* tell pointer which surface is focused */
         wl_pointer_set_focus(input->wl.seat.pointer, 
@@ -1036,7 +2074,7 @@ _e_comp_wl_input_cb_keyboard_get(struct wl_client 
*client, struct wl_resource *r
 
    /* test if keyboard has a focused client */
    if ((input->wl.seat.keyboard->focus) && 
-       (input->wl.seat.keyboard->focus->resource.client == client))
+       (input->wl.seat.keyboard->focus->client == client))
      {
         /* set keyboard focus */
         wl_keyboard_set_focus(input->wl.seat.keyboard, 
@@ -1188,7 +2226,7 @@ _e_comp_wl_pointer_cb_cursor_set(struct wl_client 
*client, struct wl_resource *r
    /* if the input has no current focus, get out */
    if (!input->wl.seat.pointer->focus) return;
 
-   if (input->wl.seat.pointer->focus->resource.client != client) return;
+   if (input->wl.seat.pointer->focus->client != client) return;
    if ((input->wl.seat.pointer->focus_serial - serial) > (UINT32_MAX / 2))
      return;
 
@@ -1197,7 +2235,7 @@ _e_comp_wl_pointer_cb_cursor_set(struct wl_client 
*client, struct wl_resource *r
      {
         if (ews->configure)
           {
-             wl_resource_post_error(&ews->wl.surface.resource, 
+             wl_resource_post_error(&ews->wl.surface, 
                                     WL_DISPLAY_ERROR_INVALID_OBJECT, 
                                     "Surface already configured");
              return;
@@ -1218,7 +2256,7 @@ _e_comp_wl_pointer_cb_cursor_set(struct wl_client 
*client, struct wl_resource *r
    if (!ews) return;
 
    /* set the destroy listener */
-   wl_signal_add(&ews->wl.surface.resource.destroy_signal, 
+   wl_signal_add(&ews->wl.surface.destroy_signal, 
                  &input->pointer.surface_destroy);
 
    /* set some properties on this surface */
diff --git a/src/bin/e_comp_wl.h b/src/bin/e_comp_wl.h
index 7b91840..ec2bba0 100644
--- a/src/bin/e_comp_wl.h
+++ b/src/bin/e_comp_wl.h
@@ -49,6 +49,176 @@ typedef struct _E_Wayland_Output_Mode E_Wayland_Output_Mode;
 typedef struct _E_Wayland_Terminal E_Wayland_Terminal;
 typedef struct _E_Wayland_Plane E_Wayland_Plane;
 
+/*
+ * NB: All of these structs and interfaces were recently removed from 
+ * wayland so for now, reimplement them here 
+ */
+struct wl_seat;
+struct wl_pointer;
+struct wl_keyboard;
+struct wl_touch;
+
+struct wl_pointer_grab;
+struct wl_pointer_grab_interface 
+{
+   void (*focus)(struct wl_pointer_grab *grab, struct wl_resource *surface, 
wl_fixed_t x, wl_fixed_t y);
+   void (*motion)(struct wl_pointer_grab *grab, unsigned int timestamp, 
wl_fixed_t x, wl_fixed_t y);
+   void (*button)(struct wl_pointer_grab *grab, unsigned int timestamp, 
unsigned int button, unsigned int state);
+};
+struct wl_pointer_grab
+{
+   const struct wl_pointer_grab_interface *interface;
+   struct wl_pointer *pointer;
+   struct wl_resource *focus;
+   wl_fixed_t x, y;
+};
+
+struct wl_keyboard_grab;
+struct wl_keyboard_grab_interface
+{
+   void (*key)(struct wl_keyboard_grab *grab, unsigned int timestamp, unsigned 
int key, unsigned int state);
+   void (*modifiers)(struct wl_keyboard_grab *grab, unsigned int serial, 
unsigned int mods_depressed, unsigned int mods_latched, unsigned int 
mods_locked, unsigned int group);
+};
+struct wl_keyboard_grab
+{
+   const struct wl_keyboard_grab_interface *interface;
+   struct wl_keyboard *keyboard;
+   struct wl_resource *focus;
+   unsigned int key;
+};
+
+struct wl_touch_grab;
+struct wl_touch_grab_interface 
+{
+   void (*down)(struct wl_touch_grab *grab, unsigned int timestamp, int 
touch_id, wl_fixed_t sx, wl_fixed_t sy);
+   void (*up)(struct wl_touch_grab *grab, unsigned int timestamp, int 
touch_id);
+   void (*motion)(struct wl_touch_grab *grab, unsigned int timestamp, int 
touch_id, wl_fixed_t sx, wl_fixed_t sy);
+};
+struct wl_touch_grab
+{
+   const struct wl_touch_grab_interface *interface;
+   struct wl_touch *touch;
+   struct wl_resource *focus;
+};
+
+struct wl_pointer 
+{
+   struct wl_seat *seat;
+
+   struct wl_list resource_list;
+   struct wl_resource *focus;
+   struct wl_resource *focus_resource;
+   struct wl_listener focus_listener;
+   unsigned int focus_serial;
+   struct wl_signal focus_signal;
+
+   struct wl_pointer_grab *grab;
+   struct wl_pointer_grab default_grab;
+   wl_fixed_t grab_x, grab_y;
+   unsigned int grab_button;
+   unsigned int grab_serial;
+   unsigned int grab_time;
+
+   wl_fixed_t x, y;
+   struct wl_resource *current;
+   struct wl_listener current_listener;
+   wl_fixed_t current_x, current_y;
+
+   unsigned int button_count;
+};
+
+struct wl_keyboard 
+{
+   struct wl_seat *seat;
+
+   struct wl_list resource_list;
+   struct wl_resource *focus;
+   struct wl_resource *focus_resource;
+   struct wl_listener focus_listener;
+   unsigned int focus_serial;
+   struct wl_signal focus_signal;
+
+   struct wl_keyboard_grab *grab;
+   struct wl_keyboard_grab default_grab;
+   unsigned int grab_key;
+   unsigned int grab_serial;
+   unsigned int grab_time;
+
+   struct wl_array keys;
+
+   struct 
+     {
+        unsigned int mods_depressed;
+        unsigned int mods_latched;
+        unsigned int mods_locked;
+        unsigned int group;
+     } modifiers;
+};
+
+struct wl_touch 
+{
+   struct wl_seat *seat;
+
+   struct wl_list resource_list;
+   struct wl_resource *focus;
+   struct wl_resource *focus_resource;
+   struct wl_listener focus_listener;
+   unsigned int focus_serial;
+   struct wl_signal focus_signal;
+
+   struct wl_touch_grab *grab;
+   struct wl_touch_grab default_grab;
+   wl_fixed_t grab_x, grab_y;
+   unsigned int grab_serial;
+   unsigned int grab_time;
+};
+
+struct wl_data_offer 
+{
+   struct wl_resource resource;
+   struct wl_data_source *source;
+   struct wl_listener source_destroy_listener;
+};
+
+struct wl_data_source 
+{
+   struct wl_resource resource;
+   struct wl_array mime_types;
+
+   void (*accept)(struct wl_data_source *source,
+                  uint32_t serial, const char *mime_type);
+   void (*send)(struct wl_data_source *source,
+                const char *mime_type, int32_t fd);
+   void (*cancel)(struct wl_data_source *source);
+};
+
+struct wl_seat 
+{
+   struct wl_list base_resource_list;
+   struct wl_signal destroy_signal;
+
+   struct wl_pointer *pointer;
+   struct wl_keyboard *keyboard;
+   struct wl_touch *touch;
+
+   unsigned int selection_serial;
+   struct wl_data_source *selection_data_source;
+   struct wl_listener selection_data_source_listener;
+   struct wl_signal selection_signal;
+
+   struct wl_list drag_resource_list;
+   struct wl_client *drag_client;
+   struct wl_data_source *drag_data_source;
+   struct wl_listener drag_data_source_listener;
+   struct wl_resource *drag_focus;
+   struct wl_resource *drag_focus_resource;
+   struct wl_listener drag_focus_listener;
+   struct wl_pointer_grab drag_grab;
+   struct wl_resource *drag_surface;
+   struct wl_listener drag_icon_listener;
+   struct wl_signal drag_icon_signal;
+};
+
 enum _E_Wayland_Shell_Surface_Type
 {
    E_WAYLAND_SHELL_SURFACE_TYPE_NONE,
@@ -82,7 +252,8 @@ struct _E_Wayland_Surface
 {
    struct 
      {
-        struct wl_surface surface;
+        struct wl_resource surface;
+        /* struct wl_surface surface; */
         struct wl_list link, frames;
      } wl;
 
@@ -391,6 +562,36 @@ extern E_Wayland_Compositor *_e_wl_comp;
 EINTERN Eina_Bool e_comp_wl_init(void);
 EINTERN void e_comp_wl_shutdown(void);
 
+EAPI void wl_seat_init(struct wl_seat *seat);
+EAPI void wl_seat_release(struct wl_seat *seat);
+
+EAPI void wl_seat_set_pointer(struct wl_seat *seat, struct wl_pointer 
*pointer);
+EAPI void wl_seat_set_keyboard(struct wl_seat *seat, struct wl_keyboard 
*keyboard);
+EAPI void wl_seat_set_touch(struct wl_seat *seat, struct wl_touch *touch);
+
+EAPI void wl_pointer_init(struct wl_pointer *pointer);
+EAPI void wl_pointer_release(struct wl_pointer *pointer);
+EAPI void wl_pointer_set_focus(struct wl_pointer *pointer, struct wl_resource 
*surface, wl_fixed_t sx, wl_fixed_t sy);
+EAPI void wl_pointer_start_grab(struct wl_pointer *pointer, struct 
wl_pointer_grab *grab);
+EAPI void wl_pointer_end_grab(struct wl_pointer *pointer);
+EAPI void wl_pointer_set_current(struct wl_pointer *pointer, struct 
wl_resource *surface);
+
+EAPI void wl_keyboard_init(struct wl_keyboard *keyboard);
+EAPI void wl_keyboard_release(struct wl_keyboard *keyboard);
+EAPI void wl_keyboard_set_focus(struct wl_keyboard *keyboard, struct 
wl_resource *surface);
+EAPI void wl_keyboard_start_grab(struct wl_keyboard *device, struct 
wl_keyboard_grab *grab);
+EAPI void wl_keyboard_end_grab(struct wl_keyboard *keyboard);
+
+EAPI void wl_touch_init(struct wl_touch *touch);
+EAPI void wl_touch_release(struct wl_touch *touch);
+EAPI void wl_touch_start_grab(struct wl_touch *device, struct wl_touch_grab 
*grab);
+EAPI void wl_touch_end_grab(struct wl_touch *touch);
+
+EAPI void wl_data_device_set_keyboard_focus(struct wl_seat *seat);
+EAPI int wl_data_device_manager_init(struct wl_display *display);
+EAPI struct wl_resource *wl_data_source_send_offer(struct wl_data_source 
*source, struct wl_resource *target);
+EAPI void wl_seat_set_selection(struct wl_seat *seat, struct wl_data_source 
*source, uint32_t serial);
+
 EAPI unsigned int e_comp_wl_time_get(void);
 EAPI void e_comp_wl_input_modifiers_update(unsigned int serial);
 
diff --git a/src/modules/wl_desktop_shell/e_mod_main.c 
b/src/modules/wl_desktop_shell/e_mod_main.c
index 43be87e..3d099d5 100644
--- a/src/modules/wl_desktop_shell/e_mod_main.c
+++ b/src/modules/wl_desktop_shell/e_mod_main.c
@@ -67,17 +67,17 @@ static void _e_wl_shell_shell_surface_cb_title_set(struct 
wl_client *client EINA
 static void _e_wl_shell_shell_surface_cb_class_set(struct wl_client *client 
EINA_UNUSED, struct wl_resource *resource, const char *clas);
 
 /* shell move_grab interface prototypes */
-static void _e_wl_shell_move_grab_cb_focus(struct wl_pointer_grab *grab, 
struct wl_surface *surface EINA_UNUSED, wl_fixed_t x EINA_UNUSED, wl_fixed_t y 
EINA_UNUSED);
+static void _e_wl_shell_move_grab_cb_focus(struct wl_pointer_grab *grab, 
struct wl_resource *surface EINA_UNUSED, wl_fixed_t x EINA_UNUSED, wl_fixed_t y 
EINA_UNUSED);
 static void _e_wl_shell_move_grab_cb_motion(struct wl_pointer_grab *grab, 
unsigned int timestamp EINA_UNUSED, wl_fixed_t x, wl_fixed_t y);
 static void _e_wl_shell_move_grab_cb_button(struct wl_pointer_grab *grab, 
unsigned int timestamp EINA_UNUSED, unsigned int button EINA_UNUSED, unsigned 
int state);
 
 /* shell resize_grab interface prototypes */
-static void _e_wl_shell_resize_grab_cb_focus(struct wl_pointer_grab *grab, 
struct wl_surface *surface EINA_UNUSED, wl_fixed_t x EINA_UNUSED, wl_fixed_t y 
EINA_UNUSED);
+static void _e_wl_shell_resize_grab_cb_focus(struct wl_pointer_grab *grab, 
struct wl_resource *surface EINA_UNUSED, wl_fixed_t x EINA_UNUSED, wl_fixed_t y 
EINA_UNUSED);
 static void _e_wl_shell_resize_grab_cb_motion(struct wl_pointer_grab *grab 
EINA_UNUSED, unsigned int timestamp EINA_UNUSED, wl_fixed_t x EINA_UNUSED, 
wl_fixed_t y EINA_UNUSED);
 static void _e_wl_shell_resize_grab_cb_button(struct wl_pointer_grab *grab, 
unsigned int timestamp EINA_UNUSED, unsigned int button EINA_UNUSED, unsigned 
int state);
 
 /* shell popup_grab interface prototypes */
-static void _e_wl_shell_popup_grab_cb_focus(struct wl_pointer_grab *grab, 
struct wl_surface *surface, wl_fixed_t x, wl_fixed_t y);
+static void _e_wl_shell_popup_grab_cb_focus(struct wl_pointer_grab *grab, 
struct wl_resource *surface, wl_fixed_t x, wl_fixed_t y);
 static void _e_wl_shell_popup_grab_cb_motion(struct wl_pointer_grab *grab 
EINA_UNUSED, unsigned int timestamp EINA_UNUSED, wl_fixed_t x EINA_UNUSED, 
wl_fixed_t y EINA_UNUSED);
 static void _e_wl_shell_popup_grab_cb_button(struct wl_pointer_grab *grab, 
unsigned int timestamp, unsigned int button, unsigned int state);
 
@@ -85,7 +85,7 @@ static void _e_wl_shell_popup_grab_cb_button(struct 
wl_pointer_grab *grab, unsig
 static void _e_wl_shell_popup_grab_end(struct wl_pointer *pointer);
 
 /* shell busy_grab interface prototypes */
-static void _e_wl_shell_busy_grab_cb_focus(struct wl_pointer_grab *grab, 
struct wl_surface *surface, wl_fixed_t x EINA_UNUSED, wl_fixed_t y EINA_UNUSED);
+static void _e_wl_shell_busy_grab_cb_focus(struct wl_pointer_grab *grab, 
struct wl_resource *surface, wl_fixed_t x EINA_UNUSED, wl_fixed_t y 
EINA_UNUSED);
 static void _e_wl_shell_busy_grab_cb_motion(struct wl_pointer_grab *grab 
EINA_UNUSED, unsigned int timestamp EINA_UNUSED, wl_fixed_t x EINA_UNUSED, 
wl_fixed_t y EINA_UNUSED);
 static void _e_wl_shell_busy_grab_cb_button(struct wl_pointer_grab *grab, 
unsigned int timestamp EINA_UNUSED, unsigned int button, unsigned int state);
 
@@ -514,7 +514,7 @@ _e_wl_shell_shell_surface_create(void *shell EINA_UNUSED, 
E_Wayland_Surface *ews
    /* setup shell surface destroy */
    wl_signal_init(&ewss->wl.resource.destroy_signal);
    ewss->wl.surface_destroy.notify = _e_wl_shell_shell_surface_cb_destroy;
-   wl_signal_add(&ews->wl.surface.resource.destroy_signal, 
+   wl_signal_add(&ews->wl.surface.destroy_signal, 
                  &ewss->wl.surface_destroy);
 
    wl_list_init(&ewss->wl.link);
@@ -1925,7 +1925,7 @@ _e_wl_shell_shell_surface_cb_class_set(struct wl_client 
*client EINA_UNUSED, str
 
 /* shell move_grab interface functions */
 static void 
-_e_wl_shell_move_grab_cb_focus(struct wl_pointer_grab *grab, struct wl_surface 
*surface EINA_UNUSED, wl_fixed_t x EINA_UNUSED, wl_fixed_t y EINA_UNUSED)
+_e_wl_shell_move_grab_cb_focus(struct wl_pointer_grab *grab, struct 
wl_resource *surface EINA_UNUSED, wl_fixed_t x EINA_UNUSED, wl_fixed_t y 
EINA_UNUSED)
 {
    /* safety */
    if (!grab) return;
@@ -2001,7 +2001,7 @@ _e_wl_shell_move_grab_cb_button(struct wl_pointer_grab 
*grab, unsigned int times
 
 /* shell resize_grab interface functions */
 static void 
-_e_wl_shell_resize_grab_cb_focus(struct wl_pointer_grab *grab, struct 
wl_surface *surface EINA_UNUSED, wl_fixed_t x EINA_UNUSED, wl_fixed_t y 
EINA_UNUSED)
+_e_wl_shell_resize_grab_cb_focus(struct wl_pointer_grab *grab, struct 
wl_resource *surface EINA_UNUSED, wl_fixed_t x EINA_UNUSED, wl_fixed_t y 
EINA_UNUSED)
 {
    /* safety */
    if (!grab) return;
@@ -2077,7 +2077,7 @@ _e_wl_shell_resize_grab_cb_button(struct wl_pointer_grab 
*grab, unsigned int tim
 
 /* shell popup_grab interface prototypes */
 static void 
-_e_wl_shell_popup_grab_cb_focus(struct wl_pointer_grab *grab, struct 
wl_surface *surface, wl_fixed_t x, wl_fixed_t y)
+_e_wl_shell_popup_grab_cb_focus(struct wl_pointer_grab *grab, struct 
wl_resource *surface, wl_fixed_t x, wl_fixed_t y)
 {
    E_Wayland_Shell_Surface *ewss;
    struct wl_pointer *ptr;
@@ -2090,9 +2090,9 @@ _e_wl_shell_popup_grab_cb_focus(struct wl_pointer_grab 
*grab, struct wl_surface
    ewss = container_of(grab, E_Wayland_Shell_Surface, popup.grab);
    if (!ewss) return;
 
-   client = ewss->surface->wl.surface.resource.client;
+   client = ewss->surface->wl.surface.client;
 
-   if ((surface) && (surface->resource.client == client))
+   if ((surface) && (surface->client == client))
      {
         wl_pointer_set_focus(ptr, surface, x, y);
         grab->focus = surface;
@@ -2168,7 +2168,7 @@ _e_wl_shell_popup_grab_end(struct wl_pointer *pointer)
 
 /* shell busy_grab interface functions */
 static void 
-_e_wl_shell_busy_grab_cb_focus(struct wl_pointer_grab *grab, struct wl_surface 
*surface, wl_fixed_t x EINA_UNUSED, wl_fixed_t y EINA_UNUSED)
+_e_wl_shell_busy_grab_cb_focus(struct wl_pointer_grab *grab, struct 
wl_resource *surface, wl_fixed_t x EINA_UNUSED, wl_fixed_t y EINA_UNUSED)
 {
    E_Wayland_Shell_Grab *ewsg = NULL;
 

-- 

------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and 
their applications. This 200-page book is written by three acclaimed 
leaders in the field. The early access version is available now. 
Download your free book today! http://p.sf.net/sfu/neotech_d2d_may

Reply via email to