static void print_client_properties(Display *dpy, Window w, Bool verbose, int maxcmdlen) { char **cliargv = NULL; int i, cliargc; XTextProperty nametp, machtp, tp; int charsleft = maxcmdlen; /* * get the WM_MACHINE and WM_COMMAND list of strings */ if (!XGetWMClientMachine (dpy, w, &machtp)) { machtp.value = NULL; machtp.encoding = None; } if (!XGetCommand (dpy, w, &cliargv, &cliargc)) { if (machtp.value) XFree ((char *) machtp.value); return; } /* * do header information */ if (verbose) { printf ("Window 0x%lx:\n", w); print_text_field (dpy, " Machine: ", &machtp); if (XGetWMName (dpy, w, &nametp)) { print_text_field (dpy, " Name: ", &nametp); if (nametp.value) XFree ((char *) nametp.value); } } else { print_text_field (dpy, NULL, &machtp); putchar (' '); putchar (' '); } if (machtp.value) XFree ((char *) machtp.value); if (verbose) { if (XGetWMIconName (dpy, w, &tp)) { print_text_field (dpy, " Icon Name: ", &tp); if (tp.value) XFree ((char *) tp.value); } } /* * do the command */ if (verbose) { printf (" Command: "); } for (i = 0; i < cliargc && charsleft > 0; ) { charsleft -= print_quoted_word (cliargv[i], charsleft); i++; if (i < cliargc && charsleft > 0) { putchar (' '); charsleft--; } } putchar ('\n'); XFreeStringList (cliargv); /* * do trailer information */ if (verbose) { XClassHint clh; if (XGetClassHint (dpy, w, &clh)) { printf (" Instance/Class: %s/%s", clh.res_name ? clh.res_name : Nil, clh.res_class ? clh.res_class : Nil); if (clh.res_name) XFree (clh.res_name); if (clh.res_class) XFree (clh.res_class); putchar ('\n'); } } }
static void show_client_properties(void *closure) { client_state *cs = closure; xcb_get_property_reply_t *client_machine; xcb_get_property_reply_t *command; xcb_get_property_reply_t *name; xcb_get_property_reply_t *icon_name; xcb_get_property_reply_t *wm_class; char *argv; int charsleft = cs->maxcmdlen; int i; /* * get the WM_MACHINE and WM_COMMAND list of strings */ client_machine = xcb_get_property_reply(cs->c, cs->client_machine, NULL); command = xcb_get_property_reply(cs->c, cs->command, NULL); if (cs->verbose) { name = xcb_get_property_reply(cs->c, cs->name, NULL); icon_name = xcb_get_property_reply(cs->c, cs->icon_name, NULL); wm_class = xcb_get_property_reply(cs->c, cs->wm_class, NULL); } if (!command || !command->type) goto done; /* * do header information */ if (cs->verbose) { printf ("Window 0x%" PRIx32 ":\n", cs->w); print_text_field (cs->c, " Machine: ", client_machine); if (name && name->type) print_text_field (cs->c, " Name: ", name); } else { print_text_field (cs->c, NULL, client_machine); putchar (' '); putchar (' '); } if (cs->verbose) if (icon_name && icon_name->type) print_text_field (cs->c, " Icon Name: ", icon_name); /* * do the command */ if (cs->verbose) printf (" Command: "); argv = xcb_get_property_value(command); for (i = 0; i < command->value_len && charsleft > 0; ) { charsleft -= print_quoted_word (argv + i, charsleft); i += strnlen(argv + i, command->value_len - i) + 1; if (i < command->value_len && charsleft > 0) { putchar (' '); charsleft--; } } putchar ('\n'); /* * do trailer information */ if (cs->verbose) { if (wm_class && wm_class->type) { char *res_name, *res_class; int name_len, class_len; res_name = xcb_get_property_value(wm_class); name_len = strnlen(res_name, wm_class->value_len) + 1; class_len = wm_class->value_len - name_len; if (class_len > 0) { res_class = res_name + name_len; } else { res_class = Nil; class_len = strlen(res_class); } printf (" Instance/Class: %.*s/%.*s", name_len, res_name, class_len, res_class); putchar ('\n'); } } done: if (client_machine) free(client_machine); if (command) free(command); if (cs->verbose) { if (name) free(name); if (icon_name) free(icon_name); if (wm_class) free(wm_class); } free(cs); }