core

WMUtils core.
git clone git://git.zepp.club/core.git
Log | Files | Refs | README | LICENSE

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 }