From a169f6e32df4012a61ec151c28b64cf26af7feb6 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 10 Dec 2010 12:13:25 -0500 Subject: [PATCH] Make GdkDevice parallel-implementable Use the grab and ungrab vfuncs from the frontend instead of the _gdk_windowing wrappers, and move some things around accordingly. Again, only the X11 backend has been updated, other backends need to be updated to match. --- gdk/gdkdevice.c | 49 +++++++++++++++++++++++---------- gdk/gdkinternals.h | 10 ------- gdk/gdkwindow.c | 30 ++++++++++----------- gdk/x11/gdkdevice-core.c | 14 +++++++++- gdk/x11/gdkdevice-core.h | 2 +- gdk/x11/gdkdevice-xi.c | 25 +++++++++++++---- gdk/x11/gdkdevice-xi.h | 3 ++- gdk/x11/gdkdevice-xi2.c | 18 ++++++++++--- gdk/x11/gdkdevice-xi2.h | 3 ++- gdk/x11/gdkdisplay-x11.c | 58 ++++++++++++++-------------------------- gdk/x11/gdkmain-x11.c | 47 -------------------------------- gdk/x11/gdkprivate-x11.h | 9 +++++++ 12 files changed, 130 insertions(+), 138 deletions(-) diff --git a/gdk/gdkdevice.c b/gdk/gdkdevice.c index f7269f3dba..e81540a7a9 100644 --- a/gdk/gdkdevice.c +++ b/gdk/gdkdevice.c @@ -21,9 +21,9 @@ #include "gdkdevice.h" +#include "gdkinternals.h" #include "gdkdeviceprivate.h" #include "gdkintl.h" -#include "gdkinternals.h" typedef struct _GdkDeviceKey GdkDeviceKey; @@ -1185,8 +1185,8 @@ gdk_device_grab (GdkDevice *device, GdkGrabStatus res; GdkWindow *native; - g_return_val_if_fail (GDK_IS_DEVICE (device), 0); - g_return_val_if_fail (GDK_IS_WINDOW (window), 0); + g_return_val_if_fail (GDK_IS_DEVICE (device), GDK_GRAB_SUCCESS); + g_return_val_if_fail (GDK_IS_WINDOW (window), GDK_GRAB_SUCCESS); if (_gdk_native_windows) native = window; @@ -1198,21 +1198,23 @@ gdk_device_grab (GdkDevice *device, native = gdk_offscreen_window_get_embedder (native); if (native == NULL || - (!_gdk_window_has_impl (native) && - !gdk_window_is_viewable (native))) - return GDK_GRAB_NOT_VIEWABLE; + (!_gdk_window_has_impl (native) && + !gdk_window_is_viewable (native))) + return GDK_GRAB_NOT_VIEWABLE; native = gdk_window_get_toplevel (native); } - res = _gdk_windowing_device_grab (device, - window, - native, - owner_events, - get_native_grab_event_mask (event_mask), - NULL, - cursor, - time_); + if (native == NULL || GDK_WINDOW_DESTROYED (native)) + return GDK_GRAB_NOT_VIEWABLE; + + res = GDK_DEVICE_GET_CLASS (device)->grab (device, + native, + owner_events, + get_native_grab_event_mask (event_mask), + NULL, + cursor, + time_); if (res == GDK_GRAB_SUCCESS) { @@ -1237,6 +1239,24 @@ gdk_device_grab (GdkDevice *device, return res; } +/** + * gdk_device_ungrab: + * @device: a #GdkDevice + * @time_: a timestap (e.g. %GDK_CURRENT_TIME). + * + * Release any grab on @device. + * + * Since: 3.0 + */ +void +gdk_device_ungrab (GdkDevice *device, + guint32 time_) +{ + g_return_if_fail (GDK_IS_DEVICE (device)); + + GDK_DEVICE_GET_CLASS (device)->ungrab (device, time_); +} + /* Private API */ void _gdk_device_reset_axes (GdkDevice *device) @@ -1536,3 +1556,4 @@ _gdk_device_translate_axis (GdkDevice *device, return TRUE; } + diff --git a/gdk/gdkinternals.h b/gdk/gdkinternals.h index 4df0aeacf0..5d1944c447 100644 --- a/gdk/gdkinternals.h +++ b/gdk/gdkinternals.h @@ -30,8 +30,6 @@ #define __GDK_INTERNALS_H__ #include -#include -#include #include #include @@ -634,14 +632,6 @@ GdkWindow* _gdk_windowing_window_at_device_position (GdkDisplay *display, gint *win_y, GdkModifierType *mask, gboolean get_toplevel); -GdkGrabStatus _gdk_windowing_device_grab (GdkDevice *device, - GdkWindow *window, - GdkWindow *native, - gboolean owner_events, - GdkEventMask event_mask, - GdkWindow *confine_to, - GdkCursor *cursor, - guint32 time); void _gdk_windowing_got_event (GdkDisplay *display, GList *event_link, GdkEvent *event, diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index feedce13cc..3938d30cbc 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -8726,14 +8726,13 @@ gdk_pointer_grab (GdkWindow * window, if (gdk_device_get_source (device) != GDK_SOURCE_MOUSE) continue; - res = _gdk_windowing_device_grab (device, - window, - native, - owner_events, - get_native_grab_event_mask (event_mask), - confine_to, - cursor, - time); + res = GDK_DEVICE_GET_CLASS (device)->grab (device, + native, + owner_events, + get_native_grab_event_mask (event_mask), + confine_to, + cursor, + time); if (res == GDK_GRAB_SUCCESS) _gdk_display_add_device_grab (display, @@ -8831,14 +8830,13 @@ gdk_keyboard_grab (GdkWindow *window, if (gdk_device_get_source (device) != GDK_SOURCE_KEYBOARD) continue; - res = _gdk_windowing_device_grab (device, - window, - native, - owner_events, - GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK, - NULL, - NULL, - time); + res = GDK_DEVICE_GET_CLASS (device)->grab (device, + native, + owner_events, + GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK, + NULL, + NULL, + time); if (res == GDK_GRAB_SUCCESS) _gdk_display_add_device_grab (display, diff --git a/gdk/x11/gdkdevice-core.c b/gdk/x11/gdkdevice-core.c index 008e339b01..8e7b3c93ab 100644 --- a/gdk/x11/gdkdevice-core.c +++ b/gdk/x11/gdkdevice-core.c @@ -24,6 +24,7 @@ #include "gdkinternals.h" #include "gdkwindow.h" #include "gdkprivate-x11.h" +#include "gdkasync.h" #include "gdkx.h" static gboolean gdk_device_core_get_history (GdkDevice *device, @@ -296,7 +297,7 @@ gdk_device_core_grab (GdkDevice *device, { GdkDisplay *display; Window xwindow, xconfine_to; - int status; + gint status; display = gdk_device_get_display (device); @@ -310,6 +311,11 @@ gdk_device_core_grab (GdkDevice *device, else xconfine_to = GDK_WINDOW_XID (confine_to); +#ifdef G_ENABLE_DEBUG + if (_gdk_debug_flags & GDK_DEBUG_NOGRABS) + status = GrabSuccess; + else +#endif if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD) { /* Device is a keyboard */ @@ -357,6 +363,8 @@ gdk_device_core_grab (GdkDevice *device, time_); } + _gdk_x11_display_update_grab_info (display, device, status); + return _gdk_x11_convert_grab_status (status); } @@ -365,13 +373,17 @@ gdk_device_core_ungrab (GdkDevice *device, guint32 time_) { GdkDisplay *display; + gulong serial; display = gdk_device_get_display (device); + serial = NextRequest (GDK_DISPLAY_XDISPLAY (display)); if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD) XUngrabKeyboard (GDK_DISPLAY_XDISPLAY (display), time_); else XUngrabPointer (GDK_DISPLAY_XDISPLAY (display), time_); + + _gdk_x11_display_update_grab_info_ungrab (display, device, time_, serial); } static GdkWindow * diff --git a/gdk/x11/gdkdevice-core.h b/gdk/x11/gdkdevice-core.h index 04424b5883..af425da417 100644 --- a/gdk/x11/gdkdevice-core.h +++ b/gdk/x11/gdkdevice-core.h @@ -20,7 +20,7 @@ #ifndef __GDK_DEVICE_CORE_H__ #define __GDK_DEVICE_CORE_H__ -#include +#include "gdkdeviceprivate.h" G_BEGIN_DECLS diff --git a/gdk/x11/gdkdevice-xi.c b/gdk/x11/gdkdevice-xi.c index 8ffd8dfa06..71b0ab5c9c 100644 --- a/gdk/x11/gdkdevice-xi.c +++ b/gdk/x11/gdkdevice-xi.c @@ -25,6 +25,7 @@ #include "gdkdeviceprivate.h" #include "gdkprivate-x11.h" #include "gdkintl.h" +#include "gdkasync.h" #include "gdkx.h" #define MAX_DEVICE_CLASSES 13 @@ -437,11 +438,18 @@ gdk_device_xi_grab (GdkDevice *device, XEventClass event_classes[MAX_DEVICE_CLASSES]; gint status, num_classes; GdkDeviceXI *device_xi; + GdkDisplay *display; device_xi = GDK_DEVICE_XI (device); + display = gdk_device_get_display (device); find_events (device, event_mask, event_classes, &num_classes); - status = XGrabDevice (GDK_WINDOW_XDISPLAY (window), +#ifdef G_ENABLE_DEBUG + if (_gdk_debug_flags & GDK_DEBUG_NOGRABS) + status = GrabSuccess; + else +#endif + status = XGrabDevice (GDK_DISPLAY_XDISPLAY (display), device_xi->xdevice, GDK_WINDOW_XID (window), owner_events, @@ -449,6 +457,8 @@ gdk_device_xi_grab (GdkDevice *device, GrabModeAsync, GrabModeAsync, time_); + _gdk_x11_display_update_grab_info (display, device, status); + return _gdk_x11_convert_grab_status (status); } @@ -456,15 +466,20 @@ static void gdk_device_xi_ungrab (GdkDevice *device, guint32 time_) { - GdkDisplay *display; GdkDeviceXI *device_xi; + GdkDisplay *display; + Display *xdisplay; + unsigned long serial; device_xi = GDK_DEVICE_XI (device); display = gdk_device_get_display (device); + xdisplay = GDK_DISPLAY_XDISPLAY (display); - XUngrabDevice (GDK_DISPLAY_XDISPLAY (device), - device_xi->xdevice, - time_); + serial = NextRequest (xdisplay); + + XUngrabDevice (xdisplay, device_xi->xdevice, time_); + + _gdk_x11_display_update_grab_info_ungrab (display, device, time_, serial); } static GdkWindow* diff --git a/gdk/x11/gdkdevice-xi.h b/gdk/x11/gdkdevice-xi.h index 55f33d30a2..36fab89950 100644 --- a/gdk/x11/gdkdevice-xi.h +++ b/gdk/x11/gdkdevice-xi.h @@ -20,7 +20,8 @@ #ifndef __GDK_DEVICE_XI_H__ #define __GDK_DEVICE_XI_H__ -#include +#include "gdkdeviceprivate.h" + #include G_BEGIN_DECLS diff --git a/gdk/x11/gdkdevice-xi2.c b/gdk/x11/gdkdevice-xi2.c index 7c91cd3f82..09b2965d7a 100644 --- a/gdk/x11/gdkdevice-xi2.c +++ b/gdk/x11/gdkdevice-xi2.c @@ -22,6 +22,7 @@ #include "gdkdevice-xi2.h" #include "gdkintl.h" +#include "gdkasync.h" #include "gdkx.h" #include @@ -364,7 +365,7 @@ gdk_device_xi2_grab (GdkDevice *device, XIEventMask mask; Window xwindow; Cursor xcursor; - int status; + gint status; priv = GDK_DEVICE_XI2 (device)->priv; display = gdk_device_get_display (device); @@ -384,6 +385,11 @@ gdk_device_xi2_grab (GdkDevice *device, mask.deviceid = priv->device_id; mask.mask = gdk_device_xi2_translate_event_mask (event_mask, &mask.mask_len); +#ifdef G_ENABLE_DEBUG + if (_gdk_debug_flags & GDK_DEBUG_NOGRABS) + status = GrabSuccess; + else +#endif status = XIGrabDevice (GDK_DISPLAY_XDISPLAY (display), priv->device_id, xwindow, @@ -395,6 +401,8 @@ gdk_device_xi2_grab (GdkDevice *device, g_free (mask.mask); + _gdk_x11_display_update_grab_info (display, device, status); + return _gdk_x11_convert_grab_status (status); } @@ -404,13 +412,15 @@ gdk_device_xi2_ungrab (GdkDevice *device, { GdkDeviceXI2Private *priv; GdkDisplay *display; + gulong serial; priv = GDK_DEVICE_XI2 (device)->priv; display = gdk_device_get_display (device); + serial = NextRequest (GDK_DISPLAY_XDISPLAY (display)); - XIUngrabDevice (GDK_DISPLAY_XDISPLAY (display), - priv->device_id, - time_); + XIUngrabDevice (GDK_DISPLAY_XDISPLAY (display), priv->device_id, time_); + + _gdk_x11_display_update_grab_info_ungrab (display, device, time_, serial); } static GdkWindow * diff --git a/gdk/x11/gdkdevice-xi2.h b/gdk/x11/gdkdevice-xi2.h index 2fa3064744..f30ebb79e6 100644 --- a/gdk/x11/gdkdevice-xi2.h +++ b/gdk/x11/gdkdevice-xi2.h @@ -20,7 +20,8 @@ #ifndef __GDK_DEVICE_XI2_H__ #define __GDK_DEVICE_XI2_H__ -#include +#include "gdkdeviceprivate.h" + #include G_BEGIN_DECLS diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c index 0be44a1a92..b750a326a7 100644 --- a/gdk/x11/gdkdisplay-x11.c +++ b/gdk/x11/gdkdisplay-x11.c @@ -1575,60 +1575,42 @@ struct XPointerUngrabInfo { guint32 time; }; -static void -device_ungrab_callback (GdkDisplay *display, - gpointer data, - gulong serial) -{ - GdkDevice *device = data; - - _gdk_display_device_grab_update (display, device, NULL, serial); -} - - #define XSERVER_TIME_IS_LATER(time1, time2) \ ( (( time1 > time2 ) && ( time1 - time2 < ((guint32)-1)/2 )) || \ (( time1 < time2 ) && ( time2 - time1 > ((guint32)-1)/2 )) \ ) -/** - * gdk_device_ungrab: - * @device: a #GdkDevice - * @time_: a timestap (e.g. %GDK_CURRENT_TIME). - * - * Release any grab on @device. - * - * Since: 3.0 - */ void -gdk_device_ungrab (GdkDevice *device, - guint32 time_) +_gdk_x11_display_update_grab_info (GdkDisplay *display, + GdkDevice *device, + gint status) +{ + if (status == GrabSuccess) + _gdk_x11_roundtrip_async (display, + (GdkRoundTripCallback)_gdk_display_device_grab_update, + device); +} + +void +_gdk_x11_display_update_grab_info_ungrab (GdkDisplay *display, + GdkDevice *device, + guint32 time, + gulong serial) { - GdkDisplay *display; - Display *xdisplay; GdkDeviceGrabInfo *grab; - unsigned long serial; - g_return_if_fail (GDK_IS_DEVICE (device)); - - display = gdk_device_get_display (device); - xdisplay = GDK_DISPLAY_XDISPLAY (display); - - serial = NextRequest (xdisplay); - - GDK_DEVICE_GET_CLASS (device)->ungrab (device, time_); - XFlush (xdisplay); + XFlush (GDK_DISPLAY_XDISPLAY (display)); grab = _gdk_display_get_last_device_grab (display, device); if (grab && - (time_ == GDK_CURRENT_TIME || + (time == GDK_CURRENT_TIME || grab->time == GDK_CURRENT_TIME || - !XSERVER_TIME_IS_LATER (grab->time, time_))) + !XSERVER_TIME_IS_LATER (grab->time, time))) { grab->serial_end = serial; _gdk_x11_roundtrip_async (display, - device_ungrab_callback, - device); + (GdkRoundTripCallback)_gdk_display_device_grab_update, + device); } } diff --git a/gdk/x11/gdkmain-x11.c b/gdk/x11/gdkmain-x11.c index 91eb83d0f7..5890335c0f 100644 --- a/gdk/x11/gdkmain-x11.c +++ b/gdk/x11/gdkmain-x11.c @@ -129,53 +129,6 @@ _gdk_x11_convert_grab_status (gint status) return 0; } -static void -has_pointer_grab_callback (GdkDisplay *display, - gpointer data, - gulong serial) -{ - GdkDevice *device = data; - - _gdk_display_device_grab_update (display, device, NULL, serial); -} - -GdkGrabStatus -_gdk_windowing_device_grab (GdkDevice *device, - GdkWindow *window, - GdkWindow *native, - gboolean owner_events, - GdkEventMask event_mask, - GdkWindow *confine_to, - GdkCursor *cursor, - guint32 time) -{ - GdkDisplay *display; - GdkGrabStatus status = GDK_GRAB_SUCCESS; - - if (!window || GDK_WINDOW_DESTROYED (window)) - return GDK_GRAB_NOT_VIEWABLE; - - display = gdk_device_get_display (device); - -#ifdef G_ENABLE_DEBUG - if (_gdk_debug_flags & GDK_DEBUG_NOGRABS) - status = GrabSuccess; - else -#endif - status = GDK_DEVICE_GET_CLASS (device)->grab (device, - native, - owner_events, - event_mask, - confine_to, - cursor, - time); - if (status == GDK_GRAB_SUCCESS) - _gdk_x11_roundtrip_async (display, - has_pointer_grab_callback, - device); - return status; -} - /** * _gdk_xgrab_check_unmap: * @window: a #GdkWindow diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h index f3867ab679..682cc10dd0 100644 --- a/gdk/x11/gdkprivate-x11.h +++ b/gdk/x11/gdkprivate-x11.h @@ -139,6 +139,15 @@ void _gdk_xgrab_check_destroy (GdkWindow *window); gboolean _gdk_x11_display_is_root_window (GdkDisplay *display, Window xroot_window); +void _gdk_x11_display_update_grab_info (GdkDisplay *display, + GdkDevice *device, + gint status); +void _gdk_x11_display_update_grab_info_ungrab (GdkDisplay *display, + GdkDevice *device, + guint32 time, + gulong serial); +void _gdk_x11_device_check_extension_events (GdkDevice *device); + void _gdk_x11_precache_atoms (GdkDisplay *display, const gchar * const *atom_names, gint n_atoms);