chwb.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 }