]> git.lizzy.rs Git - bspwm.git/blob - utils.c
Triple window border
[bspwm.git] / utils.c
1 #include <stdarg.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <xcb/xcb.h>
5 #include <xcb/xcb_event.h>
6 #include "utils.h"
7
8 void die(const char *errstr, ...) {
9     va_list ap;
10
11     va_start(ap, errstr);
12     vfprintf(stderr, errstr, ap);
13     va_end(ap);
14     exit(EXIT_FAILURE);
15 }
16
17 void draw_triple_border(xcb_connection_t *dpy, xcb_window_t win, int ibw, int mbw, int obw, uint32_t ibc, uint32_t mbc, uint32_t obc)
18 {
19     int bw = ibw + mbw + obw;
20     xcb_get_geometry_reply_t *geom = xcb_get_geometry_reply(dpy, xcb_get_geometry(dpy, win), NULL);
21
22     int width = geom->width;
23     int height = geom->height;
24
25     unsigned int depth = geom->depth;
26
27     int full_width = width + 2 * bw;
28     int full_height = height + 2 * bw;
29
30     xcb_rectangle_t irectangles[] =
31     {
32         { width, 0, 2 * bw, height + 2 * bw },
33         { 0, height, width + 2 * bw, 2 * bw },
34     };
35
36     xcb_rectangle_t mrectangles[] =
37     {
38         { width + ibw, 0, 2 * (mbw + obw), height + 2 * bw },
39         { 0, height + ibw, width + 2 * bw, 2 * (mbw + obw) },
40     };
41
42     xcb_rectangle_t orectangles[] =
43     {
44         { width + ibw + mbw, 0, 2 * obw, height + 2 * bw },
45         { 0, height + ibw + mbw, width + 2 * bw, 2 * obw },
46     };
47
48     xcb_pixmap_t pix = xcb_generate_id(dpy);
49     xcb_create_pixmap(dpy, depth, pix, win, full_width, full_height);
50     xcb_gcontext_t gc = xcb_generate_id(dpy);
51     xcb_create_gc(dpy, gc, pix, 0, NULL);
52
53     /* inner border */
54     xcb_change_gc(dpy, gc, XCB_GC_FOREGROUND, &ibc);
55     xcb_poly_fill_rectangle(dpy, pix, gc, LENGTH(irectangles), irectangles);
56
57     /* main border */
58     xcb_change_gc(dpy, gc, XCB_GC_FOREGROUND, &mbc);
59     xcb_poly_fill_rectangle(dpy, pix, gc, LENGTH(mrectangles), mrectangles);
60
61     /* outer border */
62     xcb_change_gc(dpy, gc, XCB_GC_FOREGROUND, &obc);
63     xcb_poly_fill_rectangle(dpy, pix, gc, LENGTH(orectangles), orectangles);
64
65     /* apply border pixmap */
66     xcb_change_window_attributes(dpy, win, XCB_CW_BORDER_PIXMAP, &pix);
67
68     free(geom);
69     xcb_free_gc(dpy, gc);
70     xcb_free_pixmap(dpy, pix);
71 }