int32_t *incr_value;
const char *text_value, *name;
xcb_atom_t *atom_value;
- int i, width;
+ int i, width, len;
width = fprintf(stderr, "property %s: ",
get_atom_name(wm->conn, property));
+ if (reply == NULL) {
+ fprintf(stderr, "(no reply)\n");
+ return;
+ }
+
width += fprintf(stderr,
"type %s, format %d, length %d (value_len %d): ",
get_atom_name(wm->conn, reply->type),
if (reply->type == wm->atom.incr) {
incr_value = xcb_get_property_value(reply);
fprintf(stderr, "%d\n", *incr_value);
- } if (reply->type == wm->atom.utf8_string ||
+ } else if (reply->type == wm->atom.utf8_string ||
reply->type == wm->atom.string) {
text_value = xcb_get_property_value(reply);
- fprintf(stderr, "\"%.100s\"\n", text_value);
- } if (reply->type == XCB_ATOM_ATOM) {
+ if (reply->value_len > 40)
+ len = 40;
+ else
+ len = reply->value_len;
+ fprintf(stderr, "\"%.*s\"\n", len, text_value);
+ } else if (reply->type == XCB_ATOM_ATOM) {
atom_value = xcb_get_property_value(reply);
for (i = 0; i < reply->value_len; i++) {
name = get_atom_name(wm->conn, atom_value[i]);
}
static void
-wlsc_wm_get_properties(struct wlsc_wm *wm, xcb_window_t window)
+wlsc_wm_list_properties(struct wlsc_wm *wm, xcb_window_t window)
{
- xcb_generic_error_t *e;
- xcb_get_property_reply_t *reply;
- int i;
+ xcb_list_properties_cookie_t list_cookie;
+ xcb_list_properties_reply_t *list_reply;
+ xcb_get_property_cookie_t property_cookie;
+ xcb_get_property_reply_t *property_reply;
+ xcb_atom_t *atoms;
+ int i, length;
- struct {
- xcb_atom_t atom;
- xcb_get_property_cookie_t cookie;
- } props[] = {
- { XCB_ATOM_WM_CLASS, },
- { XCB_ATOM_WM_TRANSIENT_FOR },
- { wm->atom.wm_protocols, },
- { wm->atom.net_wm_name, },
- };
+ list_cookie = xcb_list_properties(wm->conn, window);
+ list_reply = xcb_list_properties_reply(wm->conn, list_cookie, NULL);
- for (i = 0; i < ARRAY_LENGTH(props); i++)
- props[i].cookie =
+ length = xcb_list_properties_atoms_length(list_reply);
+ atoms = xcb_list_properties_atoms(list_reply);
+
+ for (i = 0; i < length; i++) {
+ property_cookie =
xcb_get_property (wm->conn,
0, /* delete */
window,
- props[i].atom,
+ atoms[i],
XCB_ATOM_ANY,
0, 2048);
- for (i = 0; i < ARRAY_LENGTH(props); i++) {
- reply = xcb_get_property_reply(wm->conn, props[i].cookie, &e);
- dump_property(wm, props[i].atom, reply);
- free(reply);
+ property_reply = xcb_get_property_reply(wm->conn,
+ property_cookie, NULL);
+ dump_property(wm, atoms[i], property_reply);
+ free(property_reply);
}
+
+ free(list_reply);
}
static void
fprintf(stderr, "XCB_MAP_REQUEST\n");
- wlsc_wm_get_properties(wm, map_request->window);
values[0] = XCB_EVENT_MASK_PROPERTY_CHANGE;
xcb_change_window_attributes(wm->conn, map_request->window,
XCB_CW_EVENT_MASK, values);
fprintf(stderr, "XCB_MAP_NOTIFY\n");
- wlsc_wm_get_properties(wm, map_notify->window);
+ wlsc_wm_list_properties(wm, map_notify->window);
window = hash_table_lookup(wm->window_hash, map_notify->window);
wlsc_wm_activate(wm, window, XCB_TIME_CURRENT_TIME);