[mutter] backend: Move pointer constrainment code to native backend



commit b6a80934d672b554d3d013ae8aed23d45d01fff2
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Mon Apr 21 20:45:24 2014 -0400

    backend: Move pointer constrainment code to native backend

 src/backends/native/meta-backend-native.c |  109 ++++++++++++++++++++++++++++
 src/wayland/meta-wayland-pointer.c        |  113 -----------------------------
 2 files changed, 109 insertions(+), 113 deletions(-)
---
diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
index d0d3a43..dbae974 100644
--- a/src/backends/native/meta-backend-native.c
+++ b/src/backends/native/meta-backend-native.c
@@ -25,6 +25,7 @@
 #include "config.h"
 
 #include <meta/main.h>
+#include <clutter/evdev/clutter-evdev.h>
 #include "meta-backend-native.h"
 
 #include "meta-idle-monitor-native.h"
@@ -63,6 +64,108 @@ meta_backend_native_class_init (MetaBackendNativeClass *klass)
   backend_class->create_monitor_manager = meta_backend_native_create_monitor_manager;
 }
 
+
+/*
+ * The pointer constrain code is mostly a rip-off of the XRandR code from Xorg.
+ * (from xserver/randr/rrcrtc.c, RRConstrainCursorHarder)
+ *
+ * Copyright © 2006 Keith Packard
+ * Copyright 2010 Red Hat, Inc
+ *
+ */
+
+static gboolean
+check_all_screen_monitors(MetaMonitorInfo *monitors,
+                         unsigned         n_monitors,
+                         float            x,
+                         float            y)
+{
+  unsigned int i;
+
+  for (i = 0; i < n_monitors; i++)
+    {
+      MetaMonitorInfo *monitor = &monitors[i];
+      int left, right, top, bottom;
+
+      left = monitor->rect.x;
+      right = left + monitor->rect.width;
+      top = monitor->rect.y;
+      bottom = left + monitor->rect.height;
+
+      if ((x >= left) && (x < right) && (y >= top) && (y < bottom))
+       return TRUE;
+    }
+
+  return FALSE;
+}
+
+static void
+constrain_all_screen_monitors (ClutterInputDevice *device,
+                              MetaMonitorInfo    *monitors,
+                              unsigned            n_monitors,
+                              float              *x,
+                              float              *y)
+{
+  ClutterPoint current;
+  unsigned int i;
+
+  clutter_input_device_get_coords (device, NULL, &current);
+
+  /* if we're trying to escape, clamp to the CRTC we're coming from */
+  for (i = 0; i < n_monitors; i++)
+    {
+      MetaMonitorInfo *monitor = &monitors[i];
+      int left, right, top, bottom;
+      float nx, ny;
+
+      left = monitor->rect.x;
+      right = left + monitor->rect.width;
+      top = monitor->rect.y;
+      bottom = left + monitor->rect.height;
+
+      nx = current.x;
+      ny = current.y;
+
+      if ((nx >= left) && (nx < right) && (ny >= top) && (ny < bottom))
+       {
+         if (*x < left)
+           *x = left;
+         if (*x >= right)
+           *x = right - 1;
+         if (*y < top)
+           *y = top;
+         if (*y >= bottom)
+           *y = bottom - 1;
+
+         return;
+        }
+    }
+}
+
+static void
+pointer_constrain_callback (ClutterInputDevice *device,
+                           guint32             time,
+                           float              *new_x,
+                           float              *new_y,
+                           gpointer            user_data)
+{
+  MetaMonitorManager *monitor_manager;
+  MetaMonitorInfo *monitors;
+  unsigned int n_monitors;
+  gboolean ret;
+
+  monitor_manager = meta_monitor_manager_get ();
+  monitors = meta_monitor_manager_get_monitor_infos (monitor_manager, &n_monitors);
+
+  /* if we're moving inside a monitor, we're fine */
+  ret = check_all_screen_monitors(monitors, n_monitors, *new_x, *new_y);
+  if (ret == TRUE)
+    return;
+
+  /* if we're trying to escape, clamp to the CRTC we're coming from */
+  constrain_all_screen_monitors(device, monitors, n_monitors, new_x, new_y);
+}
+
 static void
 meta_backend_native_init (MetaBackendNative *native)
 {
@@ -70,6 +173,12 @@ meta_backend_native_init (MetaBackendNative *native)
 
   /* We're a display server, so start talking to weston-launch. */
   priv->launcher = meta_launcher_new ();
+
+  {
+    ClutterDeviceManager *manager = clutter_device_manager_get_default ();
+    clutter_evdev_set_pointer_constrain_callback (manager, pointer_constrain_callback,
+                                                  NULL, NULL);
+  }
 }
 
 gboolean
