Commit 752261d295cb5681f474549e4bd197864f975669 Parent: e55f495331271a372ae1b603d2a94966a995f828 Author: mcol <mcol@posteo.net> Date: 2020-04-18 18:41:28 +0100 Committer: mcol <mcol@posteo.net> Committed: 2020-04-18 18:41:28 +0100 Set window shape as 1px inside border of screen
xoop.c Modified
@@ -2,35 +2,13 @@ #include <stdio.h> #include <string.h> #include <xcb/xcb.h> +#include <xcb/shape.h> xcb_connection_t *conn; xcb_screen_t *screen; -void clip_window(xcb_window_t wid) -{ - uint32_t mask; - xcb_gcontext_t gc; - - mask = XCB_GC_CLIP_ORIGIN_X | XCB_GC_CLIP_ORIGIN_Y;// | XCB_GC_CLIP_MASK - - const uint32_t values[] = { - 1, - 1, - }; - - gc = xcb_generate_id(conn); - xcb_create_gc( - conn, - gc, - wid, - mask, - values - ); -} - - void set_window_type(xcb_window_t wid) { xcb_intern_atom_cookie_t cookie1, cookie2; xcb_intern_atom_reply_t *reply1, *reply2; @@ -55,12 +33,67 @@ } +void set_window_shape(xcb_window_t wid) +{ + xcb_gcontext_t gc = xcb_generate_id(conn); + xcb_pixmap_t pixmap = xcb_generate_id(conn); + + xcb_create_pixmap( + conn, + 1, + pixmap, + wid, + screen->width_in_pixels, + screen->height_in_pixels + ); + + const uint32_t values[] = { + screen->white_pixel, + }; + + xcb_create_gc( + conn, + gc, + pixmap, + XCB_GC_FOREGROUND, + values + ); + + xcb_rectangle_t rect = { + 1, + 1, + screen->width_in_pixels - 2, + screen->height_in_pixels - 2 + }; + xcb_poly_fill_rectangle( + conn, + pixmap, + gc, + 1, + &rect + ); + + xcb_shape_mask( + conn, + XCB_SHAPE_SO_SUBTRACT, + XCB_SHAPE_SK_INPUT, + wid, + 0, + 0, + pixmap + ); + + xcb_free_gc(conn, gc); + xcb_free_pixmap(conn, pixmap); +} + + xcb_window_t setup_window() { xcb_window_t wid = xcb_generate_id(conn); - uint32_t mask_val = 0; - mask_val |= XCB_EVENT_MASK_ENTER_WINDOW; + uint32_t values = 0; + values |= XCB_EVENT_MASK_ENTER_WINDOW; xcb_create_window( conn, @@ -69,17 +102,17 @@ screen->root, 0, 0, - 1, // screen->width_in_pixels + screen->width_in_pixels, screen->height_in_pixels, 0, XCB_WINDOW_CLASS_INPUT_ONLY, XCB_COPY_FROM_PARENT, XCB_CW_EVENT_MASK, - &mask_val + &values ); set_window_type(wid); - clip_window(wid); + set_window_shape(wid); uint32_t above = XCB_STACK_MODE_ABOVE; xcb_configure_window(conn, wid, XCB_CONFIG_WINDOW_STACK_MODE, &above); @@ -111,10 +144,6 @@ case XCB_ENTER_NOTIFY: printf("# enter window\n"); break; - - default: - printf("# %d\n", event->response_type); - break; } free(event);
makefile Modified
@@ -1,6 +1,6 @@ OUT = xoop SRC = xoop.c -CFLAGS += -Wall -Wextra -pedantic -lxcb +CFLAGS += -Wall -Wextra -pedantic -lxcb -lxcb-shape PREFIX ?= /usr/local BINPREFIX ?= $(PREFIX)/bin