[gtk+/client-side-windows: 183/284] Add _gdk_x11_roundtrip_async
- From: Alexander Larsson <alexl src gnome org>
- To: svn-commits-list gnome org
- Subject: [gtk+/client-side-windows: 183/284] Add _gdk_x11_roundtrip_async
- Date: Thu, 2 Apr 2009 14:15:06 -0400 (EDT)
commit d2c1c0a8db6fd01bda11e6592a41ea2dfe1b4396
Author: Alexander Larsson <alexl redhat com>
Date: Mon Jan 26 19:55:08 2009 +0100
Add _gdk_x11_roundtrip_async
---
gdk/x11/gdkasync.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++
gdk/x11/gdkasync.h | 6 +++
2 files changed, 101 insertions(+), 0 deletions(-)
diff --git a/gdk/x11/gdkasync.c b/gdk/x11/gdkasync.c
index 3f90d59..585c9ef 100644
--- a/gdk/x11/gdkasync.c
+++ b/gdk/x11/gdkasync.c
@@ -57,6 +57,7 @@ typedef struct _ChildInfoState ChildInfoState;
typedef struct _ListChildrenState ListChildrenState;
typedef struct _SendEventState SendEventState;
typedef struct _SetInputFocusState SetInputFocusState;
+typedef struct _RoundtripState RoundtripState;
typedef enum {
CHILD_INFO_GET_PROPERTY,
@@ -112,6 +113,15 @@ struct _SetInputFocusState
gulong get_input_focus_req;
};
+struct _RoundtripState
+{
+ Display *dpy;
+ _XAsyncHandler async;
+ gulong get_input_focus_req;
+ GdkRoundTripCallback callback;
+ gpointer data;
+};
+
static gboolean
callback_idle (gpointer data)
{
@@ -743,5 +753,90 @@ _gdk_x11_get_window_child_info (GdkDisplay *display,
return !state.have_error;
}
+static gboolean
+roundtrip_callback_idle (gpointer data)
+{
+ RoundtripState *state = (RoundtripState *)data;
+
+ state->callback (state->data);
+
+ g_free (state);
+
+ return FALSE;
+}
+
+static Bool
+roundtrip_handler (Display *dpy,
+ xReply *rep,
+ char *buf,
+ int len,
+ XPointer data)
+{
+ RoundtripState *state = (SendEventState *)data;
+
+ if (dpy->last_request_read == state->get_input_focus_req)
+ {
+ xGetInputFocusReply replbuf;
+ xGetInputFocusReply *repl;
+
+ if (rep->generic.type != X_Error)
+ {
+ /* Actually does nothing, since there are no additional bytes
+ * to read, but maintain good form.
+ */
+ repl = (xGetInputFocusReply *)
+ _XGetAsyncReply(dpy, (char *)&replbuf, rep, buf, len,
+ (sizeof(xGetInputFocusReply) - sizeof(xReply)) >> 2,
+ True);
+ }
+
+ if (state->callback)
+ gdk_threads_add_idle (roundtrip_callback_idle, state);
+
+ DeqAsyncHandler(state->dpy, &state->async);
+
+ return (rep->generic.type != X_Error);
+ }
+
+ return False;
+}
+
+void
+_gdk_x11_roundtrip_async (GdkDisplay *display,
+ GdkRoundTripCallback callback,
+ gpointer data)
+{
+ Display *dpy;
+ RoundtripState *state;
+
+ dpy = GDK_DISPLAY_XDISPLAY (display);
+
+ state = g_new (RoundtripState, 1);
+
+ state->dpy = dpy;
+ state->callback = callback;
+ state->data = data;
+
+ LockDisplay(dpy);
+
+ state->async.next = dpy->async_handlers;
+ state->async.handler = roundtrip_handler;
+ state->async.data = (XPointer) state;
+ dpy->async_handlers = &state->async;
+
+ /*
+ * XSync (dpy, 0)
+ */
+ {
+ xReq *req;
+
+ GetEmptyReq(GetInputFocus, req);
+ state->get_input_focus_req = dpy->request;
+ }
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+}
+
#define __GDK_ASYNC_C__
#include "gdkaliasdef.c"
diff --git a/gdk/x11/gdkasync.h b/gdk/x11/gdkasync.h
index 91897f3..407e3c8 100644
--- a/gdk/x11/gdkasync.h
+++ b/gdk/x11/gdkasync.h
@@ -31,6 +31,8 @@ typedef struct _GdkChildInfoX11 GdkChildInfoX11;
typedef void (*GdkSendXEventCallback) (Window window,
gboolean success,
gpointer data);
+typedef void (*GdkRoundTripCallback) (gpointer data);
+
struct _GdkChildInfoX11
{
@@ -63,6 +65,10 @@ gboolean _gdk_x11_get_window_child_info (GdkDisplay *display,
GdkChildInfoX11 **children,
guint *nchildren);
+void _gdk_x11_roundtrip_async (GdkDisplay *display,
+ GdkRoundTripCallback callback,
+ gpointer data);
+
G_END_DECLS
#endif /* __GDK_ASYNC_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]