pdw.c (1471B)
1 /* See LICENSE file for copyright and license details. */ 2 3 #include <err.h> 4 #include <stdio.h> 5 #include <stdlib.h> 6 #include <string.h> 7 #include <xcb/xcb.h> 8 #include <xcb/xcb_aux.h> 9 10 #include "util.h" 11 12 static xcb_connection_t *conn; 13 static xcb_screen_t *scrn; 14 15 static void usage(char *); 16 static xcb_window_t focus_window(void); 17 static xcb_window_t parent(xcb_window_t); 18 19 static void 20 usage(char *name) 21 { 22 fprintf(stderr, "usage: %s [wid]\n", name); 23 exit(1); 24 } 25 26 static xcb_window_t 27 focus_window(void) 28 { 29 xcb_window_t w = 0; 30 xcb_get_input_focus_cookie_t c; 31 xcb_get_input_focus_reply_t *r; 32 33 c = xcb_get_input_focus(conn); 34 r = xcb_get_input_focus_reply(conn, c, NULL); 35 if (r == NULL) 36 errx(1, "xcb_get_input_focus"); 37 38 w = r->focus; 39 free(r); 40 41 if (w == XCB_NONE || w == XCB_INPUT_FOCUS_POINTER_ROOT) 42 errx(1, "focus not set"); 43 44 return w; 45 } 46 47 static xcb_window_t 48 parent(xcb_window_t w) 49 { 50 xcb_query_tree_cookie_t c; 51 xcb_query_tree_reply_t *r; 52 53 c = xcb_query_tree(conn, w); 54 r = xcb_query_tree_reply(conn, c, NULL); 55 if (r == NULL) 56 errx(1, "failed to get parent"); 57 58 w = (!r->parent || r->parent == scrn->root) ? w : parent(r->parent); 59 free(r); 60 61 return w; 62 } 63 64 int 65 main(int argc, char **argv) 66 { 67 xcb_window_t w; 68 69 if (argc > 2 || (argc > 1 && (!strncmp(argv[1], "-h", 2)))) 70 usage(argv[0]); 71 72 init_xcb(&conn); 73 get_screen(conn, &scrn); 74 75 w = (argc > 1) ? strtoul(argv[1], NULL, 16) : focus_window(); 76 77 printf("0x%08x\n", parent(w)); 78 79 kill_xcb(&conn); 80 return 0; 81 }