[mutter] backend: Add an XIWarpPointer wrapper



commit b704659899eee8f0e7101a9e1f8288cc5401da62
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Tue May 27 14:11:23 2014 -0400

    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 44b36ba..02b123d 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 0c2ae65..ddad794 100644
--- a/src/backends/meta-backend.c
+++ b/src/backends/meta-backend.c
@@ -101,6 +101,14 @@ meta_backend_real_ungrab_device (MetaBackend *backend,
 }
 
 static void
+meta_backend_real_warp_pointer (MetaBackend *backend,
+                                int          x,
+                                int          y)
+{
+  /* Do nothing */
+}
+
+static void
 meta_backend_class_init (MetaBackendClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (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 9bcfd8e..f93b6f6 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 923963b..7ebeda8 100644
--- a/src/backends/x11/meta-backend-x11.c
+++ b/src/backends/x11/meta-backend-x11.c
@@ -347,6 +347,22 @@ meta_backend_x11_ungrab_device (MetaBackend *backend,
 }
 
 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)
 {
   MetaBackendClass *backend_class = META_BACKEND_CLASS (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 ed57797..415ff48 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)
     {


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