diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c index d0d3a4343..dbae9744c 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 +#include #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 5243413bd..60d015595 100644 --- a/src/wayland/meta-wayland-pointer.c +++ b/src/wayland/meta-wayland-pointer.c @@ -44,7 +44,6 @@ #include "config.h" #include -#include #include #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