From: Michael Stapelberg Date: Fri, 30 Mar 2018 19:07:48 +0000 (+0200) Subject: i3bar: forward the sync request via IPC, not X11 X-Git-Tag: 4.16~106^2~1 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=145ac532aaa09259ff71a8ab2a75c3bf4004a80c;p=i3%2Fi3 i3bar: forward the sync request via IPC, not X11 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. --- 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");