[gtk+/gdk-backend: 25/91] Make GdkDevice parallel-implementable
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/gdk-backend: 25/91] Make GdkDevice parallel-implementable
- Date: Sat, 18 Dec 2010 01:07:55 +0000 (UTC)
commit 79297af2b96d0df469b41cb0247565f37dc4ed61
Author: Matthias Clasen <mclasen redhat com>
Date: Fri Dec 10 12:13:25 2010 -0500
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 755f78a..e4b7c06 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;
@@ -1174,8 +1174,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;
@@ -1187,21 +1187,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)
{
@@ -1226,6 +1228,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)
@@ -1525,3 +1545,4 @@ _gdk_device_translate_axis (GdkDevice *device,
return TRUE;
}
+
diff --git a/gdk/gdkinternals.h b/gdk/gdkinternals.h
index 7332c12..951b26e 100644
--- a/gdk/gdkinternals.h
+++ b/gdk/gdkinternals.h
@@ -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>
@@ -631,14 +629,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 76a7e0d..ea0fe11 100644
--- a/gdk/gdkwindow.c
+++ b/gdk/gdkwindow.c
@@ -8692,14 +8692,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,
@@ -8797,14 +8796,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 008e339..8e7b3c9 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 04424b5..af425da 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 <gdk/gdkdeviceprivate.h>
+#include "gdkdeviceprivate.h"
G_BEGIN_DECLS
diff --git a/gdk/x11/gdkdevice-xi.c b/gdk/x11/gdkdevice-xi.c
index 8ffd8df..71b0ab5 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);
+
+ 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*
diff --git a/gdk/x11/gdkdevice-xi.h b/gdk/x11/gdkdevice-xi.h
index 55f33d3..36fab89 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 <gdk/gdkdeviceprivate.h>
+#include "gdkdeviceprivate.h"
+
#include <X11/extensions/XInput.h>
G_BEGIN_DECLS
diff --git a/gdk/x11/gdkdevice-xi2.c b/gdk/x11/gdkdevice-xi2.c
index 7c91cd3..09b2965 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 <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 *
diff --git a/gdk/x11/gdkdevice-xi2.h b/gdk/x11/gdkdevice-xi2.h
index 2fa3064..f30ebb7 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 <gdk/gdkdeviceprivate.h>
+#include "gdkdeviceprivate.h"
+
#include <X11/extensions/XInput2.h>
G_BEGIN_DECLS
diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c
index 0be44a1..b750a32 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 91eb83d..5890335 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 f3867ab..682cc10 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);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]