Add _gdk_x11_roundtrip_async

This commit is contained in:
Alexander Larsson
2009-01-26 19:55:08 +01:00
committed by Alexander Larsson
parent 24aa1620bf
commit d2c1c0a8db
2 changed files with 101 additions and 0 deletions

View File

@ -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"

View File

@ -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__ */