glazier

the original window manipulator
Log | Files | Refs | Submodules | README | LICENSE

commit 9caeb51acc9f6f228fd7897469844c7bf9b0cf70
parent 1e6e010ff05bd712cd637361a35e7fb8689b2865
Author: Willy Goiffon <dev@z3bra.org>
Date:   Fri, 25 Oct 2019 01:01:10 +0200

Add outline() to outline regions on-screen

Diffstat:
glazier.c | 38++++++++++++++++++++++++++++++++++++++
1 file changed, 38 insertions(+), 0 deletions(-)

diff --git a/glazier.c b/glazier.c @@ -24,6 +24,7 @@ struct cursor_t { void usage(char *); static int takeover(); static int adopt(xcb_window_t); +static int outline(xcb_drawable_t, int, int, int, int, int); static int ev_callback(xcb_generic_event_t *); /* XCB events callbacks */ @@ -139,6 +140,43 @@ takeover() } static int +outline(xcb_drawable_t wid, int x, int y, int w, int h, int clear) +{ + int mask, val[3]; + static int X = 0, Y = 0, W = 0, H = 0; + xcb_gcontext_t gc; + xcb_rectangle_t r; + + gc = xcb_generate_id(conn); + mask = XCB_GC_FUNCTION | XCB_GC_LINE_WIDTH | XCB_GC_SUBWINDOW_MODE; + val[0] = XCB_GX_INVERT; + val[1] = 0; + val[2] = XCB_SUBWINDOW_MODE_INCLUDE_INFERIORS; + xcb_create_gc(conn, gc, wid, mask, val); + + /* redraw last rectangle to clear it */ + r.x = X; + r.y = Y; + r.width = W; + r.height = H; + xcb_poly_rectangle(conn, wid, gc, 1, &r); + + if (clear) { + X = Y = W = H = 0; + return 0; + } + + /* draw rectangle and save its coordinates for later removal */ + X = r.x = x; + Y = r.y = y; + W = r.width = w; + H = r.height = h; + xcb_poly_rectangle(conn, wid, gc, 1, &r); + + return 0; +} + +static int cb_default(xcb_generic_event_t *ev) { if (verbose && XEV(ev)) {