core

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

wattr.c (2192B)


      1 /* See LICENSE file for copyright and license details. */
      2 
      3 #include <stdio.h>
      4 #include <stdlib.h>
      5 #include <string.h>
      6 #include <err.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 
     14 static void usage(char *);
     15 static int get_attribute(xcb_window_t, int);
     16 
     17 enum {
     18 	ATTR_W = 1 << 0,
     19 	ATTR_H = 1 << 1,
     20 	ATTR_X = 1 << 2,
     21 	ATTR_Y = 1 << 3,
     22 	ATTR_B = 1 << 4,
     23 	ATTR_M = 1 << 5,
     24 	ATTR_I = 1 << 6,
     25 	ATTR_MAX
     26 };
     27 
     28 static void
     29 usage(char *name)
     30 {
     31 	fprintf(stderr, "usage: %s [-h] [bmiowhxy] <wid>\n", name);
     32 	exit(1);
     33 }
     34 
     35 static int
     36 get_attribute(xcb_window_t w, int attr)
     37 {
     38 	xcb_get_geometry_cookie_t c;
     39 	xcb_get_geometry_reply_t *r;
     40 
     41 	c = xcb_get_geometry(conn, w);
     42 	r = xcb_get_geometry_reply(conn, c, NULL);
     43 
     44 	if (r == NULL)
     45 		errx(1, "0x%08x: no such window", w);
     46 
     47 	switch (attr) {
     48 		case ATTR_X: attr = r->x; break;
     49 		case ATTR_Y: attr = r->y; break;
     50 		case ATTR_W: attr = r->width; break;
     51 		case ATTR_H: attr = r->height; break;
     52 		case ATTR_B: attr = r->border_width; break;
     53 	}
     54 
     55 	free(r);
     56 	return attr;
     57 }
     58 
     59 int
     60 main(int argc, char **argv)
     61 {
     62 	int c, ret = 0;
     63 	size_t i;
     64 	xcb_window_t w = 0;
     65 
     66 	if (argc < 2 || (strncmp(argv[1], "-h", 2) == 0)) {
     67 		usage(argv[0]);
     68 	}
     69 
     70 	init_xcb(&conn);
     71 
     72 	if (argc == 2) {
     73 		w = strtoul(argv[1], NULL, 16);
     74 		ret = exists(conn, w) ? 0 : 1;
     75 		goto end;
     76 	}
     77 
     78 	for (c=2; argv[c]; c++) {
     79 		w = strtoul(argv[c], NULL, 16);
     80 
     81 		for (i=0; i<strlen(argv[1]); i++) {
     82 			switch (argv[1][i]) {
     83 				case 'i':
     84 					printf("0x%08x", w);
     85 					break;
     86 				case 'b':
     87 					printf("%d", get_attribute(w, ATTR_B));
     88 					break;
     89 				case 'h': 
     90 					printf("%d", get_attribute(w, ATTR_H));
     91 					break;
     92 				case 'x':
     93 					printf("%d", get_attribute(w, ATTR_X));
     94 					break;
     95 				case 'y':
     96 					printf("%d", get_attribute(w, ATTR_Y));
     97 					break;
     98 				case 'w':
     99 					printf("%d", get_attribute(w, ATTR_W));
    100 					break;
    101 				case 'o':
    102 					ret = ignore(conn, w) ? 0 : 1;
    103 					goto end;
    104 				case 'm':
    105 					ret = mapped(conn, w) ? 0 : 1;
    106 					goto end;
    107 				default: kill_xcb(&conn); usage(argv[0]);
    108 			}
    109 			/* add a space if more attribute come after */
    110 			putc(i+1 < strlen(argv[1]) ? ' ' : '\n',stdout);
    111 		}
    112 	}
    113 
    114 end:
    115 	kill_xcb(&conn);
    116 
    117 	return ret;
    118 }