5 #include <xcb/xcb_event.h>
8 void die(const char *errstr, ...) {
12 vfprintf(stderr, errstr, ap);
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)
19 int bw = ibw + mbw + obw;
20 xcb_get_geometry_reply_t *geom = xcb_get_geometry_reply(dpy, xcb_get_geometry(dpy, win), NULL);
22 int width = geom->width;
23 int height = geom->height;
25 unsigned int depth = geom->depth;
27 int full_width = width + 2 * bw;
28 int full_height = height + 2 * bw;
30 xcb_rectangle_t irectangles[] =
32 { width, 0, 2 * bw, height + 2 * bw },
33 { 0, height, width + 2 * bw, 2 * bw },
36 xcb_rectangle_t mrectangles[] =
38 { width + ibw, 0, 2 * (mbw + obw), height + 2 * bw },
39 { 0, height + ibw, width + 2 * bw, 2 * (mbw + obw) },
42 xcb_rectangle_t orectangles[] =
44 { width + ibw + mbw, 0, 2 * obw, height + 2 * bw },
45 { 0, height + ibw + mbw, width + 2 * bw, 2 * obw },
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);
54 xcb_change_gc(dpy, gc, XCB_GC_FOREGROUND, &ibc);
55 xcb_poly_fill_rectangle(dpy, pix, gc, LENGTH(irectangles), irectangles);
58 xcb_change_gc(dpy, gc, XCB_GC_FOREGROUND, &mbc);
59 xcb_poly_fill_rectangle(dpy, pix, gc, LENGTH(mrectangles), mrectangles);
62 xcb_change_gc(dpy, gc, XCB_GC_FOREGROUND, &obc);
63 xcb_poly_fill_rectangle(dpy, pix, gc, LENGTH(orectangles), orectangles);
65 /* apply border pixmap */
66 xcb_change_window_attributes(dpy, win, XCB_CW_BORDER_PIXMAP, &pix);
70 xcb_free_pixmap(dpy, pix);