]> Pileus Git - ~andy/gtk/blobdiff - gdk/x11/gdkasync.c
Make set_cairo_surface_size a vfunc on GdkWindowImpl
[~andy/gtk] / gdk / x11 / gdkasync.c
index 633666006165c70eedc285192227cdea18b81bfc..f216c0b1365c493ad282b5b7383c7858a640d5c7 100644 (file)
@@ -43,20 +43,21 @@ used in advertising or otherwise to promote the sale, use or other dealings
 in this Software without prior written authorization from The Open Group.
 
 */
-#include <config.h>
+#include "config.h"
 #ifdef NEED_XIPROTO_H_FOR_XREPLY
 #include <X11/extensions/XIproto.h>
 #endif
 #include <X11/Xlibint.h>
 #include "gdkasync.h"
 #include "gdkx.h"
-#include "gdkalias.h"
+
 
 typedef struct _ChildInfoChildState ChildInfoChildState;
 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,16 @@ struct _SetInputFocusState
   gulong get_input_focus_req;
 };
 
+struct _RoundtripState
+{
+  Display *dpy;
+  _XAsyncHandler async;
+  gulong get_input_focus_req;
+  GdkDisplay *display;
+  GdkRoundTripCallback callback;
+  gpointer data;
+};
+
 static gboolean
 callback_idle (gpointer data)
 {
@@ -644,7 +655,7 @@ _gdk_x11_get_window_child_info (GdkDisplay       *display,
                                       win_has_wm_state ? wm_state_atom : None,
                                       &has_wm_state,
                                       &state.children, &state.nchildren);
-  gdk_error_trap_pop ();
+  gdk_error_trap_pop_ignored ();
   if (!result)
     {
       g_free (state.children);
@@ -743,5 +754,89 @@ _gdk_x11_get_window_child_info (GdkDisplay       *display,
   return !state.have_error;
 }
 
-#define __GDK_ASYNC_C__
-#include "gdkaliasdef.c"
+static gboolean
+roundtrip_callback_idle (gpointer data)
+{
+  RoundtripState *state = (RoundtripState *)data;  
+  
+  state->callback (state->display, state->data, state->get_input_focus_req);
+
+  g_free (state);
+
+  return FALSE;
+}
+
+static Bool
+roundtrip_handler (Display *dpy,
+                  xReply  *rep,
+                  char    *buf,
+                  int      len,
+                  XPointer data)
+{
+  RoundtripState *state = (RoundtripState *)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->display = display;
+  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();
+}