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