Add _gdk_x11_roundtrip_async
This commit is contained in:
committed by
Alexander Larsson
parent
24aa1620bf
commit
d2c1c0a8db
@ -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"
|
||||
|
||||
@ -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__ */
|
||||
|
||||
Reference in New Issue
Block a user