[mutter] backend: Move pointer constrainment code to native backend
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] backend: Move pointer constrainment code to native backend
- Date: Tue, 22 Apr 2014 01:05:37 +0000 (UTC)
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, ¤t);
+
+ /* 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, ¤t);
-
- /* 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]