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 }