#include #include #include #include #include #include #include char *get_name(Window window); void set_name(Window window, char *name); Display *display; int main(int argc, char **argv) { Window target; char *name; char buf[4096]; if (argc == 2 && snprintf(buf, sizeof(buf), "\"%s\" `xselect` \"%s\"", argv[0], argv[1]) < sizeof(buf)) execlp("sh", "sh", "-c", buf, NULL); if (argc != 3) { char *name; name = strrchr(argv[0], '/'); name = name ? name+1 : argv[0]; fprintf(stderr, "usage: %s --get [window-id]\n %s [window-id] name\n", name, name); exit(1); } if (!strcmp(argv[1], "--get")) { argv[1] = argv[2]; --argc; } else if (!strcmp(argv[2], "--get")) { --argc; } target = strtol(argv[1], NULL, 10); if ((display = XOpenDisplay(NULL)) == NULL) { fprintf(stderr, "cannot open display\n"); exit(1); } if (argc == 2) { name = get_name(target); if (name) { printf("%s\n", name); XFree(name); } } else { name = argv[2]; set_name(target, name); } XCloseDisplay(display); exit(0); } char *get_name(Window window) /* need to XFree the returned name if not NULL */ { unsigned long n, extra; char *name; Atom real_type; int format; if (XGetWindowProperty( display, window, XA_WM_NAME, 0L, 256L, False, XA_STRING, &real_type, &format, &n, &extra, (unsigned char **)&name) != Success) { return False; } return name; } void set_name(Window window, char *name) { XChangeProperty(display, window, XA_WM_NAME, XA_STRING, 8, PropModeReplace, (unsigned char *)name, strlen(name)); XChangeProperty(display, window, XA_WM_ICON_NAME, XA_STRING, 8, PropModeReplace, (unsigned char *)name, strlen(name)); }