[mutter/wip/xinput2r: 51/66] window: set the corresponding client pointer on focused windows.



commit c6a52f8892420516e6edae047bef6bde5d2d9f82
Author: Carlos Garnacho <carlosg gnome org>
Date:   Tue Jul 19 20:55:05 2011 +0200

    window: set the corresponding client pointer on focused windows.
    
    The client window determines the device pair that is used for
    core protocol calls such as XQueryPointer(), so different
    clients using the core protocol can be focused by different
    devices simultaneously.

 src/core/window-private.h |    4 ++++
 src/core/window.c         |   28 ++++++++++++++++++++++++++++
 2 files changed, 32 insertions(+), 0 deletions(-)
---
diff --git a/src/core/window-private.h b/src/core/window-private.h
index f06c639..9159079 100644
--- a/src/core/window-private.h
+++ b/src/core/window-private.h
@@ -664,6 +664,10 @@ gboolean meta_window_can_tile_side_by_side   (MetaWindow *window,
 
 void meta_window_compute_tile_match (MetaWindow *window);
 
+void         meta_window_set_client_pointer (MetaWindow *window,
+                                             MetaDevice *pointer);
+MetaDevice * meta_window_get_client_pointer (MetaWindow *window);
+
 MetaDevice * meta_window_guess_grab_pointer (MetaWindow *window);
 
 #endif
diff --git a/src/core/window.c b/src/core/window.c
index f8a03cd..01650e8 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -7091,6 +7091,8 @@ meta_window_notify_focus (MetaWindow *window,
               !meta_prefs_get_raise_on_click())
             meta_display_ungrab_focus_window_button (window->display, window);
 
+          meta_window_set_client_pointer (window,
+                                          meta_device_get_paired_device (keyboard));
           g_signal_emit (window, window_signals[FOCUS], 0);
 
           if (meta_device_get_id (keyboard) == META_CORE_KEYBOARD_ID)
@@ -11062,6 +11064,32 @@ meta_window_compute_tile_match (MetaWindow *window)
     }
 }
 
+void
+meta_window_set_client_pointer (MetaWindow *window,
+                                MetaDevice *pointer)
+{
+#ifdef HAVE_XINPUT2
+  XISetClientPointer (window->display->xdisplay,
+                      window->xwindow,
+                      meta_device_get_id (pointer));
+#endif
+}
+
+MetaDevice *
+meta_window_get_client_pointer (MetaWindow *window)
+{
+  int device_id = META_CORE_POINTER_ID;
+
+#ifdef HAVE_XINPUT2
+  if (window->display->have_xinput2)
+    XIGetClientPointer (window->display->xdisplay,
+                        window->xwindow, &device_id);
+#endif
+
+  return meta_device_map_lookup (window->display->device_map,
+                                 device_id);
+}
+
 /* Guesses the better device to grab on if a grab is to be started,
  * only should be be used in circumstances where we don't know a
  * device at all.



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