[mutter] wayland: Make seat devices GObjects



commit e5a359a032f7ae572efeb3a7c2232a40de395d0d
Author: Jonas Ådahl <jadahl gmail com>
Date:   Fri Apr 1 16:39:30 2016 +0800

    wayland: Make seat devices GObjects
    
    This will make it possible to add signals and other GObject features.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=771050

 src/core/display.c                               |    2 +-
 src/wayland/meta-pointer-confinement-wayland.c   |    2 +-
 src/wayland/meta-wayland-data-device.c           |   47 ++++++++--------
 src/wayland/meta-wayland-keyboard.c              |   39 +++++++++-----
 src/wayland/meta-wayland-keyboard.h              |   17 +++++--
 src/wayland/meta-wayland-pointer-constraints.c   |    6 +-
 src/wayland/meta-wayland-pointer-gesture-pinch.c |    5 +-
 src/wayland/meta-wayland-pointer-gesture-swipe.c |    5 +-
 src/wayland/meta-wayland-pointer.c               |   32 +++++++----
 src/wayland/meta-wayland-pointer.h               |   14 ++++--
 src/wayland/meta-wayland-popup.c                 |    4 +-
 src/wayland/meta-wayland-seat.c                  |   64 +++++++++++++---------
 src/wayland/meta-wayland-seat.h                  |    7 ++-
 src/wayland/meta-wayland-tablet-seat.c           |    2 +-
 src/wayland/meta-wayland-touch.c                 |   28 +++++++---
 src/wayland/meta-wayland-touch.h                 |   17 +++++--
 src/wayland/meta-wayland-wl-shell.c              |    2 +-
 src/wayland/meta-wayland-xdg-shell.c             |    5 +-
 src/wayland/meta-wayland.c                       |    2 +-
 src/wayland/meta-xwayland-selection.c            |   14 +++---
 20 files changed, 193 insertions(+), 121 deletions(-)
---
diff --git a/src/core/display.c b/src/core/display.c
index 46a12c3..42a530f 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -505,7 +505,7 @@ meta_display_cancel_touch (MetaDisplay *display)
     return;
 
   compositor = meta_wayland_compositor_get_default ();
-  meta_wayland_touch_cancel (&compositor->seat->touch);
+  meta_wayland_touch_cancel (compositor->seat->touch);
 #endif
 }
 
