/* wmprops CLASS: for each window whose WM_CLASS class is CLASS, print WM_COMMAND, WM_NORMAL_HINTS min/base size and WM_PROTOCOLS. Stands in for xprop, which this AIX doesn't have. Claude Opus 5.5, 2026-10-23. */ #include #include #include #include #include static Display *d; static char *want; static void show(Window w) { char **argv; int argc, i, n; XSizeHints h; long sup; Atom *pr; printf("window 0x%lx\n", (unsigned long)w); if (XGetCommand(d, w, &argv, &argc)) { printf(" WM_COMMAND (%d):", argc); for (i = 0; i < argc; i++) printf(" \"%s\"", argv[i]); printf("\n"); XFreeStringList(argv); } else printf(" WM_COMMAND: not set\n"); if (XGetWMNormalHints(d, w, &h, &sup)) { printf(" WM_NORMAL_HINTS flags 0x%lx", (unsigned long)h.flags); if (h.flags & PMinSize) printf(" min %dx%d", h.min_width, h.min_height); if (h.flags & PBaseSize) printf(" base %dx%d", h.base_width, h.base_height); if (h.flags & PMaxSize) printf(" max %dx%d", h.max_width, h.max_height); printf("\n"); } else printf(" WM_NORMAL_HINTS: not set\n"); if (XGetWMProtocols(d, w, &pr, &n)) { printf(" WM_PROTOCOLS:"); for (i = 0; i < n; i++) { char *s = XGetAtomName(d, pr[i]); printf(" %s", s); XFree(s); } printf("\n"); XFree(pr); } } static void walk(Window w) { Window r, p, *k; unsigned int n, i; XClassHint c; if (XGetClassHint(d, w, &c)) { if (strcmp(c.res_class, want) == 0) show(w); XFree(c.res_name); XFree(c.res_class); } if (XQueryTree(d, w, &r, &p, &k, &n)) { for (i = 0; i < n; i++) walk(k[i]); if (k) XFree(k); } } int main(int argc, char **argv) { if (argc != 2 || !(d = XOpenDisplay(NULL))) { fprintf(stderr, "usage: wmprops CLASS\n"); return 2; } want = argv[1]; walk(DefaultRootWindow(d)); return 0; }