tchwb.c - wmutils - X windows manipulation utilities
(HTM) git clone git://z3bra.org/wmutils
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
tchwb.c (1926B)
---
1 /* See LICENSE file for copyright and license details. */
2
3 #include <xcb/xcb.h>
4 #include <xcb/xcb_aux.h>
5 #include <stdlib.h>
6 #include <stdio.h>
7 #include <err.h>
8
9 #include "arg.h"
10 #include "util.h"
11
12 static xcb_connection_t *conn;
13
14 static void usage(char *name);
15 static void set_border(int, int, xcb_window_t);
16
17 static void
18 usage(char *name)
19 {
20 fprintf(stderr, "usage: %s <-sc ...> <wid> [wid...]\n", name);
21 exit(1);
22 }
23
24 static void
25 set_border(int width, int color, xcb_window_t win)
26 {
27 uint32_t values[3];
28 uint16_t curr_width;
29 int mask;
30 xcb_get_geometry_reply_t *geom;
31
32 if (width != -1) {
33 geom = xcb_get_geometry_reply(conn, xcb_get_geometry(conn, win), NULL);
34 if (!geom)
35 return;
36
37 /* Windows track position based on the top left corner of the border.
38 * To make the border move instead of the window, we move the window up and left
39 * by the amount the border would have shifted it down and right.*/
40 curr_width = geom->border_width;
41 values[0] = geom->x + curr_width - width;
42 values[1] = geom->y + curr_width - width;
43 values[2] = width;
44
45 mask = XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y | XCB_CONFIG_WINDOW_BORDER_WIDTH ;
46 xcb_configure_window(conn, win, mask, values);
47
48 xcb_aux_sync(conn);
49
50 free(geom);
51 }
52
53 if (color != -1) {
54 values[0] = color;
55 mask = XCB_CW_BORDER_PIXEL;
56 xcb_change_window_attributes(conn, win, mask, values);
57
58 xcb_aux_sync(conn);
59 }
60 }
61
62 int
63 main(int argc, char **argv)
64 {
65 char *argv0;
66 int color,width;
67
68 color = width = -1;
69
70 if (argc < 2)
71 usage(argv[0]);
72
73 ARGBEGIN {
74 case 's':
75 width = strtoul(EARGF(usage(argv0)), NULL, 10);
76 break;
77 case 'c':
78 color = strtoul(EARGF(usage(argv0)), NULL, 16);
79 break;
80 default:
81 usage(argv0);
82 /* NOTREACHED */
83 } ARGEND
84
85 init_xcb(&conn);
86
87 /* assume remaining arguments are windows */
88 while (*argv)
89 set_border(width, color, strtoul(*argv++, NULL, 16));
90
91 xcb_aux_sync(conn);
92
93 kill_xcb(&conn);
94
95 return 0;
96 }