diff --git a/src/wayland/meta-pointer-confinement-wayland.c b/src/wayland/meta-pointer-confinement-wayland.c
index 8eb7d1a..293200c 100644
--- a/src/wayland/meta-pointer-confinement-wayland.c
+++ b/src/wayland/meta-pointer-confinement-wayland.c
@@ -620,7 +620,7 @@ meta_pointer_confinement_wayland_maybe_warp (MetaPointerConfinementWayland *self
   seat = meta_wayland_pointer_constraint_get_seat (self->constraint);
   surface = meta_wayland_pointer_constraint_get_surface (self->constraint);
 
-  clutter_input_device_get_coords (seat->pointer.device, NULL, &point);
+  clutter_input_device_get_coords (seat->pointer->device, NULL, &point);
   meta_wayland_surface_get_relative_coordinates (surface,
                                                  point.x, point.y,
                                                  &sx, &sy);
diff --git a/src/wayland/meta-wayland-data-device.c b/src/wayland/meta-wayland-data-device.c
index fbc42ec..30ec571 100644
--- a/src/wayland/meta-wayland-data-device.c
+++ b/src/wayland/meta-wayland-data-device.c
@@ -465,7 +465,7 @@ primary_offer_receive (struct wl_client *client, struct wl_resource *resource,
   seat = meta_wayland_data_source_get_seat (source);
 
   if (wl_resource_get_client (offer->resource) !=
-      meta_wayland_keyboard_get_focus_client (&seat->keyboard))
+      meta_wayland_keyboard_get_focus_client (seat->keyboard))
     {
       close (fd);
       return;
@@ -979,7 +979,7 @@ drag_grab_button (MetaWaylandPointerGrab *grab,
       drag_grab->feedback_actor = NULL;
     }
 
-  if (seat->pointer.button_count == 0 &&
+  if (seat->pointer->button_count == 0 &&
       event_type == CLUTTER_BUTTON_RELEASE)
     data_device_end_drag_grab (drag_grab);
 }
@@ -1073,10 +1073,10 @@ meta_wayland_data_device_start_drag (MetaWaylandDataDevice                 *data
   data_device->current_grab = drag_grab = g_slice_new0 (MetaWaylandDragGrab);
 
   drag_grab->generic.interface = funcs;
-  drag_grab->generic.pointer = &seat->pointer;
+  drag_grab->generic.pointer = seat->pointer;
 
   drag_grab->keyboard_grab.interface = &keyboard_drag_grab_interface;
-  drag_grab->keyboard_grab.keyboard = &seat->keyboard;
+  drag_grab->keyboard_grab.keyboard = seat->keyboard;
 
   drag_grab->drag_client = client;
   drag_grab->seat = seat;
@@ -1087,15 +1087,15 @@ meta_wayland_data_device_start_drag (MetaWaylandDataDevice                 *data
                                     &drag_grab->drag_origin_listener);
 
   clutter_actor_transform_stage_point (CLUTTER_ACTOR (meta_surface_actor_get_texture 
(surface->surface_actor)),
-                                       seat->pointer.grab_x,
-                                       seat->pointer.grab_y,
+                                       seat->pointer->grab_x,
+                                       seat->pointer->grab_y,
                                        &surface_pos.x, &surface_pos.y);
   drag_grab->drag_start_x = surface_pos.x;
   drag_grab->drag_start_y = surface_pos.y;
 
   drag_grab->need_initial_focus = TRUE;
 
-  modifiers = clutter_input_device_get_modifier_state (seat->pointer.device);
+  modifiers = clutter_input_device_get_modifier_state (seat->pointer->device);
   drag_grab->buttons = modifiers &
     (CLUTTER_BUTTON1_MASK | CLUTTER_BUTTON2_MASK | CLUTTER_BUTTON3_MASK |
      CLUTTER_BUTTON4_MASK | CLUTTER_BUTTON5_MASK);
@@ -1121,12 +1121,13 @@ meta_wayland_data_device_start_drag (MetaWaylandDataDevice                 *data
       clutter_actor_add_child (drag_grab->feedback_actor,
                                CLUTTER_ACTOR (drag_grab->drag_surface->surface_actor));
 
-      clutter_input_device_get_coords (seat->pointer.device, NULL, &pos);
+      clutter_input_device_get_coords (seat->pointer->device, NULL, &pos);
       meta_feedback_actor_set_position (META_FEEDBACK_ACTOR (drag_grab->feedback_actor),
                                         pos.x, pos.y);
     }
 
-  meta_wayland_pointer_start_grab (&seat->pointer, (MetaWaylandPointerGrab*) drag_grab);
+  meta_wayland_pointer_start_grab (seat->pointer,
+                                   (MetaWaylandPointerGrab*) drag_grab);
   meta_wayland_data_source_set_seat (source, seat);
 }
 
@@ -1155,16 +1156,16 @@ data_device_start_drag (struct wl_client *client,
   if (!surface)
     return;
 
-  if (seat->pointer.button_count == 0 ||
-      seat->pointer.grab_serial != serial ||
-      !seat->pointer.focus_surface ||
-      seat->pointer.focus_surface != surface)
+  if (seat->pointer->button_count == 0 ||
+      seat->pointer->grab_serial != serial ||
+      !seat->pointer->focus_surface ||
+      seat->pointer->focus_surface != surface)
     return;
 
   /* FIXME: Check that the data source type array isn't empty. */
 
   if (data_device->current_grab ||
-      seat->pointer.grab != &seat->pointer.default_grab)
+      seat->pointer->grab != &seat->pointer->default_grab)
     return;
 
   if (icon_resource)
@@ -1183,13 +1184,13 @@ data_device_start_drag (struct wl_client *client,
       return;
     }
 
-  meta_wayland_pointer_set_focus (&seat->pointer, NULL);
+  meta_wayland_pointer_set_focus (seat->pointer, NULL);
   meta_wayland_data_device_start_drag (data_device, client,
                                        &drag_grab_interface,
                                        surface, drag_source, icon_surface);
 
-  meta_wayland_keyboard_set_focus (&seat->keyboard, NULL);
-  meta_wayland_keyboard_start_grab (&seat->keyboard,
+  meta_wayland_keyboard_set_focus (seat->keyboard, NULL);
+  meta_wayland_keyboard_start_grab (seat->keyboard,
                                     &seat->data_device.current_grab->keyboard_grab);
 }
 
@@ -1203,7 +1204,7 @@ selection_data_source_destroyed (gpointer data, GObject *object_was_here)
 
   data_device->selection_data_source = NULL;
 
-  focus_client = meta_wayland_keyboard_get_focus_client (&seat->keyboard);
+  focus_client = meta_wayland_keyboard_get_focus_client (seat->keyboard);
   if (focus_client)
     {
       data_device_resource = wl_resource_find_for_client (&data_device->resource_list, focus_client);
@@ -1529,7 +1530,7 @@ meta_wayland_data_device_set_selection (MetaWaylandDataDevice *data_device,
   data_device->selection_data_source = source;
   data_device->selection_serial = serial;
 
-  focus_client = meta_wayland_keyboard_get_focus_client (&seat->keyboard);
+  focus_client = meta_wayland_keyboard_get_focus_client (seat->keyboard);
   if (focus_client)
     {
       data_device_resource = wl_resource_find_for_client (&data_device->resource_list, focus_client);
@@ -1606,7 +1607,7 @@ primary_source_destroyed (gpointer  data,
 
   data_device->primary_data_source = NULL;
 
-  focus_client = meta_wayland_keyboard_get_focus_client (&seat->keyboard);
+  focus_client = meta_wayland_keyboard_get_focus_client (seat->keyboard);
   if (focus_client)
     {
       struct wl_resource *data_device_resource;
@@ -1635,7 +1636,7 @@ meta_wayland_data_device_set_primary (MetaWaylandDataDevice *data_device,
       resource = META_WAYLAND_DATA_SOURCE_PRIMARY (source)->resource;
 
       if (wl_resource_get_client (resource) !=
-          meta_wayland_keyboard_get_focus_client (&seat->keyboard))
+          meta_wayland_keyboard_get_focus_client (seat->keyboard))
         return;
     }
 
@@ -1654,7 +1655,7 @@ meta_wayland_data_device_set_primary (MetaWaylandDataDevice *data_device,
   data_device->primary_data_source = source;
   data_device->primary_serial = serial;
 
-  focus_client = meta_wayland_keyboard_get_focus_client (&seat->keyboard);
+  focus_client = meta_wayland_keyboard_get_focus_client (seat->keyboard);
   if (focus_client)
     {
       data_device_resource = wl_resource_find_for_client (&data_device->primary_resource_list, focus_client);
@@ -1840,7 +1841,7 @@ meta_wayland_data_device_set_keyboard_focus (MetaWaylandDataDevice *data_device)
   struct wl_resource *data_device_resource, *offer;
   MetaWaylandDataSource *source;
 
-  focus_client = meta_wayland_keyboard_get_focus_client (&seat->keyboard);
+  focus_client = meta_wayland_keyboard_get_focus_client (seat->keyboard);
 
   if (focus_client == data_device->focus_client)
     return;
diff --git a/src/wayland/meta-wayland-keyboard.c b/src/wayland/meta-wayland-keyboard.c
index 1d3c29b..d505783 100644
--- a/src/wayland/meta-wayland-keyboard.c
+++ b/src/wayland/meta-wayland-keyboard.c
@@ -65,6 +65,8 @@
 #include "backends/native/meta-backend-native.h"
 #endif
 
+G_DEFINE_TYPE (MetaWaylandKeyboard, meta_wayland_keyboard, G_TYPE_OBJECT);
+
 static void meta_wayland_keyboard_update_xkb_state (MetaWaylandKeyboard *keyboard);
 static void notify_modifiers (MetaWaylandKeyboard *keyboard);
 static guint evdev_code (const ClutterKeyEvent *event);
@@ -342,7 +344,7 @@ meta_wayland_keyboard_broadcast_modifiers (MetaWaylandKeyboard *keyboard)
   l = &keyboard->focus_resource_list;
   if (!wl_list_empty (l))
     {
-      uint32_t serial = wl_display_next_serial (keyboard->display);
+      uint32_t serial = wl_display_next_serial (keyboard->seat->wl_display);
 
       wl_resource_for_each (resource, l)
         keyboard_send_modifiers (keyboard, resource, serial);
@@ -478,14 +480,12 @@ static const MetaWaylandKeyboardGrabInterface default_keyboard_grab_interface =
 };
 
 void
-meta_wayland_keyboard_init (MetaWaylandKeyboard *keyboard,
-                            struct wl_display   *display)
+meta_wayland_keyboard_enable (MetaWaylandKeyboard *keyboard,
+                              MetaWaylandSeat     *seat)
 {
   MetaBackend *backend = meta_get_backend ();
 
-  memset (keyboard, 0, sizeof *keyboard);
-
-  keyboard->display = display;
+  keyboard->seat = seat;
 
   wl_list_init (&keyboard->resource_list);
   wl_list_init (&keyboard->focus_resource_list);
@@ -512,17 +512,20 @@ meta_wayland_keyboard_init (MetaWaylandKeyboard *keyboard,
 static void
 meta_wayland_xkb_info_destroy (MetaWaylandXkbInfo *xkb_info)
 {
-  xkb_keymap_unref (xkb_info->keymap);
-  xkb_state_unref (xkb_info->state);
+  g_clear_pointer (&xkb_info->keymap, xkb_keymap_unref);
+  g_clear_pointer (&xkb_info->state, xkb_state_unref);
 
   if (xkb_info->keymap_area)
-    munmap (xkb_info->keymap_area, xkb_info->keymap_size);
+    {
+      munmap (xkb_info->keymap_area, xkb_info->keymap_size);
+      xkb_info->keymap_area = NULL;
+    }
   if (xkb_info->keymap_fd >= 0)
     close (xkb_info->keymap_fd);
 }
 
 void
-meta_wayland_keyboard_release (MetaWaylandKeyboard *keyboard)
+meta_wayland_keyboard_disable (MetaWaylandKeyboard *keyboard)
 {
   MetaBackend *backend = meta_get_backend ();
 
@@ -534,9 +537,9 @@ meta_wayland_keyboard_release (MetaWaylandKeyboard *keyboard)
 
   /* XXX: What about keyboard->resource_list? */
 
-  g_object_unref (keyboard->settings);
+  g_clear_object (&keyboard->settings);
 
-  keyboard->display = NULL;
+  keyboard->seat = NULL;
 }
 
 static guint
@@ -682,7 +685,7 @@ void
 meta_wayland_keyboard_set_focus (MetaWaylandKeyboard *keyboard,
                                  MetaWaylandSurface *surface)
 {
-  if (keyboard->display == NULL)
+  if (keyboard->seat == NULL)
     return;
 
   if (keyboard->focus_surface == surface)
@@ -809,3 +812,13 @@ meta_wayland_keyboard_end_grab (MetaWaylandKeyboard *keyboard)
 {
   keyboard->grab = &keyboard->default_grab;
 }
+
+static void
+meta_wayland_keyboard_init (MetaWaylandKeyboard *keyboard)
+{
+}
+
+static void
+meta_wayland_keyboard_class_init (MetaWaylandKeyboardClass *klass)
+{
+}
diff --git a/src/wayland/meta-wayland-keyboard.h b/src/wayland/meta-wayland-keyboard.h
index be921ec..5f7d15c 100644
--- a/src/wayland/meta-wayland-keyboard.h
+++ b/src/wayland/meta-wayland-keyboard.h
@@ -49,6 +49,13 @@
 #include <wayland-server.h>
 #include <xkbcommon/xkbcommon.h>
 
+#include "wayland/meta-wayland-types.h"
+
+#define META_TYPE_WAYLAND_KEYBOARD (meta_wayland_keyboard_get_type ())
+G_DECLARE_FINAL_TYPE (MetaWaylandKeyboard, meta_wayland_keyboard,
+                      META, WAYLAND_KEYBOARD,
+                      GObject);
+
 struct _MetaWaylandKeyboardGrabInterface
 {
   gboolean (*key)       (MetaWaylandKeyboardGrab *grab,
@@ -74,7 +81,9 @@ typedef struct
 
 struct _MetaWaylandKeyboard
 {
-  struct wl_display *display;
+  GObject parent;
+
+  MetaWaylandSeat *seat;
 
   struct wl_list resource_list;
   struct wl_list focus_resource_list;
@@ -93,10 +102,10 @@ struct _MetaWaylandKeyboard
   GSettings *settings;
 };
 
-void meta_wayland_keyboard_init (MetaWaylandKeyboard *keyboard,
-                                 struct wl_display   *display);
+void meta_wayland_keyboard_enable (MetaWaylandKeyboard *keyboard,
+                                   MetaWaylandSeat     *seat);
 
-void meta_wayland_keyboard_release (MetaWaylandKeyboard *keyboard);
+void meta_wayland_keyboard_disable (MetaWaylandKeyboard *keyboard);
 
 void meta_wayland_keyboard_update (MetaWaylandKeyboard *keyboard,
                                    const ClutterKeyEvent *event);
diff --git a/src/wayland/meta-wayland-pointer-constraints.c b/src/wayland/meta-wayland-pointer-constraints.c
index c1e82a2..6477d41 100644
--- a/src/wayland/meta-wayland-pointer-constraints.c
+++ b/src/wayland/meta-wayland-pointer-constraints.c
@@ -329,7 +329,7 @@ meta_wayland_pointer_constraint_enable (MetaWaylandPointerConstraint *constraint
 
   constraint->is_enabled = TRUE;
   meta_wayland_pointer_constraint_notify_activated (constraint);
-  meta_wayland_pointer_start_grab (&constraint->seat->pointer,
+  meta_wayland_pointer_start_grab (constraint->seat->pointer,
                                    &constraint->grab);
 
   constraint->constraint =
@@ -394,7 +394,7 @@ meta_wayland_pointer_constraint_maybe_enable (MetaWaylandPointerConstraint *cons
   if (!meta_window_appears_focused (constraint->surface->window))
     return;
 
-  meta_wayland_pointer_get_relative_coordinates (&constraint->seat->pointer,
+  meta_wayland_pointer_get_relative_coordinates (constraint->seat->pointer,
                                                  constraint->surface,
                                                  &sx, &sy);
   if (!is_within_constraint_region (constraint, sx, sy))
@@ -416,7 +416,7 @@ void
 meta_wayland_pointer_constraint_maybe_remove_for_seat (MetaWaylandSeat *seat,
                                                        MetaWindow      *window)
 {
-  MetaWaylandPointer *pointer = &seat->pointer;
+  MetaWaylandPointer *pointer = seat->pointer;
   MetaWaylandPointerConstraint *constraint;
 
   if ((pointer->grab->interface != &confined_pointer_grab_interface &&
diff --git a/src/wayland/meta-wayland-pointer-gesture-pinch.c 
b/src/wayland/meta-wayland-pointer-gesture-pinch.c
index 80bc78f..3f91a10 100644
--- a/src/wayland/meta-wayland-pointer-gesture-pinch.c
+++ b/src/wayland/meta-wayland-pointer-gesture-pinch.c
@@ -27,6 +27,7 @@
 
 #include "meta-wayland-pointer-gesture-pinch.h"
 #include "meta-wayland-pointer.h"
+#include "meta-wayland-seat.h"
 #include "meta-wayland-surface.h"
 #include "pointer-gestures-unstable-v1-server-protocol.h"
 
@@ -39,7 +40,7 @@ handle_pinch_begin (MetaWaylandPointer *pointer,
   uint32_t serial;
 
   pointer_client = pointer->focus_client;
-  serial = wl_display_next_serial (pointer->display);
+  serial = wl_display_next_serial (pointer->seat->wl_display);
 
   wl_resource_for_each (resource, &pointer_client->pinch_gesture_resources)
     {
@@ -84,7 +85,7 @@ handle_pinch_end (MetaWaylandPointer *pointer,
   uint32_t serial;
 
   pointer_client = pointer->focus_client;
-  serial = wl_display_next_serial (pointer->display);
+  serial = wl_display_next_serial (pointer->seat->wl_display);
 
   if (event->touchpad_pinch.phase == CLUTTER_TOUCHPAD_GESTURE_PHASE_CANCEL)
     cancelled = TRUE;
diff --git a/src/wayland/meta-wayland-pointer-gesture-swipe.c 
b/src/wayland/meta-wayland-pointer-gesture-swipe.c
index 8762cc5..5f98e23 100644
--- a/src/wayland/meta-wayland-pointer-gesture-swipe.c
+++ b/src/wayland/meta-wayland-pointer-gesture-swipe.c
@@ -27,6 +27,7 @@
 
 #include "meta-wayland-pointer-gesture-swipe.h"
 #include "meta-wayland-pointer.h"
+#include "meta-wayland-seat.h"
 #include "meta-wayland-surface.h"
 #include "pointer-gestures-unstable-v1-server-protocol.h"
 
@@ -39,7 +40,7 @@ handle_swipe_begin (MetaWaylandPointer *pointer,
   uint32_t serial, fingers;
 
   pointer_client = pointer->focus_client;
-  serial = wl_display_next_serial (pointer->display);
+  serial = wl_display_next_serial (pointer->seat->wl_display);
   fingers = clutter_event_get_gesture_swipe_finger_count (event);
 
   wl_resource_for_each (resource, &pointer_client->swipe_gesture_resources)
@@ -81,7 +82,7 @@ handle_swipe_end (MetaWaylandPointer *pointer,
   uint32_t serial;
 
   pointer_client = pointer->focus_client;
-  serial = wl_display_next_serial (pointer->display);
+  serial = wl_display_next_serial (pointer->seat->wl_display);
 
   if (event->touchpad_swipe.phase == CLUTTER_TOUCHPAD_GESTURE_PHASE_CANCEL)
     cancelled = TRUE;
diff --git a/src/wayland/meta-wayland-pointer.c b/src/wayland/meta-wayland-pointer.c
index 08f7de9..47b21f0 100644
--- a/src/wayland/meta-wayland-pointer.c
+++ b/src/wayland/meta-wayland-pointer.c
@@ -52,6 +52,7 @@
 #include "meta-wayland-pointer.h"
 #include "meta-wayland-popup.h"
 #include "meta-wayland-private.h"
+#include "meta-wayland-seat.h"
 #include "meta-wayland-surface.h"
 #include "meta-wayland-buffer.h"
 #include "meta-wayland-surface-role-cursor.h"
@@ -74,6 +75,8 @@
 
 #define DEFAULT_AXIS_STEP_DISTANCE wl_fixed_from_int (10)
 
+G_DEFINE_TYPE (MetaWaylandPointer, meta_wayland_pointer, G_TYPE_OBJECT);
+
 static MetaWaylandPointerClient *
 meta_wayland_pointer_client_new (void)
 {
@@ -444,15 +447,13 @@ meta_wayland_pointer_on_cursor_changed (MetaCursorTracker *cursor_tracker,
 }
 
 void
-meta_wayland_pointer_init (MetaWaylandPointer *pointer,
-                           struct wl_display  *display)
+meta_wayland_pointer_enable (MetaWaylandPointer *pointer,
+                             MetaWaylandSeat    *seat)
 {
   MetaCursorTracker *cursor_tracker = meta_cursor_tracker_get_for_screen (NULL);
   ClutterDeviceManager *manager;
 
-  memset (pointer, 0, sizeof *pointer);
-
-  pointer->display = display;
+  pointer->seat = seat;
 
   pointer->pointer_clients =
     g_hash_table_new_full (NULL, NULL, NULL,
@@ -476,7 +477,7 @@ meta_wayland_pointer_init (MetaWaylandPointer *pointer,
 }
 
 void
-meta_wayland_pointer_release (MetaWaylandPointer *pointer)
+meta_wayland_pointer_disable (MetaWaylandPointer *pointer)
 {
   MetaCursorTracker *cursor_tracker = meta_cursor_tracker_get_for_screen (NULL);
 
@@ -493,7 +494,7 @@ meta_wayland_pointer_release (MetaWaylandPointer *pointer)
   meta_wayland_pointer_set_focus (pointer, NULL);
 
   g_clear_pointer (&pointer->pointer_clients, g_hash_table_unref);
-  pointer->display = NULL;
+  pointer->seat = NULL;
   pointer->cursor_surface = NULL;
 }
 
@@ -579,7 +580,7 @@ handle_button_event (MetaWaylandPointer *pointer,
   pointer->grab->interface->button (pointer->grab, event);
 
   if (implicit_grab)
-    pointer->grab_serial = wl_display_get_serial (pointer->display);
+    pointer->grab_serial = wl_display_get_serial (pointer->seat->wl_display);
 }
 
 static void
@@ -786,7 +787,7 @@ void
 meta_wayland_pointer_set_focus (MetaWaylandPointer *pointer,
                                 MetaWaylandSurface *surface)
 {
-  if (pointer->display == NULL)
+  if (pointer->seat == NULL)
     return;
 
   if (pointer->focus_surface == surface)
@@ -1194,6 +1195,15 @@ meta_wayland_relative_pointer_init (MetaWaylandCompositor *compositor)
 MetaWaylandSeat *
 meta_wayland_pointer_get_seat (MetaWaylandPointer *pointer)
 {
-  MetaWaylandSeat *seat = wl_container_of (pointer, seat, pointer);
-  return seat;
+  return pointer->seat;
+}
+
+static void
+meta_wayland_pointer_init (MetaWaylandPointer *pointer)
+{
+}
+
+static void
+meta_wayland_pointer_class_init (MetaWaylandPointerClass *klass)
+{
 }
diff --git a/src/wayland/meta-wayland-pointer.h b/src/wayland/meta-wayland-pointer.h
index f7b76d7..93bda6b 100644
--- a/src/wayland/meta-wayland-pointer.h
+++ b/src/wayland/meta-wayland-pointer.h
@@ -32,6 +32,10 @@
 
 #include <meta/meta-cursor-tracker.h>
 
+#define META_TYPE_WAYLAND_POINTER (meta_wayland_pointer_get_type ())
+G_DECLARE_FINAL_TYPE (MetaWaylandPointer, meta_wayland_pointer,
+                      META, WAYLAND_POINTER, GObject);
+
 struct _MetaWaylandPointerGrabInterface
 {
   void (*focus) (MetaWaylandPointerGrab *grab,
@@ -58,7 +62,9 @@ struct _MetaWaylandPointerClient
 
 struct _MetaWaylandPointer
 {
-  struct wl_display *display;
+  GObject parent;
+
+  MetaWaylandSeat *seat;
 
   MetaWaylandPointerClient *focus_client;
   GHashTable *pointer_clients;
@@ -84,10 +90,10 @@ struct _MetaWaylandPointer
   guint32 button_count;
 };
 
-void meta_wayland_pointer_init (MetaWaylandPointer *pointer,
-                                struct wl_display  *display);
+void meta_wayland_pointer_enable (MetaWaylandPointer *pointer,
+                                  MetaWaylandSeat    *seat);
 
-void meta_wayland_pointer_release (MetaWaylandPointer *pointer);
+void meta_wayland_pointer_disable (MetaWaylandPointer *pointer);
 
 void meta_wayland_pointer_update (MetaWaylandPointer *pointer,
                                   const ClutterEvent *event);
diff --git a/src/wayland/meta-wayland-popup.c b/src/wayland/meta-wayland-popup.c
index e582e6d..77860d4 100644
--- a/src/wayland/meta-wayland-popup.c
+++ b/src/wayland/meta-wayland-popup.c
@@ -253,7 +253,7 @@ meta_wayland_popup_dismiss (MetaWaylandPopup *popup)
 
       top_popup_surface = meta_wayland_popup_grab_get_top_popup (popup_grab);
       seat = meta_wayland_pointer_get_seat (popup_grab->generic.pointer);
-      keyboard = &seat->keyboard;
+      keyboard = seat->keyboard;
       meta_wayland_keyboard_set_focus (keyboard, top_popup_surface);
     }
 }
@@ -285,7 +285,7 @@ meta_wayland_popup_create (MetaWaylandPopupSurface *popup_surface,
   wl_list_insert (&grab->all_popups, &popup->link);
 
   seat = meta_wayland_pointer_get_seat (grab->generic.pointer);
-  keyboard = &seat->keyboard;
+  keyboard = seat->keyboard;
   meta_wayland_keyboard_set_focus (keyboard, surface);
 
   return popup;
diff --git a/src/wayland/meta-wayland-seat.c b/src/wayland/meta-wayland-seat.c
index bc13497..165b765 100644
--- a/src/wayland/meta-wayland-seat.c
+++ b/src/wayland/meta-wayland-seat.c
@@ -43,7 +43,7 @@ seat_get_pointer (struct wl_client *client,
                   uint32_t id)
 {
   MetaWaylandSeat *seat = wl_resource_get_user_data (resource);
-  MetaWaylandPointer *pointer = &seat->pointer;
+  MetaWaylandPointer *pointer = seat->pointer;
 
   if ((seat->capabilities & WL_SEAT_CAPABILITY_POINTER) != 0)
     meta_wayland_pointer_create_new_resource (pointer, client, resource, id);
@@ -55,7 +55,7 @@ seat_get_keyboard (struct wl_client *client,
                    uint32_t id)
 {
   MetaWaylandSeat *seat = wl_resource_get_user_data (resource);
-  MetaWaylandKeyboard *keyboard = &seat->keyboard;
+  MetaWaylandKeyboard *keyboard = seat->keyboard;
 
   if ((seat->capabilities & WL_SEAT_CAPABILITY_KEYBOARD) != 0)
     meta_wayland_keyboard_create_new_resource (keyboard, client, resource, id);
@@ -67,7 +67,7 @@ seat_get_touch (struct wl_client *client,
                 uint32_t id)
 {
   MetaWaylandSeat *seat = wl_resource_get_user_data (resource);
-  MetaWaylandTouch *touch = &seat->touch;
+  MetaWaylandTouch *touch = seat->touch;
 
   if ((seat->capabilities & WL_SEAT_CAPABILITY_TOUCH) != 0)
     meta_wayland_touch_create_new_resource (touch, client, resource, id);
@@ -157,15 +157,15 @@ meta_wayland_seat_set_capabilities (MetaWaylandSeat *seat,
   seat->capabilities = flags;
 
   if (CAPABILITY_ENABLED (prev_flags, flags, WL_SEAT_CAPABILITY_POINTER))
-    meta_wayland_pointer_init (&seat->pointer, seat->wl_display);
+    meta_wayland_pointer_enable (seat->pointer, seat);
   else if (CAPABILITY_DISABLED (prev_flags, flags, WL_SEAT_CAPABILITY_POINTER))
-    meta_wayland_pointer_release (&seat->pointer);
+    meta_wayland_pointer_disable (seat->pointer);
 
   if (CAPABILITY_ENABLED (prev_flags, flags, WL_SEAT_CAPABILITY_KEYBOARD))
     {
       MetaDisplay *display;
 
-      meta_wayland_keyboard_init (&seat->keyboard, seat->wl_display);
+      meta_wayland_keyboard_enable (seat->keyboard, seat);
       display = meta_get_display ();
 
       /* Post-initialization, ensure the input focus is in sync */
@@ -173,12 +173,12 @@ meta_wayland_seat_set_capabilities (MetaWaylandSeat *seat,
         meta_display_sync_wayland_input_focus (display);
     }
   else if (CAPABILITY_DISABLED (prev_flags, flags, WL_SEAT_CAPABILITY_KEYBOARD))
-    meta_wayland_keyboard_release (&seat->keyboard);
+    meta_wayland_keyboard_disable (seat->keyboard);
 
   if (CAPABILITY_ENABLED (prev_flags, flags, WL_SEAT_CAPABILITY_TOUCH))
-    meta_wayland_touch_init (&seat->touch, seat->wl_display);
+    meta_wayland_touch_enable (seat->touch, seat);
   else if (CAPABILITY_DISABLED (prev_flags, flags, WL_SEAT_CAPABILITY_TOUCH))
-    meta_wayland_touch_release (&seat->touch);
+    meta_wayland_touch_disable (seat->touch);
 
   /* Broadcast capability changes */
   wl_resource_for_each (resource, &seat->base_resource_list)
@@ -215,6 +215,10 @@ meta_wayland_seat_new (MetaWaylandCompositor *compositor,
   wl_list_init (&seat->base_resource_list);
   seat->wl_display = display;
 
+  seat->pointer = g_object_new (META_TYPE_WAYLAND_POINTER, NULL);
+  seat->keyboard = g_object_new (META_TYPE_WAYLAND_KEYBOARD, NULL);
+  seat->touch = g_object_new (META_TYPE_WAYLAND_TOUCH, NULL);
+
   meta_wayland_data_device_init (&seat->data_device);
 
   device_manager = clutter_device_manager_get_default ();
@@ -247,6 +251,10 @@ meta_wayland_seat_free (MetaWaylandSeat *seat)
   g_signal_handlers_disconnect_by_data (device_manager, seat);
   meta_wayland_seat_set_capabilities (seat, 0);
 
+  g_object_unref (seat->pointer);
+  g_object_unref (seat->keyboard);
+  g_object_unref (seat->touch);
+
   g_slice_free (MetaWaylandSeat, seat);
 }
 
@@ -306,20 +314,20 @@ meta_wayland_seat_update (MetaWaylandSeat    *seat,
     case CLUTTER_BUTTON_RELEASE:
     case CLUTTER_SCROLL:
       if (seat->capabilities & WL_SEAT_CAPABILITY_POINTER)
-        meta_wayland_pointer_update (&seat->pointer, event);
+        meta_wayland_pointer_update (seat->pointer, event);
       break;
 
     case CLUTTER_KEY_PRESS:
     case CLUTTER_KEY_RELEASE:
       if (seat->capabilities & WL_SEAT_CAPABILITY_KEYBOARD)
-        meta_wayland_keyboard_update (&seat->keyboard, (const ClutterKeyEvent *) event);
+        meta_wayland_keyboard_update (seat->keyboard, (const ClutterKeyEvent *) event);
       break;
 
     case CLUTTER_TOUCH_BEGIN:
     case CLUTTER_TOUCH_UPDATE:
     case CLUTTER_TOUCH_END:
       if (seat->capabilities & WL_SEAT_CAPABILITY_TOUCH)
-        meta_wayland_touch_update (&seat->touch, event);
+        meta_wayland_touch_update (seat->touch, event);
       break;
 
     default:
@@ -343,18 +351,18 @@ meta_wayland_seat_handle_event (MetaWaylandSeat *seat,
     case CLUTTER_TOUCHPAD_SWIPE:
     case CLUTTER_TOUCHPAD_PINCH:
       if (seat->capabilities & WL_SEAT_CAPABILITY_POINTER)
-        return meta_wayland_pointer_handle_event (&seat->pointer, event);
+        return meta_wayland_pointer_handle_event (seat->pointer, event);
 
     case CLUTTER_KEY_PRESS:
     case CLUTTER_KEY_RELEASE:
       if (seat->capabilities & WL_SEAT_CAPABILITY_KEYBOARD)
-        return meta_wayland_keyboard_handle_event (&seat->keyboard,
+        return meta_wayland_keyboard_handle_event (seat->keyboard,
                                                    (const ClutterKeyEvent *) event);
     case CLUTTER_TOUCH_BEGIN:
     case CLUTTER_TOUCH_UPDATE:
     case CLUTTER_TOUCH_END:
       if (seat->capabilities & WL_SEAT_CAPABILITY_TOUCH)
-        return meta_wayland_touch_handle_event (&seat->touch, event);
+        return meta_wayland_touch_handle_event (seat->touch, event);
 
     default:
       break;
@@ -369,7 +377,7 @@ meta_wayland_seat_repick (MetaWaylandSeat *seat)
   if ((seat->capabilities & WL_SEAT_CAPABILITY_POINTER) == 0)
     return;
 
-  meta_wayland_pointer_repick (&seat->pointer);
+  meta_wayland_pointer_repick (seat->pointer);
 }
 
 void
@@ -381,7 +389,7 @@ meta_wayland_seat_set_input_focus (MetaWaylandSeat    *seat,
 
   if ((seat->capabilities & WL_SEAT_CAPABILITY_KEYBOARD) != 0)
     {
-      meta_wayland_keyboard_set_focus (&seat->keyboard, surface);
+      meta_wayland_keyboard_set_focus (seat->keyboard, surface);
       meta_wayland_data_device_set_keyboard_focus (&seat->data_device);
     }
 
@@ -401,24 +409,28 @@ meta_wayland_seat_get_grab_info (MetaWaylandSeat    *seat,
   gboolean can_grab_surface = FALSE;
 
   if ((seat->capabilities & WL_SEAT_CAPABILITY_TOUCH) != 0)
-    sequence = meta_wayland_touch_find_grab_sequence (&seat->touch, surface, serial);
+    sequence = meta_wayland_touch_find_grab_sequence (seat->touch,
+                                                      surface,
+                                                      serial);
 
   if (sequence)
     {
-      meta_wayland_touch_get_press_coords (&seat->touch, sequence, x, y);
+      meta_wayland_touch_get_press_coords (seat->touch, sequence, x, y);
     }
   else
     {
       if ((seat->capabilities & WL_SEAT_CAPABILITY_POINTER) != 0 &&
-          (!require_pressed || seat->pointer.button_count > 0))
-        can_grab_surface = meta_wayland_pointer_can_grab_surface (&seat->pointer, surface, serial);
+          (!require_pressed || seat->pointer->button_count > 0))
+        can_grab_surface = meta_wayland_pointer_can_grab_surface (seat->pointer,
+                                                                  surface,
+                                                                  serial);
 
       if (can_grab_surface)
         {
           if (x)
-            *x = seat->pointer.grab_x;
+            *x = seat->pointer->grab_x;
           if (y)
-            *y = seat->pointer.grab_y;
+            *y = seat->pointer->grab_y;
         }
     }
 
@@ -429,7 +441,7 @@ gboolean
 meta_wayland_seat_can_popup (MetaWaylandSeat *seat,
                              uint32_t         serial)
 {
-  return (meta_wayland_pointer_can_popup (&seat->pointer, serial) ||
-          meta_wayland_keyboard_can_popup (&seat->keyboard, serial) ||
-          meta_wayland_touch_can_popup (&seat->touch, serial));
+  return (meta_wayland_pointer_can_popup (seat->pointer, serial) ||
+          meta_wayland_keyboard_can_popup (seat->keyboard, serial) ||
+          meta_wayland_touch_can_popup (seat->touch, serial));
 }
diff --git a/src/wayland/meta-wayland-seat.h b/src/wayland/meta-wayland-seat.h
index 42ddb1e..33b8975 100644
--- a/src/wayland/meta-wayland-seat.h
+++ b/src/wayland/meta-wayland-seat.h
@@ -36,9 +36,10 @@ struct _MetaWaylandSeat
   struct wl_list base_resource_list;
   struct wl_display *wl_display;
 
-  MetaWaylandPointer pointer;
-  MetaWaylandKeyboard keyboard;
-  MetaWaylandTouch touch;
+  MetaWaylandPointer *pointer;
+  MetaWaylandKeyboard *keyboard;
+  MetaWaylandTouch *touch;
+
   MetaWaylandDataDevice data_device;
 
   guint capabilities;
diff --git a/src/wayland/meta-wayland-tablet-seat.c b/src/wayland/meta-wayland-tablet-seat.c
index 9cd8faf..5e34ad3 100644
--- a/src/wayland/meta-wayland-tablet-seat.c
+++ b/src/wayland/meta-wayland-tablet-seat.c
@@ -204,7 +204,7 @@ static void
 meta_wayland_tablet_seat_device_added (MetaWaylandTabletSeat *tablet_seat,
                                        ClutterInputDevice    *device)
 {
-  MetaWaylandSurface *pad_focus = tablet_seat->seat->keyboard.focus_surface;
+  MetaWaylandSurface *pad_focus = tablet_seat->seat->keyboard->focus_surface;
 
   if (is_tablet_device (device))
     {
diff --git a/src/wayland/meta-wayland-touch.c b/src/wayland/meta-wayland-touch.c
index 52c3f64..440d6ab 100644
--- a/src/wayland/meta-wayland-touch.c
+++ b/src/wayland/meta-wayland-touch.c
@@ -34,6 +34,8 @@
 #include "backends/native/meta-backend-native.h"
 #endif
 
+G_DEFINE_TYPE (MetaWaylandTouch, meta_wayland_touch, G_TYPE_OBJECT);
+
 struct _MetaWaylandTouchSurface
 {
   MetaWaylandSurface *surface;
@@ -454,7 +456,7 @@ meta_wayland_touch_cancel (MetaWaylandTouch *touch)
 {
   GList *surfaces, *s;
 
-  if (touch->display == NULL)
+  if (touch->seat == NULL)
     return;
 
   surfaces = s = touch_get_surfaces (touch, FALSE);
@@ -514,14 +516,12 @@ evdev_filter_func (struct libinput_event *event,
 #endif
 
 void
-meta_wayland_touch_init (MetaWaylandTouch  *touch,
-                         struct wl_display *display)
+meta_wayland_touch_enable (MetaWaylandTouch *touch,
+                           MetaWaylandSeat  *seat)
 {
   ClutterDeviceManager *manager;
 
-  memset (touch, 0, sizeof *touch);
-
-  touch->display = display;
+  touch->seat = seat;
   touch->touch_surfaces = g_hash_table_new_full (NULL, NULL, NULL,
                                                  (GDestroyNotify) touch_surface_free);
   touch->touches = g_hash_table_new_full (NULL, NULL, NULL,
@@ -540,7 +540,7 @@ meta_wayland_touch_init (MetaWaylandTouch  *touch,
 }
 
 void
-meta_wayland_touch_release (MetaWaylandTouch *touch)
+meta_wayland_touch_disable (MetaWaylandTouch *touch)
 {
 #ifdef HAVE_NATIVE_BACKEND
   MetaBackend *backend = meta_get_backend ();
@@ -550,7 +550,7 @@ meta_wayland_touch_release (MetaWaylandTouch *touch)
 
   g_clear_pointer (&touch->touch_surfaces, (GDestroyNotify) g_hash_table_unref);
   g_clear_pointer (&touch->touches, (GDestroyNotify) g_hash_table_unref);
-  touch->display = NULL;
+  touch->seat = NULL;
 }
 
 void
@@ -561,7 +561,7 @@ meta_wayland_touch_create_new_resource (MetaWaylandTouch   *touch,
 {
   struct wl_resource *cr;
 
-  if (touch->display == NULL)
+  if (touch->seat == NULL)
     {
       wl_resource_post_error (seat_resource, WL_DISPLAY_ERROR_INVALID_METHOD,
                               "Cannot retrieve touch interface without touch capability");
@@ -641,3 +641,13 @@ meta_wayland_touch_get_press_coords (MetaWaylandTouch     *touch,
 
   return TRUE;
 }
+
+static void
+meta_wayland_touch_init (MetaWaylandTouch *touch)
+{
+}
+
+static void
+meta_wayland_touch_class_init (MetaWaylandTouchClass *klass)
+{
+}
diff --git a/src/wayland/meta-wayland-touch.h b/src/wayland/meta-wayland-touch.h
index e5abc12..5b27c6a 100644
--- a/src/wayland/meta-wayland-touch.h
+++ b/src/wayland/meta-wayland-touch.h
@@ -28,12 +28,21 @@
 
 #include "meta-wayland-types.h"
 
+#define META_TYPE_WAYLAND_TOUCH (meta_wayland_touch_get_type ())
+G_DECLARE_FINAL_TYPE (MetaWaylandTouch, meta_wayland_touch,
+                      META, WAYLAND_TOUCH,
+                      GObject);
+
+
 typedef struct _MetaWaylandTouchSurface MetaWaylandTouchSurface;
 typedef struct _MetaWaylandTouchInfo MetaWaylandTouchInfo;
 
 struct _MetaWaylandTouch
 {
-  struct wl_display *display;
+  GObject parent;
+
+  MetaWaylandSeat *seat;
+
   struct wl_list resource_list;
 
   GHashTable *touch_surfaces; /* HT of MetaWaylandSurface->MetaWaylandTouchSurface */
@@ -43,10 +52,10 @@ struct _MetaWaylandTouch
   guint64 frame_slots;
 };
 
-void meta_wayland_touch_init (MetaWaylandTouch  *touch,
-                              struct wl_display *display);
+void meta_wayland_touch_enable (MetaWaylandTouch *touch,
+                                MetaWaylandSeat  *seat);
 
-void meta_wayland_touch_release (MetaWaylandTouch *touch);
+void meta_wayland_touch_disable (MetaWaylandTouch *touch);
 
 void meta_wayland_touch_update (MetaWaylandTouch   *touch,
                                 const ClutterEvent *event);
diff --git a/src/wayland/meta-wayland-wl-shell.c b/src/wayland/meta-wayland-wl-shell.c
index e04df47..1888c78 100644
--- a/src/wayland/meta-wayland-wl-shell.c
+++ b/src/wayland/meta-wayland-wl-shell.c
@@ -324,7 +324,7 @@ meta_wayland_wl_shell_surface_create_popup (MetaWaylandWlShellSurface *wl_shell_
   MetaWaylandSeat *seat = wl_shell_surface->popup_seat;
   MetaWaylandPopup *popup;
 
-  popup = meta_wayland_pointer_start_popup_grab (&seat->pointer, popup_surface);
+  popup = meta_wayland_pointer_start_popup_grab (seat->pointer, popup_surface);
   if (!popup)
     {
       wl_shell_surface_send_popup_done (wl_shell_surface->resource);
diff --git a/src/wayland/meta-wayland-xdg-shell.c b/src/wayland/meta-wayland-xdg-shell.c
index 8831f8b..3290683 100644
--- a/src/wayland/meta-wayland-xdg-shell.c
+++ b/src/wayland/meta-wayland-xdg-shell.c
@@ -442,7 +442,7 @@ xdg_popup_grab (struct wl_client   *client,
       return;
     }
 
-  top_popup = meta_wayland_pointer_get_top_popup (&seat->pointer);
+  top_popup = meta_wayland_pointer_get_top_popup (seat->pointer);
   if ((top_popup == NULL &&
        !META_IS_WAYLAND_XDG_SURFACE (parent_surface->role)) ||
       (top_popup != NULL && parent_surface != top_popup))
@@ -803,7 +803,7 @@ finish_popup_setup (MetaWaylandXdgPopup *xdg_popup)
 
       meta_window_focus (window, meta_display_get_current_time (display));
       popup_surface = META_WAYLAND_POPUP_SURFACE (surface->role);
-      popup = meta_wayland_pointer_start_popup_grab (&seat->pointer,
+      popup = meta_wayland_pointer_start_popup_grab (seat->pointer,
                                                      popup_surface);
       if (popup == NULL)
         {
@@ -1675,7 +1675,6 @@ meta_wayland_xdg_positioner_set_constraint_adjustment (struct wl_client   *clien
                               ZXDG_POSITIONER_V6_CONSTRAINT_ADJUSTMENT_RESIZE_X |
                               ZXDG_POSITIONER_V6_CONSTRAINT_ADJUSTMENT_RESIZE_Y);
 
-
   if ((constraint_adjustment & ~all_adjustments) != 0)
     {
       wl_resource_post_error (resource, ZXDG_POSITIONER_V6_ERROR_INVALID_INPUT,
diff --git a/src/wayland/meta-wayland.c b/src/wayland/meta-wayland.c
index b360cf1..e153b24 100644
--- a/src/wayland/meta-wayland.c
+++ b/src/wayland/meta-wayland.c
@@ -226,7 +226,7 @@ meta_wayland_compositor_update_key_state (MetaWaylandCompositor *compositor,
                                           int                    key_vector_len,
                                           int                    offset)
 {
-  meta_wayland_keyboard_update_key_state (&compositor->seat->keyboard,
+  meta_wayland_keyboard_update_key_state (compositor->seat->keyboard,
                                           key_vector, key_vector_len, offset);
 }
 
diff --git a/src/wayland/meta-xwayland-selection.c b/src/wayland/meta-xwayland-selection.c
index 2528d8a..c346ba8 100644
--- a/src/wayland/meta-xwayland-selection.c
+++ b/src/wayland/meta-xwayland-selection.c
@@ -972,7 +972,7 @@ meta_x11_drag_dest_update (MetaWaylandDataDevice *data_device,
   MetaWaylandSeat *seat = compositor->seat;
   ClutterPoint pos;
 
-  clutter_input_device_get_coords (seat->pointer.device, NULL, &pos);
+  clutter_input_device_get_coords (seat->pointer->device, NULL, &pos);
   xdnd_send_position (compositor->xwayland_manager.selection_data,
                       compositor->xwayland_manager.selection_data->dnd.dnd_dest,
                       clutter_get_current_event_time (),
@@ -1378,7 +1378,7 @@ drag_xgrab_motion (MetaWaylandPointerGrab *grab,
                        event);
 
   dnd->last_motion_time = clutter_event_get_time (event);
-  meta_wayland_pointer_send_motion (&seat->pointer, event);
+  meta_wayland_pointer_send_motion (seat->pointer, event);
 }
 
 static void
@@ -1388,7 +1388,7 @@ drag_xgrab_button (MetaWaylandPointerGrab *grab,
   MetaWaylandCompositor *compositor = meta_wayland_compositor_get_default ();
   MetaWaylandSeat *seat = compositor->seat;
 
-  meta_wayland_pointer_send_button (&seat->pointer, event);
+  meta_wayland_pointer_send_button (seat->pointer, event);
 }
 
 static const MetaWaylandPointerGrabInterface drag_xgrab_interface = {
@@ -1499,10 +1499,10 @@ meta_xwayland_selection_handle_client_message (MetaWaylandCompositor *compositor
           uint32_t action = 0;
 
           motion = clutter_event_new (CLUTTER_MOTION);
-          clutter_input_device_get_coords (seat->pointer.device, NULL, &pos);
+          clutter_input_device_get_coords (seat->pointer->device, NULL, &pos);
           clutter_event_set_coords (motion, pos.x, pos.y);
-          clutter_event_set_device (motion, seat->pointer.device);
-          clutter_event_set_source_device (motion, seat->pointer.device);
+          clutter_event_set_device (motion, seat->pointer->device);
+          clutter_event_set_source_device (motion, seat->pointer->device);
           clutter_event_set_time (motion, dnd->last_motion_time);
 
           action = atom_to_action ((Atom) event->data.l[4]);
@@ -1591,7 +1591,7 @@ meta_xwayland_selection_handle_xfixes_selection_notify (MetaWaylandCompositor *c
         {
           MetaWaylandSurface *focus;
 
-          focus = compositor->seat->pointer.focus_surface;
+          focus = compositor->seat->pointer->focus_surface;
           selection->source = meta_wayland_data_source_xwayland_new (selection);
           meta_wayland_data_device_set_dnd_source (&compositor->seat->data_device,
                                                    selection->source);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]