+static int do_get_type(xcb_window_t xcb, type_t *type)
+{
+ xcb_get_property_cookie_t cookie =
+ xcb_ewmh_get_wm_window_type(&ewmh, xcb);
+ if (!cookie.sequence)
+ return warn("do_get_type: bad cookie");
+
+ xcb_ewmh_get_atoms_reply_t reply;
+ if (!xcb_ewmh_get_wm_window_type_reply(&ewmh, cookie, &reply, NULL))
+ return warn("do_get_type: no reply");
+
+ type_t prev = *type;
+ for (int i = 0; i < reply.atoms_len; i++) {
+ if (reply.atoms[i] == ewmh._NET_WM_WINDOW_TYPE_DOCK)
+ *type = TYPE_TOOLBAR;
+ if (reply.atoms[i] == ewmh._NET_WM_WINDOW_TYPE_TOOLBAR)
+ *type = TYPE_TOOLBAR;
+ if (reply.atoms[i] == ewmh._NET_WM_WINDOW_TYPE_DIALOG)
+ *type = TYPE_DIALOG;
+ }
+ printf("do_get_type: %d -> %d\n", prev, *type);
+ return 1;
+}
+
+static int do_get_icccm_state(xcb_window_t xcb, state_t *state)
+{
+ xcb_get_property_cookie_t cookie;
+
+ cookie = xcb_icccm_get_wm_normal_hints(conn, xcb);
+ if (!cookie.sequence)
+ return warn("do_get_icccm_state: bad cookie1");
+
+ xcb_size_hints_t sizes;
+ if (!xcb_icccm_get_wm_normal_hints_reply(conn, cookie, &sizes, NULL))
+ return warn("do_get_icccm_state: no sizes");
+
+ state_t prev = *state;
+ printf("do_get_icccm_state: %s -> %s\n",
+ state_map[prev], state_map[*state]);
+ return 1;
+}
+
+static int do_get_ewmh_state(xcb_window_t xcb, state_t *state)
+{
+ xcb_get_property_cookie_t cookie;
+
+ cookie = xcb_ewmh_get_wm_state(&ewmh, xcb);
+ if (!cookie.sequence)
+ return warn("do_get_ewmh_state: bad cookie2");
+
+ xcb_ewmh_get_atoms_reply_t states;
+ if (!xcb_ewmh_get_wm_state_reply(&ewmh, cookie, &states, NULL))
+ return warn("do_get_ewmh_state: no reply2");
+
+ state_t prev = *state;
+ for (int i = 0; i < states.atoms_len; i++)
+ if (states.atoms[i] == ewmh._NET_WM_STATE_FULLSCREEN)
+ *state = ST_FULL;
+
+ printf("do_get_ewmh_state: %s -> %s\n",
+ state_map[prev], state_map[*state]);
+ return 1;
+}
+