[gtk+/xi2: 934/1239] GdkDisplayX11: Add gdk_display_pointer_ungrab() device-aware replacement.
- From: Carlos Garnacho <carlosg src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gtk+/xi2: 934/1239] GdkDisplayX11: Add gdk_display_pointer_ungrab() device-aware replacement.
- Date: Tue, 29 Sep 2009 10:54:17 +0000 (UTC)
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]