diff --git a/bar.c b/bar.c index 2a5f5c6..f329595 100644 --- a/bar.c +++ b/bar.c @@ -290,16 +290,6 @@ run(struct bar_run_context *run_ctx) XCB_ATOM_WM_NAME, XCB_ATOM_STRING, 8, strlen(title), title); - const xcb_atom_t _NET_WM_PID = get_atom(bar->conn, "_NET_WM_PID"); - const xcb_atom_t _NET_WM_WINDOW_TYPE = get_atom(bar->conn, "_NET_WM_WINDOW_TYPE"); - const xcb_atom_t _NET_WM_WINDOW_TYPE_DOCK = get_atom(bar->conn, "_NET_WM_WINDOW_TYPE_DOCK"); - const xcb_atom_t _NET_WM_STATE = get_atom(bar->conn, "_NET_WM_STATE"); - const xcb_atom_t _NET_WM_STATE_ABOVE = get_atom(bar->conn, "_NET_WM_STATE_ABOVE"); - const xcb_atom_t _NET_WM_STATE_STICKY = get_atom(bar->conn, "_NET_WM_STATE_STICKY"); - const xcb_atom_t _NET_WM_DESKTOP = get_atom(bar->conn, "_NET_WM_DESKTOP"); - const xcb_atom_t _NET_WM_STRUT = get_atom(bar->conn, "_NET_WM_STRUT"); - const xcb_atom_t _NET_WM_STRUT_PARTIAL = get_atom(bar->conn, "_NET_WM_STRUT_PARTIAL"); - xcb_change_property( bar->conn, XCB_PROP_MODE_REPLACE, bar->win, diff --git a/main.c b/main.c index 93b5319..6866df8 100644 --- a/main.c +++ b/main.c @@ -11,14 +11,10 @@ #include -#include -#include -#include - #include "bar.h" #include "config.h" #include "yml.h" - +#include "xcb.h" static volatile sig_atomic_t aborted = 0; @@ -36,66 +32,7 @@ main(int argc, const char *const *argv) struct yml_node *conf = yml_load(conf_file); fclose(conf_file); - xcb_connection_t *conn = xcb_connect(NULL, NULL); - assert(conn != NULL); - - const xcb_setup_t *setup = xcb_get_setup(conn); - - /* Vendor string */ - int length = xcb_setup_vendor_length(setup); - char *vendor = malloc(length + 1); - memcpy(vendor, xcb_setup_vendor(setup), length); - vendor[length] = '\0'; - - /* Vendor release number */ - unsigned release = setup->release_number; - unsigned major = release / 10000000; release %= 10000000; - unsigned minor = release / 100000; release %= 100000; - unsigned patch = release / 1000; - - printf("%s %u.%u.%u (protocol: %u.%u)\n", vendor, - major, minor, patch, - setup->protocol_major_version, - setup->protocol_minor_version); - free(vendor); - - const xcb_query_extension_reply_t *randr = - xcb_get_extension_data(conn, &xcb_randr_id); - assert(randr->present); - - const xcb_query_extension_reply_t *render = - xcb_get_extension_data(conn, &xcb_render_id); - assert(render->present); - - xcb_randr_query_version_cookie_t randr_cookie = - xcb_randr_query_version(conn, XCB_RANDR_MAJOR_VERSION, - XCB_RANDR_MINOR_VERSION); - xcb_render_query_version_cookie_t render_cookie = - xcb_render_query_version(conn, XCB_RENDER_MAJOR_VERSION, - XCB_RENDER_MINOR_VERSION); - - xcb_generic_error_t *e; - xcb_randr_query_version_reply_t *randr_version = - xcb_randr_query_version_reply(conn, randr_cookie, &e); - assert(e == NULL); - - xcb_render_query_version_reply_t *render_version = - xcb_render_query_version_reply(conn, render_cookie, &e); - assert(e == NULL); - - xcb_flush(conn); - - printf(" RANDR: %u.%u\n" - " RENDER: %u.%u\n", - randr_version->major_version, - randr_version->minor_version, - render_version->major_version, - render_version->minor_version); - - free(randr_version); - free(render_version); - - xcb_disconnect(conn); + xcb_init(); const struct sigaction sa = {.sa_handler = &signal_handler}; sigaction(SIGINT, &sa, NULL); diff --git a/modules/xwindow.c b/modules/xwindow.c index 89bc174..c156fe3 100644 --- a/modules/xwindow.c +++ b/modules/xwindow.c @@ -17,14 +17,6 @@ #include "../bar.h" #include "../xcb.h" -static bool globals_inited = false; -xcb_atom_t UTF8_STRING; -xcb_atom_t _NET_ACTIVE_WINDOW; -xcb_atom_t _NET_CURRENT_DESKTOP; -xcb_atom_t _NET_WM_VISIBLE_NAME; -xcb_atom_t _NET_WM_NAME; -xcb_atom_t _NET_WM_PID; - struct private { /* Accessed from bar thread only */ struct particle *label; @@ -41,26 +33,6 @@ struct private { xcb_window_t active_win; }; -static void -init_globals(void) -{ - if (globals_inited) - return; - - xcb_connection_t *conn = xcb_connect(NULL, NULL); - assert(conn != NULL); - - UTF8_STRING = get_atom(conn, "UTF8_STRING"); - _NET_ACTIVE_WINDOW = get_atom(conn, "_NET_ACTIVE_WINDOW"); - _NET_CURRENT_DESKTOP = get_atom(conn, "_NET_CURRENT_DESKTOP"); - _NET_WM_VISIBLE_NAME = get_atom(conn, "_NET_WM_VISIBLE_NAME"); - _NET_WM_NAME = get_atom(conn, "_NET_WM_NAME"); - _NET_WM_PID = get_atom(conn, "_NET_WM_PID"); - globals_inited = true; - - xcb_disconnect(conn); -} - static void update_active_window(struct private *m) { @@ -317,8 +289,6 @@ destroy(struct module *mod) struct module * module_xwindow(struct particle *label) { - init_globals(); - struct private *m = calloc(1, sizeof(*m)); m->label = label; mtx_init(&m->lock, mtx_plain); diff --git a/xcb.c b/xcb.c index 5c7ca75..dc8409c 100644 --- a/xcb.c +++ b/xcb.c @@ -1,9 +1,113 @@ #include "xcb.h" +#include #include #include #include +#include +#include +#include + +xcb_atom_t UTF8_STRING; +xcb_atom_t _NET_WM_PID; +xcb_atom_t _NET_WM_WINDOW_TYPE; +xcb_atom_t _NET_WM_WINDOW_TYPE_DOCK; +xcb_atom_t _NET_WM_STATE; +xcb_atom_t _NET_WM_STATE_ABOVE; +xcb_atom_t _NET_WM_STATE_STICKY; +xcb_atom_t _NET_WM_DESKTOP; +xcb_atom_t _NET_WM_STRUT; +xcb_atom_t _NET_WM_STRUT_PARTIAL; +xcb_atom_t _NET_ACTIVE_WINDOW; +xcb_atom_t _NET_CURRENT_DESKTOP; +xcb_atom_t _NET_WM_VISIBLE_NAME; +xcb_atom_t _NET_WM_NAME; + +bool +xcb_init(void) +{ + xcb_connection_t *conn = xcb_connect(NULL, NULL); + assert(conn != NULL); + + const xcb_setup_t *setup = xcb_get_setup(conn); + + /* Vendor string */ + int length = xcb_setup_vendor_length(setup); + char *vendor = malloc(length + 1); + memcpy(vendor, xcb_setup_vendor(setup), length); + vendor[length] = '\0'; + + /* Vendor release number */ + unsigned release = setup->release_number; + unsigned major = release / 10000000; release %= 10000000; + unsigned minor = release / 100000; release %= 100000; + unsigned patch = release / 1000; + + printf("%s %u.%u.%u (protocol: %u.%u)\n", vendor, + major, minor, patch, + setup->protocol_major_version, + setup->protocol_minor_version); + free(vendor); + + const xcb_query_extension_reply_t *randr = + xcb_get_extension_data(conn, &xcb_randr_id); + assert(randr->present); + + const xcb_query_extension_reply_t *render = + xcb_get_extension_data(conn, &xcb_render_id); + assert(render->present); + + xcb_randr_query_version_cookie_t randr_cookie = + xcb_randr_query_version(conn, XCB_RANDR_MAJOR_VERSION, + XCB_RANDR_MINOR_VERSION); + xcb_render_query_version_cookie_t render_cookie = + xcb_render_query_version(conn, XCB_RENDER_MAJOR_VERSION, + XCB_RENDER_MINOR_VERSION); + + xcb_generic_error_t *e; + xcb_randr_query_version_reply_t *randr_version = + xcb_randr_query_version_reply(conn, randr_cookie, &e); + assert(e == NULL); + + xcb_render_query_version_reply_t *render_version = + xcb_render_query_version_reply(conn, render_cookie, &e); + assert(e == NULL); + + xcb_flush(conn); + + printf(" RANDR: %u.%u\n" + " RENDER: %u.%u\n", + randr_version->major_version, + randr_version->minor_version, + render_version->major_version, + render_version->minor_version); + + free(randr_version); + free(render_version); + + /* Cache atoms */ + UTF8_STRING = get_atom(conn, "UTF8_STRING"); + _NET_WM_PID = get_atom(conn, "_NET_WM_PID"); + _NET_WM_WINDOW_TYPE = get_atom(conn, "_NET_WM_WINDOW_TYPE"); + _NET_WM_WINDOW_TYPE_DOCK = get_atom(conn, "_NET_WM_WINDOW_TYPE_DOCK"); + _NET_WM_STATE = get_atom(conn, "_NET_WM_STATE"); + _NET_WM_STATE_ABOVE = get_atom(conn, "_NET_WM_STATE_ABOVE"); + _NET_WM_STATE_STICKY = get_atom(conn, "_NET_WM_STATE_STICKY"); + _NET_WM_DESKTOP = get_atom(conn, "_NET_WM_DESKTOP"); + _NET_WM_STRUT = get_atom(conn, "_NET_WM_STRUT"); + _NET_WM_STRUT_PARTIAL = get_atom(conn, "_NET_WM_STRUT_PARTIAL"); + _NET_ACTIVE_WINDOW = get_atom(conn, "_NET_ACTIVE_WINDOW"); + _NET_CURRENT_DESKTOP = get_atom(conn, "_NET_CURRENT_DESKTOP"); + _NET_WM_VISIBLE_NAME = get_atom(conn, "_NET_WM_VISIBLE_NAME"); + _NET_WM_NAME = get_atom(conn, "_NET_WM_NAME"); + _NET_WM_PID = get_atom(conn, "_NET_WM_PID"); + + xcb_disconnect(conn); + + return true; +} + xcb_atom_t get_atom(xcb_connection_t *conn, const char *name) { diff --git a/xcb.h b/xcb.h index 76c6fd7..ce84759 100644 --- a/xcb.h +++ b/xcb.h @@ -1,6 +1,25 @@ #pragma once +#include #include +bool xcb_init(void); + xcb_atom_t get_atom(xcb_connection_t *conn, const char *name); -char * get_atom_name(xcb_connection_t *conn, xcb_atom_t atom); +char *get_atom_name(xcb_connection_t *conn, xcb_atom_t atom); + +/* Cached atoms */ +xcb_atom_t UTF8_STRING; +xcb_atom_t _NET_WM_PID; +xcb_atom_t _NET_WM_WINDOW_TYPE; +xcb_atom_t _NET_WM_WINDOW_TYPE_DOCK; +xcb_atom_t _NET_WM_STATE; +xcb_atom_t _NET_WM_STATE_ABOVE; +xcb_atom_t _NET_WM_STATE_STICKY; +xcb_atom_t _NET_WM_DESKTOP; +xcb_atom_t _NET_WM_STRUT; +xcb_atom_t _NET_WM_STRUT_PARTIAL; +xcb_atom_t _NET_ACTIVE_WINDOW; +xcb_atom_t _NET_CURRENT_DESKTOP; +xcb_atom_t _NET_WM_VISIBLE_NAME; +xcb_atom_t _NET_WM_NAME;