[mutter] seat: Move pointer event handling to MetaWaylandPointer as well



commit 45a8a3f49063ecc347d0a49b0ce607df20e9d985
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Thu Apr 17 18:16:49 2014 -0400

    seat: Move pointer event handling to MetaWaylandPointer as well
    
    Now everything that deals with the pointer is inside meta-wayland-pointer.c

 src/wayland/meta-wayland-pointer.c |  243 ++++++++++++++++++++++++++++++------
 src/wayland/meta-wayland-pointer.h |   11 +-
 src/wayland/meta-wayland-seat.c    |  146 +---------------------
 3 files changed, 214 insertions(+), 186 deletions(-)
---
diff --git a/src/wayland/meta-wayland-pointer.c b/src/wayland/meta-wayland-pointer.c
index b3756aa..1e63bbe 100644
--- a/src/wayland/meta-wayland-pointer.c
+++ b/src/wayland/meta-wayland-pointer.c
@@ -51,9 +51,12 @@
 #include "meta-wayland-private.h"
 #include "meta-cursor.h"
 #include "meta-cursor-tracker-private.h"
+#include "meta-surface-actor-wayland.h"
 
 #include <string.h>
 
+#define DEFAULT_AXIS_STEP_DISTANCE wl_fixed_from_int (10)
+
 static void meta_wayland_pointer_end_popup_grab (MetaWaylandPointer *pointer);
 
 static void
@@ -355,6 +358,177 @@ count_buttons (const ClutterEvent *event)
   return count;
 }
 
+static void
+update_current_focus (MetaWaylandPointer *pointer,
+                      MetaWaylandSurface *surface)
+{
+  pointer->current = surface;
+  if (surface != pointer->focus_surface)
+    {
+      const MetaWaylandPointerGrabInterface *interface =
+        pointer->grab->interface;
+      interface->focus (pointer->grab, surface);
+    }
+}
+
+static void
+repick_for_event (MetaWaylandPointer *pointer,
+                  const ClutterEvent *for_event)
+{
+  ClutterActor       *actor   = NULL;
+  MetaWaylandSurface *surface = NULL;
+  MetaDisplay        *display = meta_get_display ();
+
+  if (meta_grab_op_should_block_wayland (display->grab_op))
+    {
+      update_current_focus (pointer, NULL);
+      return;
+    }
+
+  if (for_event)
+    {
+      actor = clutter_event_get_source (for_event);
+    }
+  else
+    {
+      ClutterDeviceManager *device_manager = clutter_device_manager_get_default ();
+      ClutterInputDevice *device = clutter_device_manager_get_device (device_manager, 
META_VIRTUAL_CORE_POINTER_ID);
+      ClutterStage *stage = clutter_input_device_get_pointer_stage (device);
+
+      if (stage)
+        actor = clutter_stage_get_actor_at_pos (stage,
+                                                CLUTTER_PICK_REACTIVE,
+                                                wl_fixed_to_double (pointer->x),
+                                                wl_fixed_to_double (pointer->y));
+    }
+
+  if (META_IS_SURFACE_ACTOR_WAYLAND (actor))
+    surface = meta_surface_actor_wayland_get_surface (META_SURFACE_ACTOR_WAYLAND (actor));
+
+  update_current_focus (pointer, surface);
+}
+
+static void
+notify_motion (MetaWaylandPointer *pointer,
+               const ClutterEvent *event)
+{
+  repick_for_event (pointer, event);
+
+  pointer->grab->interface->motion (pointer->grab, event);
+}
+
+static void
+handle_motion_event (MetaWaylandPointer *pointer,
+                     const ClutterEvent *event)
+{
+  notify_motion (pointer, event);
+}
+
+static void
+handle_button_event (MetaWaylandPointer *pointer,
+                     const ClutterEvent *event)
+{
+  gboolean implicit_grab;
+
+  notify_motion (pointer, event);
+
+  implicit_grab = (event->type == CLUTTER_BUTTON_PRESS) && (pointer->button_count == 1);
+  if (implicit_grab)
+    {
+      pointer->grab_button = clutter_event_get_button (event);
+      pointer->grab_time = clutter_event_get_time (event);
+      pointer->grab_x = pointer->x;
+      pointer->grab_y = pointer->y;
+    }
+
+  pointer->grab->interface->button (pointer->grab, event);
+
+  if (implicit_grab)
+    pointer->grab_serial = wl_display_get_serial (pointer->display);
+}
+
+static void
+handle_scroll_event (MetaWaylandPointer *pointer,
+                     const ClutterEvent *event)
+{
+  struct wl_resource *resource;
+  struct wl_list *l;
+  wl_fixed_t x_value = 0, y_value = 0;
+
+  notify_motion (pointer, event);
+
+  if (clutter_event_is_pointer_emulated (event))
+    return;
+
+  switch (clutter_event_get_scroll_direction (event))
+    {
+    case CLUTTER_SCROLL_UP:
+      y_value = -DEFAULT_AXIS_STEP_DISTANCE;
+      break;
+
+    case CLUTTER_SCROLL_DOWN:
+      y_value = DEFAULT_AXIS_STEP_DISTANCE;
+      break;
+
+    case CLUTTER_SCROLL_LEFT:
+      x_value = -DEFAULT_AXIS_STEP_DISTANCE;
+      break;
+
+    case CLUTTER_SCROLL_RIGHT:
+      x_value = DEFAULT_AXIS_STEP_DISTANCE;
+      break;
+
+    case CLUTTER_SCROLL_SMOOTH:
+      {
+        double dx, dy;
+        clutter_event_get_scroll_delta (event, &dx, &dy);
+        x_value = wl_fixed_from_double (dx);
+        y_value = wl_fixed_from_double (dy);
+      }
+      break;
+
+    default:
+      return;
+    }
+
+  l = &pointer->focus_resource_list;
+  wl_resource_for_each (resource, l)
+    {
+      if (x_value)
+        wl_pointer_send_axis (resource, clutter_event_get_time (event),
+                              WL_POINTER_AXIS_HORIZONTAL_SCROLL, x_value);
+      if (y_value)
+        wl_pointer_send_axis (resource, clutter_event_get_time (event),
+                              WL_POINTER_AXIS_VERTICAL_SCROLL, y_value);
+    }
+}
+
+gboolean
+meta_wayland_pointer_handle_event (MetaWaylandPointer *pointer,
+                                   const ClutterEvent *event)
+{
+  switch (event->type)
+    {
+    case CLUTTER_MOTION:
+      handle_motion_event (pointer, event);
+      break;
+
+    case CLUTTER_BUTTON_PRESS:
+    case CLUTTER_BUTTON_RELEASE:
+      handle_button_event (pointer, event);
+      break;
+
+    case CLUTTER_SCROLL:
+      handle_scroll_event (pointer, event);
+      break;
+
+    default:
+      break;
+    }
+
+  return FALSE;
+}
+
 void
 meta_wayland_pointer_update (MetaWaylandPointer *pointer,
                              const ClutterEvent *event)