diff --git a/src/wayland/meta-wayland-pointer.c b/src/wayland/meta-wayland-pointer.c
index 5243413..60d0155 100644
--- a/src/wayland/meta-wayland-pointer.c
+++ b/src/wayland/meta-wayland-pointer.c
@@ -44,7 +44,6 @@
 #include "config.h"
 
 #include <clutter/clutter.h>
-#include <clutter/evdev/clutter-evdev.h>
 #include <linux/input.h>
 
 #include "meta-wayland-pointer.h"
@@ -184,107 +183,6 @@ static const MetaWaylandPointerGrabInterface default_pointer_grab_interface = {
   default_grab_button
 };
 
-/*
- * The pointer constrain code is mostly a rip-off of the XRandR code from Xorg.
- * (from xserver/randr/rrcrtc.c, RRConstrainCursorHarder)
- *
- * Copyright © 2006 Keith Packard
- * Copyright 2010 Red Hat, Inc
- *
- */
-
-static gboolean
-check_all_screen_monitors(MetaMonitorInfo *monitors,
-                         unsigned         n_monitors,
-                         float            x,
-                         float            y)
-{
-  unsigned int i;
-
-  for (i = 0; i < n_monitors; i++)
-    {
-      MetaMonitorInfo *monitor = &monitors[i];
-      int left, right, top, bottom;
-
-      left = monitor->rect.x;
-      right = left + monitor->rect.width;
-      top = monitor->rect.y;
-      bottom = left + monitor->rect.height;
-
-      if ((x >= left) && (x < right) && (y >= top) && (y < bottom))
-       return TRUE;
-    }
-
-  return FALSE;
-}
-
-static void
-constrain_all_screen_monitors (ClutterInputDevice *device,
-                              MetaMonitorInfo    *monitors,
-                              unsigned            n_monitors,
-                              float              *x,
-                              float              *y)
-{
-  ClutterPoint current;
-  unsigned int i;
-
-  clutter_input_device_get_coords (device, NULL, &current);
-
-  /* if we're trying to escape, clamp to the CRTC we're coming from */
-  for (i = 0; i < n_monitors; i++)
-    {
-      MetaMonitorInfo *monitor = &monitors[i];
-      int left, right, top, bottom;
-      float nx, ny;
-
-      left = monitor->rect.x;
-      right = left + monitor->rect.width;
-      top = monitor->rect.y;
-      bottom = left + monitor->rect.height;
-
-      nx = current.x;
-      ny = current.y;
-
-      if ((nx >= left) && (nx < right) && (ny >= top) && (ny < bottom))
-       {
-         if (*x < left)
-           *x = left;
-         if (*x >= right)
-           *x = right - 1;
-         if (*y < top)
-           *y = top;
-         if (*y >= bottom)
-           *y = bottom - 1;
-
-         return;
-        }
-    }
-}
-
-static void
-pointer_constrain_callback (ClutterInputDevice *device,
-                           guint32             time,
-                           float              *new_x,
-                           float              *new_y,
-                           gpointer            user_data)
-{
-  MetaMonitorManager *monitor_manager;
-  MetaMonitorInfo *monitors;
-  unsigned int n_monitors;
-  gboolean ret;
-
-  monitor_manager = meta_monitor_manager_get ();
-  monitors = meta_monitor_manager_get_monitor_infos (monitor_manager, &n_monitors);
-
-  /* if we're moving inside a monitor, we're fine */
-  ret = check_all_screen_monitors(monitors, n_monitors, *new_x, *new_y);
-  if (ret == TRUE)
-    return;
-
-  /* if we're trying to escape, clamp to the CRTC we're coming from */
-  constrain_all_screen_monitors(device, monitors, n_monitors, new_x, new_y);
-}
-
 void
 meta_wayland_pointer_init (MetaWaylandPointer *pointer,
                            struct wl_display  *display)
@@ -311,17 +209,6 @@ meta_wayland_pointer_init (MetaWaylandPointer *pointer,
 
   manager = clutter_device_manager_get_default ();
   pointer->device = clutter_device_manager_get_core_device (manager, CLUTTER_POINTER_DEVICE);
-
-#if defined(CLUTTER_WINDOWING_EGL)
-  /* XXX -- the evdev backend can be used regardless of the
-   * windowing backend. To do this properly we need a Clutter
-   * API to check the input backend. */
-  if (clutter_check_windowing_backend (CLUTTER_WINDOWING_EGL))
-    {
-      clutter_evdev_set_pointer_constrain_callback (manager, pointer_constrain_callback,
-                                                    pointer, NULL);
-    }
-#endif
 }
 
 void


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