From a93aba600b1c5d019b680b9f4ff3fa85d5d43a60 Mon Sep 17 00:00:00 2001 From: allusive-dev Date: Tue, 19 Sep 2023 17:47:33 +1000 Subject: Fixed broken files/code and other errors --- src/atom.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/atom.c (limited to 'src/atom.c') diff --git a/src/atom.c b/src/atom.c new file mode 100644 index 0000000..0272dc8 --- /dev/null +++ b/src/atom.c @@ -0,0 +1,37 @@ +#include +#include + +#include "atom.h" +#include "common.h" +#include "utils.h" +#include "log.h" + +static inline void *atom_getter(void *ud, const char *atom_name, int *err) { + xcb_connection_t *c = ud; + xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply( + c, xcb_intern_atom(c, 0, to_u16_checked(strlen(atom_name)), atom_name), NULL); + + xcb_atom_t atom = XCB_NONE; + if (reply) { + log_debug("Atom %s is %d", atom_name, reply->atom); + atom = reply->atom; + free(reply); + } else { + log_error("Failed to intern atoms"); + *err = 1; + } + return (void *)(intptr_t)atom; +} + +/** + * Create a new atom structure and fetch all predefined atoms + */ +struct atom *init_atoms(xcb_connection_t *c) { + auto atoms = ccalloc(1, struct atom); + atoms->c = new_cache((void *)c, atom_getter, NULL); +#define ATOM_GET(x) atoms->a##x = (xcb_atom_t)(intptr_t)cache_get(atoms->c, #x, NULL) + LIST_APPLY(ATOM_GET, SEP_COLON, ATOM_LIST1); + LIST_APPLY(ATOM_GET, SEP_COLON, ATOM_LIST2); +#undef ATOM_GET + return atoms; +} -- cgit v1.2.3