@@ -379,31 +553,6 @@ meta_wayland_pointer_update (MetaWaylandPointer *pointer,
 }
 
 static void
-pointer_set_cursor (struct wl_client *client,
-                    struct wl_resource *resource,
-                    uint32_t serial,
-                    struct wl_resource *surface_resource,
-                    int32_t x, int32_t y)
-{
-  MetaWaylandPointer *pointer = wl_resource_get_user_data (resource);
-  MetaWaylandSurface *surface;
-
-  surface = (surface_resource ? wl_resource_get_user_data (surface_resource) : NULL);
-
-  if (pointer->focus_surface == NULL)
-    return;
-  if (wl_resource_get_client (pointer->focus_surface->resource) != client)
-    return;
-  if (pointer->focus_serial - serial > G_MAXUINT32 / 2)
-    return;
-
-  pointer->hotspot_x = x;
-  pointer->hotspot_y = y;
-  set_cursor_surface (pointer, surface);
-  meta_wayland_pointer_update_cursor_surface (pointer);
-}
-
-static void
 move_resources (struct wl_list *destination, struct wl_list *source)
 {
   wl_list_insert_list (destination, source);
@@ -677,6 +826,12 @@ meta_wayland_pointer_start_popup_grab (MetaWaylandPointer *pointer,
 }
 
 void
+meta_wayland_pointer_repick (MetaWaylandPointer *pointer)
+{
+  repick_for_event (pointer, NULL);
+}
+
+void
 meta_wayland_pointer_get_relative_coordinates (MetaWaylandPointer *pointer,
                                               MetaWaylandSurface *surface,
                                               wl_fixed_t         *sx,
@@ -701,19 +856,6 @@ meta_wayland_pointer_get_relative_coordinates (MetaWaylandPointer *pointer,
 }
 
 void
-meta_wayland_pointer_update_current_focus (MetaWaylandPointer *pointer,
-                                           MetaWaylandSurface *surface)
-{
-  pointer->current = surface;
-  if (surface != pointer->focus_surface)
-    {
-      const MetaWaylandPointerGrabInterface *interface =
-        pointer->grab->interface;
-      interface->focus (pointer->grab, surface);
-    }
-}
-
-void
 meta_wayland_pointer_update_cursor_surface (MetaWaylandPointer *pointer)
 {
   MetaCursorReference *cursor;
@@ -739,6 +881,31 @@ meta_wayland_pointer_update_cursor_surface (MetaWaylandPointer *pointer)
 }
 
 static void
+pointer_set_cursor (struct wl_client *client,
+                    struct wl_resource *resource,
+                    uint32_t serial,
+                    struct wl_resource *surface_resource,
+                    int32_t x, int32_t y)
+{
+  MetaWaylandPointer *pointer = wl_resource_get_user_data (resource);
+  MetaWaylandSurface *surface;
+
+  surface = (surface_resource ? wl_resource_get_user_data (surface_resource) : NULL);
+
+  if (pointer->focus_surface == NULL)
+    return;
+  if (wl_resource_get_client (pointer->focus_surface->resource) != client)
+    return;
+  if (pointer->focus_serial - serial > G_MAXUINT32 / 2)
+    return;
+
+  pointer->hotspot_x = x;
+  pointer->hotspot_y = y;
+  set_cursor_surface (pointer, surface);
+  meta_wayland_pointer_update_cursor_surface (pointer);
+}
+
+static void
 pointer_release (struct wl_client *client,
                  struct wl_resource *resource)
 {
diff --git a/src/wayland/meta-wayland-pointer.h b/src/wayland/meta-wayland-pointer.h
index e45e357..32e9458 100644
--- a/src/wayland/meta-wayland-pointer.h
+++ b/src/wayland/meta-wayland-pointer.h
@@ -86,6 +86,10 @@ void
 meta_wayland_pointer_update (MetaWaylandPointer *pointer,
                              const ClutterEvent *event);
 
+gboolean
+meta_wayland_pointer_handle_event (MetaWaylandPointer *pointer,
+                                   const ClutterEvent *event);
+
 void
 meta_wayland_pointer_set_focus (MetaWaylandPointer *pointer,
                                 MetaWaylandSurface *surface);
@@ -102,16 +106,15 @@ meta_wayland_pointer_start_popup_grab (MetaWaylandPointer *pointer,
                                       MetaWaylandSurface *popup);
 
 void
+meta_wayland_pointer_repick (MetaWaylandPointer *pointer);
+
+void
 meta_wayland_pointer_get_relative_coordinates (MetaWaylandPointer *pointer,
                                               MetaWaylandSurface *surface,
                                               wl_fixed_t         *x,
                                               wl_fixed_t         *y);
 
 void
-meta_wayland_pointer_update_current_focus (MetaWaylandPointer *pointer,
-                                           MetaWaylandSurface *surface);
-
-void
 meta_wayland_pointer_update_cursor_surface (MetaWaylandPointer *pointer);
 
 void
diff --git a/src/wayland/meta-wayland-seat.c b/src/wayland/meta-wayland-seat.c
index 4e3ef8e..4498102 100644
--- a/src/wayland/meta-wayland-seat.c
+++ b/src/wayland/meta-wayland-seat.c
@@ -38,9 +38,6 @@
 #include "meta-shaped-texture-private.h"
 #include "meta-wayland-stage.h"
 #include "meta-cursor-tracker-private.h"
-#include "meta-surface-actor-wayland.h"
-
-#define DEFAULT_AXIS_STEP_DISTANCE wl_fixed_from_int (10)
 
 static void
 unbind_resource (struct wl_resource *resource)
@@ -183,138 +180,6 @@ meta_wayland_seat_update (MetaWaylandSeat    *seat,
     }
 }
 
-static void
-repick_for_event (MetaWaylandPointer *pointer,
-                  const ClutterEvent *for_event)
-{
-  ClutterActor       *actor   = NULL;
-  MetaWaylandSurface *surface = NULL;
-  MetaDisplay        *display = meta_get_display ();
-
-  if (meta_grab_op_should_block_wayland (display->grab_op))
-    {
-      meta_wayland_pointer_update_current_focus (pointer, NULL);
-      return;
-    }
-
-  if (for_event)
-    {
-      actor = clutter_event_get_source (for_event);
-    }
-  else
-    {
-      ClutterDeviceManager *device_manager = clutter_device_manager_get_default ();
-      ClutterInputDevice *device = clutter_device_manager_get_device (device_manager, 
META_VIRTUAL_CORE_POINTER_ID);
-      ClutterStage *stage = clutter_input_device_get_pointer_stage (device);
-
-      if (stage)
-        actor = clutter_stage_get_actor_at_pos (stage,
-                                                CLUTTER_PICK_REACTIVE,
-                                                wl_fixed_to_double (pointer->x),
-                                                wl_fixed_to_double (pointer->y));
-    }
-
-  if (META_IS_SURFACE_ACTOR_WAYLAND (actor))
-    surface = meta_surface_actor_wayland_get_surface (META_SURFACE_ACTOR_WAYLAND (actor));
-
-  meta_wayland_pointer_update_current_focus (pointer, surface);
-}
-
-static void
-notify_motion (MetaWaylandPointer *pointer,
-               const ClutterEvent *event)
-{
-  repick_for_event (pointer, event);
-
-  pointer->grab->interface->motion (pointer->grab, event);
-}
-
-static void
-handle_motion_event (MetaWaylandPointer *pointer,
-                     const ClutterEvent *event)
-{
-  notify_motion (pointer, event);
-}
-
-static void
-handle_button_event (MetaWaylandPointer *pointer,
-                     const ClutterEvent *event)
-{
-  gboolean implicit_grab;
-
-  notify_motion (pointer, event);
-
-  implicit_grab = (event->type == CLUTTER_BUTTON_PRESS) && (pointer->button_count == 1);
-  if (implicit_grab)
-    {
-      pointer->grab_button = clutter_event_get_button (event);
-      pointer->grab_time = clutter_event_get_time (event);
-      pointer->grab_x = pointer->x;
-      pointer->grab_y = pointer->y;
-    }
-
-  pointer->grab->interface->button (pointer->grab, event);
-
-  if (implicit_grab)
-    pointer->grab_serial = wl_display_get_serial (pointer->display);
-}
-
-static void
-handle_scroll_event (MetaWaylandPointer *pointer,
-                     const ClutterEvent *event)
-{
-  struct wl_resource *resource;
-  struct wl_list *l;
-  wl_fixed_t x_value = 0, y_value = 0;
-
-  notify_motion (pointer, event);
-
-  if (clutter_event_is_pointer_emulated (event))
-    return;
-
-  switch (clutter_event_get_scroll_direction (event))
-    {
-    case CLUTTER_SCROLL_UP:
-      y_value = -DEFAULT_AXIS_STEP_DISTANCE;
-      break;
-
-    case CLUTTER_SCROLL_DOWN:
-      y_value = DEFAULT_AXIS_STEP_DISTANCE;
-      break;
-
-    case CLUTTER_SCROLL_LEFT:
-      x_value = -DEFAULT_AXIS_STEP_DISTANCE;
-      break;
-
-    case CLUTTER_SCROLL_RIGHT:
-      x_value = DEFAULT_AXIS_STEP_DISTANCE;
-      break;
-
-    case CLUTTER_SCROLL_SMOOTH:
-      {
-        double dx, dy;
-        clutter_event_get_scroll_delta (event, &dx, &dy);
-        x_value = wl_fixed_from_double (dx);
-        y_value = wl_fixed_from_double (dy);
-      }
-      break;
-
-    default:
-      return;
-    }
-
-  l = &pointer->focus_resource_list;
-  wl_resource_for_each (resource, l)
-    {
-      if (x_value)
-        wl_pointer_send_axis (resource, clutter_event_get_time (event),
-                              WL_POINTER_AXIS_HORIZONTAL_SCROLL, x_value);
-      if (y_value)
-        wl_pointer_send_axis (resource, clutter_event_get_time (event),
-                              WL_POINTER_AXIS_VERTICAL_SCROLL, y_value);
-    }
-}
-
 gboolean
 meta_wayland_seat_handle_event (MetaWaylandSeat *seat,
                                 const ClutterEvent *event)
@@ -322,17 +187,10 @@ meta_wayland_seat_handle_event (MetaWaylandSeat *seat,
   switch (event->type)
     {
     case CLUTTER_MOTION:
-      handle_motion_event (&seat->pointer, event);
-      break;
-
     case CLUTTER_BUTTON_PRESS:
     case CLUTTER_BUTTON_RELEASE:
-      handle_button_event (&seat->pointer, event);
-      break;
-
     case CLUTTER_SCROLL:
-      handle_scroll_event (&seat->pointer, event);
-      break;
+      return meta_wayland_pointer_handle_event (&seat->pointer, event);
 
     case CLUTTER_KEY_PRESS:
     case CLUTTER_KEY_RELEASE:
@@ -349,7 +207,7 @@ meta_wayland_seat_handle_event (MetaWaylandSeat *seat,
 void
 meta_wayland_seat_repick (MetaWaylandSeat *seat)
 {
-  repick_for_event (&seat->pointer, NULL);
+  meta_wayland_pointer_repick (&seat->pointer);
 }
 
 void


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