tpdw.c - wmutils - X windows manipulation utilities
(HTM) git clone git://z3bra.org/wmutils
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
tpdw.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 }