diff --git a/xwayland/window-manager.c b/xwayland/window-manager.c index 06370b70..061ce174 100644 --- a/xwayland/window-manager.c +++ b/xwayland/window-manager.c @@ -27,6 +27,7 @@ #include #include +#include #include #include #include @@ -377,6 +378,67 @@ xcb_cursor_library_load_cursor(struct weston_wm *wm, const char *file) return cursor; } +static unsigned +dump_cardinal_array_elem(FILE *fp, unsigned format, + void *arr, unsigned len, unsigned ind) +{ + const char *comma; + + /* If more than 16 elements, print 0-14, ..., last */ + if (ind > 14 && ind < len - 1) { + fprintf(fp, ", ..."); + return len - 1; + } + + comma = ind ? ", " : ""; + + switch (format) { + case 32: + fprintf(fp, "%s%" PRIu32, comma, ((uint32_t *)arr)[ind]); + break; + case 16: + fprintf(fp, "%s%" PRIu16, comma, ((uint16_t *)arr)[ind]); + break; + case 8: + fprintf(fp, "%s%" PRIu8, comma, ((uint8_t *)arr)[ind]); + break; + default: + fprintf(fp, "%s???", comma); + } + + return ind + 1; +} + +static void +dump_cardinal_array(xcb_get_property_reply_t *reply) +{ + unsigned i = 0; + FILE *fp; + void *arr; + char *str = NULL; + size_t size = 0; + + assert(reply->type == XCB_ATOM_CARDINAL); + + fp = open_memstream(&str, &size); + if (!fp) + return; + + arr = xcb_get_property_value(reply); + + fprintf(fp, "["); + while (i < reply->value_len) + i = dump_cardinal_array_elem(fp, reply->format, + arr, reply->value_len, i); + fprintf(fp, "]"); + + if (fclose(fp) != 0) + return; + + wm_log_continue("%s\n", str); + free(str); +} + void dump_property(struct weston_wm *wm, xcb_atom_t property, xcb_get_property_reply_t *reply) @@ -403,7 +465,7 @@ dump_property(struct weston_wm *wm, incr_value = xcb_get_property_value(reply); wm_log_continue("%d\n", *incr_value); } else if (reply->type == wm->atom.utf8_string || - reply->type == wm->atom.string) { + reply->type == wm->atom.string) { text_value = xcb_get_property_value(reply); if (reply->value_len > 40) len = 40; @@ -424,6 +486,8 @@ dump_property(struct weston_wm *wm, width += wm_log_continue("%s", name); } wm_log_continue("\n"); + } else if (reply->type == XCB_ATOM_CARDINAL) { + dump_cardinal_array(reply); } else { wm_log_continue("huh?\n"); }