[clutter/wip/clutter-gtk-wayland] stash: Check input listener and surface user data



commit ca4b5bd72a075db48a2e761f1626c965aa07c089
Author: Rob Bradford <rob linux intel com>
Date:   Thu Aug 1 15:27:05 2013 +0100

    stash: Check input listener and surface user data

 clutter/wayland/clutter-input-device-wayland.c |   61 ++++++++++++++++++++++-
 1 files changed, 58 insertions(+), 3 deletions(-)
---
diff --git a/clutter/wayland/clutter-input-device-wayland.c b/clutter/wayland/clutter-input-device-wayland.c
index 9e91eae..dbb277f 100644
--- a/clutter/wayland/clutter-input-device-wayland.c
+++ b/clutter/wayland/clutter-input-device-wayland.c
@@ -57,6 +57,9 @@ G_DEFINE_TYPE (ClutterInputDeviceWayland,
                clutter_input_device_wayland,
                CLUTTER_TYPE_INPUT_DEVICE);
 
+static gpointer pointer_listener_addr;
+static gpointer keyboard_listener_addr;
+
 /* This gives us a fake time source for higher level abstractions to have an
  * understanding of when an event happens. All that matters are that this is a
  * monotonic increasing millisecond accurate time for events to be compared with.
@@ -74,9 +77,16 @@ clutter_wayland_handle_motion (void *data,
                                wl_fixed_t x, wl_fixed_t y)
 {
   ClutterInputDeviceWayland *device = data;
-  ClutterStageCogl          *stage_cogl = device->pointer_focus;
+  ClutterStageCogl          *stage_cogl;
   ClutterEvent              *event;
 
+  if (wl_proxy_get_listener(pointer) != pointer_listener_addr)
+    return;
+  if (!device->pointer_focus)
+    return;
+
+  stage_cogl = device->pointer_focus;
+
   event = clutter_event_new (CLUTTER_MOTION);
   event->motion.stage = stage_cogl->wrapper;
   event->motion.device = CLUTTER_INPUT_DEVICE (device);
@@ -98,10 +108,17 @@ clutter_wayland_handle_button (void *data,
                                uint32_t button, uint32_t state)
 {
   ClutterInputDeviceWayland *device = data;
-  ClutterStageCogl          *stage_cogl = device->pointer_focus;
+  ClutterStageCogl          *stage_cogl;
   ClutterEvent              *event;
   ClutterEventType           type;
 
+  if (wl_proxy_get_listener(pointer) != pointer_listener_addr)
+    return;
+  if (!device->pointer_focus)
+    return;
+
+  stage_cogl = device->pointer_focus;
+
   if (state)
     type = CLUTTER_BUTTON_PRESS;
   else
@@ -140,10 +157,16 @@ clutter_wayland_handle_axis (void *data,
                              wl_fixed_t value)
 {
   ClutterInputDeviceWayland *device = data;
-  ClutterStageCogl          *stage_cogl = device->pointer_focus;
+  ClutterStageCogl          *stage_cogl;
   ClutterEvent              *event;
   gdouble                    delta_x, delta_y;
 
+  if (wl_proxy_get_listener(pointer) != pointer_listener_addr)
+    return;
+  if (!device->pointer_focus)
+    return;
+
+  stage_cogl = device->pointer_focus;
   event = clutter_event_new (CLUTTER_SCROLL);
   event->scroll.time = _clutter_wayland_get_time();
   event->scroll.stage = stage_cogl->wrapper;
@@ -181,6 +204,9 @@ clutter_wayland_handle_keymap (void *data,
   struct xkb_keymap *keymap;
   char *map_str;
 
+  if (wl_proxy_get_listener(keyboard) != keyboard_listener_addr)
+    return;
+
   if (device->xkb)
     {
       xkb_state_unref (device->xkb);
@@ -272,6 +298,8 @@ clutter_wayland_handle_key (void *data,
   ClutterStageCogl          *stage_cogl = device->keyboard_focus;
   ClutterEvent              *event;
 
+  if (wl_proxy_get_listener(keyboard) != keyboard_listener_addr)
+    return;
   if (!device->xkb)
     return;
 
@@ -315,6 +343,8 @@ clutter_wayland_handle_modifiers (void *data,
 {
   ClutterInputDeviceWayland *device = data;
 
+  if (wl_proxy_get_listener(keyboard) != keyboard_listener_addr)
+    return;
   if (!device->xkb)
     return;
 
@@ -340,6 +370,12 @@ clutter_wayland_handle_pointer_enter (void *data,
   ClutterBackend            *backend;
   ClutterBackendWayland     *backend_wayland;
 
+  if (wl_proxy_get_listener(pointer) != pointer_listener_addr)
+    return;
+
+  if (!CLUTTER_IS_STAGE_COGL (wl_surface_get_user_data (surface)))
+    return;
+
   stage_cogl = wl_surface_get_user_data (surface);
 
   device->pointer_focus = stage_cogl;
@@ -391,6 +427,11 @@ clutter_wayland_handle_pointer_leave (void *data,
   ClutterStageCogl          *stage_cogl;
   ClutterEvent              *event;
 
+  if (wl_proxy_get_listener(pointer) != pointer_listener_addr)
+    return;
+  if (!CLUTTER_IS_STAGE_COGL (wl_surface_get_user_data (surface)))
+    return;
+
   stage_cogl = wl_surface_get_user_data (surface);
   g_assert (device->pointer_focus == stage_cogl);
 
@@ -418,6 +459,11 @@ clutter_wayland_handle_keyboard_enter (void *data,
   ClutterInputDeviceWayland *device = data;
   ClutterStageCogl          *stage_cogl;
 
+  if (wl_proxy_get_listener(keyboard) != keyboard_listener_addr)
+    return;
+  if (!CLUTTER_IS_STAGE_COGL (wl_surface_get_user_data (surface)))
+    return;
+
   stage_cogl = wl_surface_get_user_data (surface);
   g_assert (device->keyboard_focus == NULL);
   device->keyboard_focus = stage_cogl;
@@ -436,6 +482,13 @@ clutter_wayland_handle_keyboard_leave (void *data,
   ClutterInputDeviceWayland *device = data;
   ClutterStageCogl          *stage_cogl;
 
+  if (wl_proxy_get_listener(keyboard) != keyboard_listener_addr)
+    return;
+  if (!surface)
+    return;
+  if (!CLUTTER_IS_STAGE_COGL (wl_surface_get_user_data (surface)))
+    return;
+
   stage_cogl = wl_surface_get_user_data (surface);
   g_assert (device->keyboard_focus == stage_cogl);
 
@@ -487,6 +540,7 @@ clutter_wayland_handle_seat (void *data,
           wl_pointer_add_listener (pointer,
                                    &_clutter_pointer_wayland_listener,
                                    device);
+          pointer_listener_addr = &_clutter_pointer_wayland_listener;
           wl_pointer_set_user_data (pointer, device);
           device->has_pointer = 1;
         }
@@ -502,6 +556,7 @@ clutter_wayland_handle_seat (void *data,
           wl_keyboard_add_listener (keyboard,
                                     &_clutter_keyboard_wayland_listener,
                                     device);
+          keyboard_listener_addr =&_clutter_keyboard_wayland_listener;
           wl_keyboard_set_user_data (keyboard, device);
           device->has_keyboard = 1;
         }


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