[gtk+/xi2: 934/1239] GdkDisplayX11: Add gdk_display_pointer_ungrab() device-aware replacement.



commit 8d7432ab864e43ab10cdb1d8a89c986032761b04
Author: Carlos Garnacho <carlos lanedo com>
Date:   Sat Aug 29 20:14:57 2009 +0200

    GdkDisplayX11: Add gdk_display_pointer_ungrab() device-aware replacement.
    
    gdk_display_pointer_ungrab() is now in GdkDisplay, which behaves similar to
    gdk_pointer_grab() but calling gdk_display_device_ungrab().

 gdk/gdk.symbols          |    3 ++-
 gdk/gdkdisplay.c         |   37 +++++++++++++++++++++++++++++++++++++
 gdk/gdkdisplay.h         |    3 +++
 gdk/gdkwindow.c          |    3 +++
 gdk/x11/gdkdisplay-x11.c |   35 +++++++++++++++++------------------
 5 files changed, 62 insertions(+), 19 deletions(-)
---
diff --git a/gdk/gdk.symbols b/gdk/gdk.symbols
index 45aaff3..bcfe0c3 100644
--- a/gdk/gdk.symbols
+++ b/gdk/gdk.symbols
@@ -417,6 +417,7 @@ gdk_display_get_pointer
 gdk_display_get_type G_GNUC_CONST
 gdk_display_get_window_at_pointer
 gdk_display_peek_event
+gdk_display_pointer_ungrab
 gdk_display_put_event
 gdk_display_set_pointer_hooks
 #endif
@@ -453,7 +454,7 @@ gdk_display_get_default_screen
 gdk_display_get_name
 gdk_display_get_n_screens
 gdk_display_get_screen
-gdk_display_pointer_ungrab
+gdk_display_device_ungrab
 gdk_display_keyboard_ungrab
 gdk_display_open
 gdk_display_request_selection_notification
diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c
index cf131bd..849ec36 100644
--- a/gdk/gdkdisplay.c
+++ b/gdk/gdkdisplay.c
@@ -359,6 +359,43 @@ gdk_display_put_event (GdkDisplay     *display,
 }
 
 /**
+ * gdk_display_pointer_ungrab:
+ * @display: a #GdkDisplay.
+ * @time_: a timestap (e.g. %GDK_CURRENT_TIME).
+ *
+ * Release any pointer grab.
+ *
+ * Since: 2.2
+ */
+void
+gdk_display_pointer_ungrab (GdkDisplay *display,
+			    guint32     time_)
+{
+  GdkDeviceManager *device_manager;
+  GList *devices, *dev;
+  GdkDevice *device;
+
+  g_return_if_fail (GDK_IS_DISPLAY (display));
+
+  device_manager = gdk_device_manager_get_for_display (display);
+  devices = gdk_device_manager_get_devices (device_manager, GDK_DEVICE_TYPE_MASTER);
+
+  /* FIXME: Should this be generic to all backends? */
+  /* FIXME: What happens with extended devices? */
+  for (dev = devices; dev; dev = dev->next)
+    {
+      device = dev->data;
+
+      if (device->source != GDK_SOURCE_MOUSE)
+        continue;
+
+      gdk_display_device_ungrab (display, device, time_);
+    }
+
+  g_list_free (devices);
+}
+
+/**
  * gdk_pointer_ungrab:
  * @time_: a timestamp from a #GdkEvent, or %GDK_CURRENT_TIME if no 
  *  timestamp is available.
diff --git a/gdk/gdkdisplay.h b/gdk/gdkdisplay.h
index 0ecc7bc..c75f15f 100644
--- a/gdk/gdkdisplay.h
+++ b/gdk/gdkdisplay.h
@@ -178,6 +178,9 @@ GdkScreen * gdk_display_get_screen         (GdkDisplay  *display,
 GdkScreen * gdk_display_get_default_screen (GdkDisplay  *display);
 void        gdk_display_pointer_ungrab     (GdkDisplay  *display,
 					    guint32      time_);
+void        gdk_display_device_ungrab      (GdkDisplay  *display,
+                                            GdkDevice   *device,
+                                            guint32      time_);
 void        gdk_display_keyboard_ungrab    (GdkDisplay  *display,
 					    guint32      time_);
 gboolean    gdk_display_pointer_is_grabbed (GdkDisplay  *display);
diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
index 4c74ecb..2f18cc8 100644
--- a/gdk/gdkwindow.c
+++ b/gdk/gdkwindow.c
@@ -9302,6 +9302,7 @@ gdk_pointer_grab (GdkWindow *	  window,
   devices = gdk_device_manager_get_devices (device_manager, GDK_DEVICE_TYPE_MASTER);
 
   /* FIXME: Should this be generic to all backends? */
