]> Pileus Git - ~andy/gtk/commitdiff
Make GdkDevice parallel-implementable
authorMatthias Clasen <mclasen@redhat.com>
Fri, 10 Dec 2010 17:13:25 +0000 (12:13 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 21 Dec 2010 17:06:56 +0000 (12:06 -0500)
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.

12 files changed:
gdk/gdkdevice.c
gdk/gdkinternals.h
gdk/gdkwindow.c
gdk/x11/gdkdevice-core.c
gdk/x11/gdkdevice-core.h
gdk/x11/gdkdevice-xi.c
gdk/x11/gdkdevice-xi.h
gdk/x11/gdkdevice-xi2.c
gdk/x11/gdkdevice-xi2.h
gdk/x11/gdkdisplay-x11.c
gdk/x11/gdkmain-x11.c
gdk/x11/gdkprivate-x11.h

index f7269f3dbae9e9176488d8e7190a5f1e23628562..e81540a7a914bf04891f12616430f3f4300864fa 100644 (file)
@@ -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;
 }
+
index 4df0aeacf05c448bb1c96f73fee6f032ce5412de..5d1944c447fc256766e2b9ff2bcad355ebe474b9 100644 (file)
@@ -30,8 +30,6 @@
 #define __GDK_INTERNALS_H__
 
 #include <gio/gio.h>
-#include <gdk/gdktypes.h>
-#include <gdk/gdkwindow.h>
 #include <gdk/gdkwindowimpl.h>
 #include <gdk/gdkprivate.h>
 
@@ -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,
index feedce13cc34d83d6ea47c5eeed369691c29a523..3938d30cbcc3c7388270e0138804d397877316c1 100644 (file)
@@ -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,
index 008e339b013512e010fea68068c11a4056df00c6..8e7b3c93ab1781f482644bd08ffbfe6e8082384b 100644 (file)
@@ -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 *
index 04424b58838c1b2807cc56a8bee2072cc6457234..af425da417ce3fb540f7121e8ce3cdc1ee295911 100644 (file)
@@ -20,7 +20,7 @@
 #ifndef __GDK_DEVICE_CORE_H__
 #define __GDK_DEVICE_CORE_H__
 
-#include <gdk/gdkdeviceprivate.h>
+#include "gdkdeviceprivate.h"
 
 G_BEGIN_DECLS
 
index 8ffd8dfa0698b6034f9c3bf5625dc67aa320e71c..71b0ab5c9c346c489cb11e22b32d3c186facedae 100644 (file)
@@ -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);
+
+  serial = NextRequest (xdisplay);
+
+  XUngrabDevice (xdisplay, device_xi->xdevice, time_);
 
-  XUngrabDevice (GDK_DISPLAY_XDISPLAY (device),
-                 device_xi->xdevice,
-                 time_);
+  _gdk_x11_display_update_grab_info_ungrab (display, device, time_, serial);
 }
 
 static GdkWindow*
index 55f33d30a25f0d8fe9073c07095e2fdf11872bd2..36fab899506c9dbd526781b2fb24556071e30b1a 100644 (file)
@@ -20,7 +20,8 @@
 #ifndef __GDK_DEVICE_XI_H__
 #define __GDK_DEVICE_XI_H__
 
-#include <gdk/gdkdeviceprivate.h>
+#include "gdkdeviceprivate.h"
+
 #include <X11/extensions/XInput.h>
 
 G_BEGIN_DECLS
index 7c91cd3f827055e9a52667c4d9f353d85a927a57..09b2965d7a5570f62725d632e91628b36da0c276 100644 (file)
@@ -22,6 +22,7 @@
 #include "gdkdevice-xi2.h"
 
 #include "gdkintl.h"
+#include "gdkasync.h"
 #include "gdkx.h"
 
 #include <X11/extensions/XInput2.h>
@@ -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 *
index 2fa306474439f1fa3921f39ef23c01656331460d..f30ebb79e628ea0bbcd614f60d4616df0a03b6dd 100644 (file)
@@ -20,7 +20,8 @@
 #ifndef __GDK_DEVICE_XI2_H__
 #define __GDK_DEVICE_XI2_H__
 
-#include <gdk/gdkdeviceprivate.h>
+#include "gdkdeviceprivate.h"
+
 #include <X11/extensions/XInput2.h>
 
 G_BEGIN_DECLS
index 0be44a1a926d35fc88543b35fff5f8f83c2bdec2..b750a326a7378136653e202df9a29afea05bcc1f 100644 (file)
@@ -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);
     }
 }
 
index 91eb83d0f7be47fdbd839d9786bec69a19c990c8..5890335c0ff7fb8a28455bafe964cebf08eaeab4 100644 (file)
@@ -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
index f3867ab6791fb15e120e9d1a3bece889771939df..682cc10dd01958a005088544be526a264223e33a 100644 (file)
@@ -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);