From b704659899eee8f0e7101a9e1f8288cc5401da62 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Tue, 27 May 2014 14:11:23 -0400 Subject: [PATCH] backend: Add an XIWarpPointer wrapper This makes Alt+F7 / Alt+F8 work respectively under X11 nested mode. For the native backend implementation, we'll need a special Clutter function, so don't implement that for now. --- src/backends/meta-backend-private.h | 4 ++++ src/backends/meta-backend.c | 17 +++++++++++++++++ src/backends/meta-backend.h | 4 ++++ src/backends/x11/meta-backend-x11.c | 17 +++++++++++++++++ src/core/window.c | 12 ++++++------ 5 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/backends/meta-backend-private.h b/src/backends/meta-backend-private.h index 44b36ba3c..02b123d5f 100644 --- a/src/backends/meta-backend-private.h +++ b/src/backends/meta-backend-private.h @@ -62,6 +62,10 @@ struct _MetaBackendClass gboolean (* ungrab_device) (MetaBackend *backend, int device_id, uint32_t timestamp); + + void (* warp_pointer) (MetaBackend *backend, + int x, + int y); }; #endif /* META_BACKEND_PRIVATE_H */ diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c index 0c2ae650e..ddad794cb 100644 --- a/src/backends/meta-backend.c +++ b/src/backends/meta-backend.c @@ -100,6 +100,14 @@ meta_backend_real_ungrab_device (MetaBackend *backend, return TRUE; } +static void +meta_backend_real_warp_pointer (MetaBackend *backend, + int x, + int y) +{ + /* Do nothing */ +} + static void meta_backend_class_init (MetaBackendClass *klass) { @@ -111,6 +119,7 @@ meta_backend_class_init (MetaBackendClass *klass) klass->create_cursor_renderer = meta_backend_real_create_cursor_renderer; klass->grab_device = meta_backend_real_grab_device; klass->ungrab_device = meta_backend_real_ungrab_device; + klass->warp_pointer = meta_backend_real_warp_pointer; } static void @@ -189,6 +198,14 @@ meta_backend_ungrab_device (MetaBackend *backend, return META_BACKEND_GET_CLASS (backend)->ungrab_device (backend, device_id, timestamp); } +void +meta_backend_warp_pointer (MetaBackend *backend, + int x, + int y) +{ + META_BACKEND_GET_CLASS (backend)->warp_pointer (backend, x, y); +} + static GType get_backend_type (void) { diff --git a/src/backends/meta-backend.h b/src/backends/meta-backend.h index 9bcfd8ee6..f93b6f6cb 100644 --- a/src/backends/meta-backend.h +++ b/src/backends/meta-backend.h @@ -50,6 +50,10 @@ gboolean meta_backend_ungrab_device (MetaBackend *backend, int device_id, uint32_t timestamp); +void meta_backend_warp_pointer (MetaBackend *backend, + int x, + int y); + void meta_clutter_init (void); #endif /* META_BACKEND_H */ diff --git a/src/backends/x11/meta-backend-x11.c b/src/backends/x11/meta-backend-x11.c index 923963bef..7ebeda884 100644 --- a/src/backends/x11/meta-backend-x11.c +++ b/src/backends/x11/meta-backend-x11.c @@ -346,6 +346,22 @@ meta_backend_x11_ungrab_device (MetaBackend *backend, return (ret == Success); } +static void +meta_backend_x11_warp_pointer (MetaBackend *backend, + int x, + int y) +{ + MetaBackendX11 *x11 = META_BACKEND_X11 (backend); + MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11); + + XIWarpPointer (priv->xdisplay, + META_VIRTUAL_CORE_POINTER_ID, + None, + meta_backend_x11_get_xwindow (x11), + 0, 0, 0, 0, + x, y); +} + static void meta_backend_x11_class_init (MetaBackendX11Class *klass) { @@ -358,6 +374,7 @@ meta_backend_x11_class_init (MetaBackendX11Class *klass) backend_class->grab_device = meta_backend_x11_grab_device; backend_class->ungrab_device = meta_backend_x11_ungrab_device; + backend_class->warp_pointer = meta_backend_x11_warp_pointer; } static void diff --git a/src/core/window.c b/src/core/window.c index ed577972a..415ff487b 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -58,6 +58,8 @@ #include "wayland/window-wayland.h" #include "wayland/meta-wayland-private.h" +#include "backends/meta-backend.h" + /* Windows that unmaximize to a size bigger than that fraction of the workarea * will be scaled down to that size (while maintaining aspect ratio). * Windows that cover an area greater then this size are automaximized on map. @@ -6562,12 +6564,10 @@ warp_grab_pointer (MetaWindow *window, meta_window_get_client_root_coords (window, &display->grab_anchor_window_pos); - XIWarpPointer (display->xdisplay, - META_VIRTUAL_CORE_POINTER_ID, - None, - window->screen->xroot, - 0, 0, 0, 0, - *x, *y); + { + MetaBackend *backend = meta_get_backend (); + meta_backend_warp_pointer (backend, *x, *y); + } if (meta_error_trap_pop_with_return (display) != Success) {