]> git.sur5r.net Git - i3/i3/commitdiff
Implement the I3_SYNC client protocol
authorMichael Stapelberg <michael@stapelberg.de>
Thu, 22 Sep 2011 21:08:42 +0000 (22:08 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Thu, 22 Sep 2011 22:13:12 +0000 (23:13 +0100)
This is mainly useful for the testsuite. The tests can wait until i3 processed
all X11 events and then continue. This eliminates sleep() calls which leads to
a more robust and faster testsuite.

include/atoms.xmacro
src/handlers.c

index 7f83a7ee835346256b8a36afc94eb717b17dd83a..309a3325f8bd3dcc972f0ab21770a32871e7380e 100644 (file)
@@ -24,3 +24,4 @@ xmacro(WM_TAKE_FOCUS)
 xmacro(WM_WINDOW_ROLE)
 xmacro(I3_SOCKET_PATH)
 xmacro(I3_CONFIG_PATH)
+xmacro(I3_SYNC)
index 267159ecf515a7bb0a59b52b388066df1a96e1c7..b3cb1df7b703c28b26b48b46956ec04be96250d2 100644 (file)
@@ -648,6 +648,25 @@ static int handle_client_message(xcb_client_message_event_t *event) {
 
         tree_render();
         x_push_changes(croot);
+    } else if (event->type == A_I3_SYNC) {
+        DLOG("i3 sync, yay\n");
+        xcb_window_t window = event->data.data32[0];
+        uint32_t rnd = event->data.data32[1];
+        DLOG("Sending random value %d back to X11 window 0x%08x\n", rnd, window);
+
+        void *reply = scalloc(32);
+        xcb_client_message_event_t *ev = reply;
+
+        ev->response_type = XCB_CLIENT_MESSAGE;
+        ev->window = window;
+        ev->type = A_I3_SYNC;
+        ev->format = 32;
+        ev->data.data32[0] = window;
+        ev->data.data32[1] = rnd;
+
+        xcb_send_event(conn, false, window, XCB_EVENT_MASK_NO_EVENT, (char*)ev);
+        xcb_flush(conn);
+        free(reply);
     } else {
         ELOG("unhandled clientmessage\n");
         return 0;