From 145ac532aaa09259ff71a8ab2a75c3bf4004a80c Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Fri, 30 Mar 2018 21:07:48 +0200 Subject: [PATCH] i3bar: forward the sync request via IPC, not X11 MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit i3bar’s X11 output is not what our testcases are testing — the state manipulations which i3bar triggers via IPC messages to i3 are what we are interested in. --- i3bar/src/ipc.c | 19 ++++++++++++------- i3bar/src/xcb.c | 21 ++++++--------------- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/i3bar/src/ipc.c b/i3bar/src/ipc.c index cc3563ec..7a657338 100644 --- a/i3bar/src/ipc.c +++ b/i3bar/src/ipc.c @@ -114,13 +114,18 @@ void got_bar_config(char *reply) { /* Data structure to easily call the reply handlers later */ handler_t reply_handlers[] = { - &got_command_reply, - &got_workspace_reply, - &got_subscribe_reply, - &got_output_reply, - NULL, - NULL, - &got_bar_config, + &got_command_reply, /* I3_IPC_REPLY_TYPE_COMMAND */ + &got_workspace_reply, /* I3_IPC_REPLY_TYPE_WORKSPACES */ + &got_subscribe_reply, /* I3_IPC_REPLY_TYPE_SUBSCRIBE */ + &got_output_reply, /* I3_IPC_REPLY_TYPE_OUTPUTS */ + NULL, /* I3_IPC_REPLY_TYPE_TREE */ + NULL, /* I3_IPC_REPLY_TYPE_MARKS */ + &got_bar_config, /* I3_IPC_REPLY_TYPE_BAR_CONFIG */ + NULL, /* I3_IPC_REPLY_TYPE_VERSION */ + NULL, /* I3_IPC_REPLY_TYPE_BINDING_MODES */ + NULL, /* I3_IPC_REPLY_TYPE_CONFIG */ + NULL, /* I3_IPC_REPLY_TYPE_TICK */ + NULL, /* I3_IPC_REPLY_TYPE_SYNC */ }; /* diff --git a/i3bar/src/xcb.c b/i3bar/src/xcb.c index 542c86c3..8843edbd 100644 --- a/i3bar/src/xcb.c +++ b/i3bar/src/xcb.c @@ -694,21 +694,12 @@ static void handle_client_message(xcb_client_message_event_t *event) { if (event->type == atoms[I3_SYNC]) { xcb_window_t window = event->data.data32[0]; uint32_t rnd = event->data.data32[1]; - DLOG("[i3 sync protocol] Forwarding random value %d, X11 window 0x%08x to i3\n", rnd, window); - - void *reply = scalloc(32, 1); - xcb_client_message_event_t *ev = reply; - - ev->response_type = XCB_CLIENT_MESSAGE; - ev->window = window; - ev->type = atoms[I3_SYNC]; - ev->format = 32; - ev->data.data32[0] = window; - ev->data.data32[1] = rnd; - - xcb_send_event(conn, false, xcb_root, XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, (char *)ev); - xcb_flush(conn); - free(reply); + /* Forward the request to i3 via the IPC interface so that all pending + * IPC messages are guaranteed to be handled. */ + char *payload = NULL; + sasprintf(&payload, "{\"rnd\":%d, \"window\":%d}", rnd, window); + i3_send_msg(I3_IPC_MESSAGE_TYPE_SYNC, payload); + free(payload); } else if (event->type == atoms[_NET_SYSTEM_TRAY_OPCODE] && event->format == 32) { DLOG("_NET_SYSTEM_TRAY_OPCODE received\n"); -- 2.39.2