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 _ListChildrenState ListChildrenState;
|
||||||
typedef struct _SendEventState SendEventState;
|
typedef struct _SendEventState SendEventState;
|
||||||
typedef struct _SetInputFocusState SetInputFocusState;
|
typedef struct _SetInputFocusState SetInputFocusState;
|
||||||
|
typedef struct _RoundtripState RoundtripState;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
CHILD_INFO_GET_PROPERTY,
|
CHILD_INFO_GET_PROPERTY,
|
||||||
@@ -112,6 +113,15 @@ struct _SetInputFocusState
|
|||||||
gulong get_input_focus_req;
|
gulong get_input_focus_req;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct _RoundtripState
|
||||||
|
{
|
||||||
|
Display *dpy;
|
||||||
|
_XAsyncHandler async;
|
||||||
|
gulong get_input_focus_req;
|
||||||
|
GdkRoundTripCallback callback;
|
||||||
|
gpointer data;
|
||||||
|
};
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
callback_idle (gpointer data)
|
callback_idle (gpointer data)
|
||||||
{
|
{
|
||||||
@@ -743,5 +753,90 @@ _gdk_x11_get_window_child_info (GdkDisplay *display,
|
|||||||
return !state.have_error;
|
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__
|
#define __GDK_ASYNC_C__
|
||||||
#include "gdkaliasdef.c"
|
#include "gdkaliasdef.c"
|
||||||
|
|||||||
@@ -31,6 +31,8 @@ typedef struct _GdkChildInfoX11 GdkChildInfoX11;
|
|||||||
typedef void (*GdkSendXEventCallback) (Window window,
|
typedef void (*GdkSendXEventCallback) (Window window,
|
||||||
gboolean success,
|
gboolean success,
|
||||||
gpointer data);
|
gpointer data);
|
||||||
|
typedef void (*GdkRoundTripCallback) (gpointer data);
|
||||||
|
|
||||||
|
|
||||||
struct _GdkChildInfoX11
|
struct _GdkChildInfoX11
|
||||||
{
|
{
|
||||||
@@ -63,6 +65,10 @@ gboolean _gdk_x11_get_window_child_info (GdkDisplay *display,
|
|||||||
GdkChildInfoX11 **children,
|
GdkChildInfoX11 **children,
|
||||||
guint *nchildren);
|
guint *nchildren);
|
||||||
|
|
||||||
|
void _gdk_x11_roundtrip_async (GdkDisplay *display,
|
||||||
|
GdkRoundTripCallback callback,
|
||||||
|
gpointer data);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __GDK_ASYNC_H__ */
|
#endif /* __GDK_ASYNC_H__ */
|
||||||
|
|||||||
Reference in New Issue
Block a user