+  /* FIXME: What happens with extended devices? */
   for (dev = devices; dev; dev = dev->next)
     {
       device = dev->data;
@@ -9332,6 +9333,8 @@ gdk_pointer_grab (GdkWindow *	  window,
 
   /* FIXME: handle errors when grabbing */
 
+  g_list_free (devices);
+
   return res;
 }
 
diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c
index fd8ca3f..c42f5eb 100644
--- a/gdk/x11/gdkdisplay-x11.c
+++ b/gdk/x11/gdkdisplay-x11.c
@@ -39,6 +39,7 @@
 #include "gdkscreen.h"
 #include "gdkscreen-x11.h"
 #include "gdkinternals.h"
+#include "gdkdeviceprivate.h"
 #include "xsettings-client.h"
 #include "gdkalias.h"
 
@@ -1584,12 +1585,13 @@ struct XPointerUngrabInfo {
 };
 
 static void
-pointer_ungrab_callback (GdkDisplay *display,
-			 gpointer data,
-			 gulong serial)
+device_ungrab_callback (GdkDisplay *display,
+                        gpointer    data,
+                        gulong      serial)
 {
-  /* FIXME: which device? */
-  _gdk_display_pointer_grab_update (display, display->core_pointer, serial);
+  GdkDevice *device = data;
+
+  _gdk_display_pointer_grab_update (display, device, serial);
 }
 
 
@@ -1608,8 +1610,9 @@ pointer_ungrab_callback (GdkDisplay *display,
  * Since: 2.2
  */
 void
-gdk_display_pointer_ungrab (GdkDisplay *display,
-			    guint32     time_)
+gdk_display_device_ungrab (GdkDisplay *display,
+                           GdkDevice  *device,
+                           guint32     time_)
 {
   Display *xdisplay;
   GdkDisplayX11 *display_x11;
@@ -1617,30 +1620,26 @@ gdk_display_pointer_ungrab (GdkDisplay *display,
   unsigned long serial;
 
   g_return_if_fail (GDK_IS_DISPLAY (display));
+  g_return_if_fail (GDK_IS_DEVICE (device));
 
   display_x11 = GDK_DISPLAY_X11 (display);
   xdisplay = GDK_DISPLAY_XDISPLAY (display);
 
   serial = NextRequest (xdisplay);
-  
-#if 0
-  _gdk_input_ungrab_pointer (display, time_);
-#endif
-  /* FIXME: Use GdkDevice::ungrab */
-  XUngrabPointer (xdisplay, time_);
+
+  GDK_DEVICE_GET_CLASS (device)->ungrab (device, time_);
   XFlush (xdisplay);
 
-  /* FIXME: which device? */
-  grab = _gdk_display_get_last_pointer_grab (display, display->core_pointer);
+  grab = _gdk_display_get_last_pointer_grab (display, device);
   if (grab &&
       (time_ == GDK_CURRENT_TIME ||
        grab->time == GDK_CURRENT_TIME ||
        !XSERVER_TIME_IS_LATER (grab->time, time_)))
     {
       grab->serial_end = serial;
-      _gdk_x11_roundtrip_async (display, 
-				pointer_ungrab_callback,
-				NULL);
+      _gdk_x11_roundtrip_async (display,
+				device_ungrab_callback,
+				device);
     }
 }
 



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