core

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

lsw.c (1679B)


      1 /* See LICENSE file for copyright and license details. */
      2 
      3 #include <stdio.h>
      4 #include <stdlib.h>
      5 #include <err.h>
      6 #include <xcb/xcb.h>
      7 #include <xcb/xcb_aux.h>
      8 
      9 #include "arg.h"
     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 int should_list(xcb_window_t, int);
     17 static void list_windows(xcb_window_t, int);
     18 
     19 enum {
     20 	LIST_HIDDEN = 1 << 0,
     21 	LIST_IGNORE = 1 << 1,
     22 	LIST_ALL    = 1 << 2
     23 };
     24 
     25 static void
     26 usage(char *name)
     27 {
     28 	fprintf(stderr, "usage: %s [-houra] [wid...]\n", name);
     29 	exit(1);
     30 }
     31 
     32 static int
     33 should_list(xcb_window_t w, int mask)
     34 {
     35 	if ((mask & LIST_ALL)
     36 		|| (!mapped(conn, w) && mask & LIST_HIDDEN)
     37 		|| (ignore(conn, w) && mask & LIST_IGNORE)
     38 		|| (mapped(conn, w)
     39 			&& !ignore(conn, w)
     40 			&& mask == 0))
     41 		return 1;
     42 
     43 	return 0;
     44 }
     45 
     46 static void
     47 list_windows(xcb_window_t w, int listmask)
     48 {
     49 	int i, wn;
     50 	xcb_window_t *wc;
     51 
     52 	wn = get_windows(conn, w, &wc);
     53 
     54 	if (wc == NULL)
     55 		errx(1, "0x%08x: unable to retrieve children", w);
     56 
     57 	for (i=0; i<wn; i++) {
     58 		if (should_list(wc[i], listmask))
     59 			printf("0x%08x\n", wc[i]);
     60 	}
     61 
     62 	free(wc);
     63 }
     64 
     65 int
     66 main(int argc, char **argv)
     67 {
     68 	int listmask = 0, rootflag = 0;
     69 	char *argv0;
     70 
     71 	ARGBEGIN {
     72 		case 'a': listmask |= LIST_ALL; break;
     73 		case 'u': listmask |= LIST_HIDDEN; break;
     74 		case 'o': listmask |= LIST_IGNORE; break;
     75 		case 'r': rootflag = 1; break;
     76 		default : usage(argv0);
     77 	} ARGEND;
     78 
     79 	init_xcb(&conn);
     80 	get_screen(conn, &scrn);
     81 
     82 	if (rootflag == 1) {
     83 		printf("0x%08x\n", scrn->root);
     84 		return 0;
     85 	}
     86 
     87 	if (argc == 0)
     88 		list_windows(scrn->root, listmask);
     89 
     90 	while (*argv)
     91 		list_windows(strtoul(*argv++, NULL, 16), listmask);
     92 
     93 	kill_xcb(&conn);
     94 
     95 	return 0;
     96 }