libwm

library for X windows manipulations
git clone git://z3bra.org/libwm
Log | Files | Refs | LICENSE

commit d9e5eeb099b33941fec3c257e5051cd5ce03da53
parent ead66d8b2d01d853ac9b27fa4bb6f6120433b71d
Author: Willy Goiffon <dev@z3bra.org>
Date:   Mon, 28 Oct 2019 18:44:30 +0100

Add functions to deal with window properties (atoms)

Diffstat:
libwm.c | 77++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------
wm.h | 18++++++++++++++----
2 files changed, 72 insertions(+), 23 deletions(-)

diff --git a/libwm.c b/libwm.c @@ -176,34 +176,67 @@ wm_get_attribute(xcb_window_t wid, int attr) return attr; } -int -wm_get_atom_string(xcb_window_t wid, xcb_atom_t atom, char **value) +xcb_atom_t +wm_add_atom(xcb_atom_t type, char *name, size_t len) { - int len; - xcb_get_property_cookie_t cookie; - xcb_get_property_reply_t *reply; + xcb_atom_t atom; + xcb_intern_atom_cookie_t c; + xcb_intern_atom_reply_t *r; - cookie = xcb_get_property(conn, 0, wid, atom, XCB_ATOM_STRING, 0, 0); - reply = xcb_get_property_reply(conn, cookie, NULL); + c = xcb_intern_atom(conn, 0, len, name); + r = xcb_intern_atom_reply(conn, c, NULL); + if (!r) + return 0; - if (reply == NULL) { - free(reply); - *value = NULL; - return -1; - } + atom = r->atom; + free(r); - len = xcb_get_property_value_length(reply); - *value = realloc(value, len); + return atom; +} + +int +wm_set_atom(xcb_window_t wid, xcb_atom_t atom, xcb_atom_t type, size_t len, void *data) +{ + xcb_void_cookie_t c; + xcb_generic_error_t *e; - if (value == NULL) + c = xcb_change_property_checked(conn, XCB_PROP_MODE_REPLACE, + wid, atom, type, 32, len, data); + e = xcb_request_check(conn, c); + if (!e) return -1; - *value = (char*)xcb_get_property_value(reply); - free(reply); + free(e); return 0; } +void * +wm_get_atom(xcb_window_t wid, xcb_atom_t atom, xcb_atom_t type, size_t *len) +{ + void *d; + size_t n; + xcb_get_property_cookie_t c; + xcb_get_property_reply_t *r; + + c = xcb_get_property(conn, 0, wid, atom, type, 0, 1); + r = xcb_get_property_reply(conn, c, NULL); + if (!r) + return NULL; + + if (!(n = xcb_get_property_value_length(r))) { + free(r); + return NULL; + } + + if (len) + *len = n; + + d = xcb_get_property_value(r); + + return d; +} + int wm_get_cursor(int mode, uint32_t wid, int *x, int *y) { @@ -384,9 +417,15 @@ wm_resize(xcb_window_t wid, int mode, int w, int h) } int -wm_restack(xcb_window_t wid, uint32_t mode) +wm_restack(xcb_window_t wid, uint32_t mode, xcb_window_t sibling) { - uint32_t values[1] = { mode }; + uint32_t r = 0, mask = 0, values[2]; + if (sibling) { + mask |= XCB_CONFIG_WINDOW_SIBLING; + values[r++] = sibling; + } + mask |= XCB_CONFIG_WINDOW_STACK_MODE; + values[r++] = mode; xcb_configure_window(conn, wid, XCB_CONFIG_WINDOW_STACK_MODE, values); return 0; } diff --git a/wm.h b/wm.h @@ -92,10 +92,20 @@ int wm_is_listable(xcb_window_t wid, int mask); int wm_is_mapped(xcb_window_t wid); /* - * Fills the given pointer with the value of the atom for the given window - * Returns -1 if a value can't be retrieved + * Request the X server to add a new atom, and return this new atom ID */ -int wm_get_atom_string(xcb_window_t wid, xcb_atom_t atom, char **value); +xcb_atom_t wm_add_atom(xcb_atom_t type, char *name, size_t len); + +/* + * Change the value of the specified atom + */ +int wm_set_atom(xcb_window_t wid, xcb_atom_t atom, xcb_atom_t type, size_t len, void *data); + +/* + * Retrieve the value of the given atom. The value length is set in the + * `len` pointer if specified + */ +void *wm_get_atom(xcb_window_t wid, xcb_atom_t atom, xcb_atom_t type, size_t *len); /* * Get the first screen, and set the `scrn` global variable accordingly. @@ -201,7 +211,7 @@ int wm_remap(xcb_window_t wid, int mode); * XCB_STACK_MODE_BELOW * XCB_STACK_MODE_OPPOSITE */ -int wm_restack(xcb_window_t wid, uint32_t mode); +int wm_restack(xcb_window_t wid, uint32_t mode, xcb_window_t sibling); /* * Register the given event(s) on the window.