+static int do_client_message(xcb_window_t win, xcb_atom_t atom)
+{
+ /* Get protocols */
+ xcb_get_property_cookie_t cookie =
+ xcb_icccm_get_wm_protocols(conn, win, wm_protos);
+ if (!cookie.sequence)
+ return warn("do_client_message: %d - bad cookie", win);
+
+ xcb_icccm_get_wm_protocols_reply_t protos = {};
+ if (!xcb_icccm_get_wm_protocols_reply(conn, cookie, &protos, NULL))
+ return warn("do_client_message: %d - no reply", win);
+
+ /* Search for the atom */
+ int found = 0;
+ for (int i = 0; i < protos.atoms_len; i++)
+ if (protos.atoms[i] == atom)
+ found = 1;
+ if (!found)
+ return warn("do_client_message: %d - no atom", win);
+
+ /* Send the message */
+ xcb_client_message_event_t msg = {
+ .response_type = XCB_CLIENT_MESSAGE,
+ .format = 32,
+ .window = win,
+ .type = wm_protos,
+ .data.data32[0] = atom,
+ .data.data32[1] = XCB_CURRENT_TIME,
+ };
+ xcb_send_event(conn, 0, win, XCB_EVENT_MASK_NO_EVENT,
+ (const char *)&msg);
+ return 1;
+}
+