From 700e21be923b470f6d6965119c6baeffa75aeecc Mon Sep 17 00:00:00 2001 From: Federico Angelilli Date: Thu, 2 Nov 2023 22:23:53 +0100 Subject: Add RandR support and logging --- Makefile | 1 + x11.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/Makefile b/Makefile index 288a9ea..b96b6a7 100644 --- a/Makefile +++ b/Makefile @@ -6,6 +6,7 @@ DEPS = cairo \ xcb \ xcb-icccm \ xcb-xrm \ + xcb-randr \ glib-2.0 CFLAGS := $(shell pkgconf --cflags $(DEPS)) LDFLAGS := $(shell pkgconf --libs $(DEPS)) -lm diff --git a/x11.c b/x11.c index 032b6d4..9f4aabd 100644 --- a/x11.c +++ b/x11.c @@ -9,18 +9,20 @@ #include #include #include +#include #include "x11.h" +#include "log.h" struct Window { xcb_screen_t *screen; xcb_connection_t *connection; - xcb_xrm_database_t *database; + xcb_xrm_database_t *database; xcb_drawable_t window; xcb_visualtype_t *visual_type; cairo_surface_t *surface; cairo_t *cr; - double dpi; + double dpi; }; Window *window_create(void) @@ -29,21 +31,45 @@ Window *window_create(void) int preferred_screen = 0; win->connection = xcb_connect(NULL, &preferred_screen); - assert(win->connection != NULL && !xcb_connection_has_error(win->connection)); + assert(win->connection != NULL && !xcb_connection_has_error(win->connection)); + log_debug("Xcb established connection"); - win->database = xcb_xrm_database_from_default(win->connection); - assert(win->database != NULL); + xcb_randr_query_version_cookie_t version_cookie = xcb_randr_query_version(win->connection, + XCB_RANDR_MAJOR_VERSION, + XCB_RANDR_MINOR_VERSION); - char *dpi_value; - if (xcb_xrm_resource_get_string(win->database, "Xft.dpi", "Xft.dpi", &dpi_value) >= 0) { - win->dpi = strtod(dpi_value, NULL); - g_free(dpi_value); - } else { - // TODO: Calculate automatically somehow - win->dpi = 96.0; - } + xcb_generic_error_t *error; + xcb_randr_query_version_reply_t *randr_version = xcb_randr_query_version_reply(win->connection, + version_cookie, + &error); + + log_debug("RandR version %d.%d", randr_version->major_version, randr_version->minor_version); + assert(error == NULL || randr_version->major_version < 1); + + xcb_randr_select_input(win->connection, + win->window, + XCB_RANDR_NOTIFY_MASK_SCREEN_CHANGE | + XCB_RANDR_NOTIFY_MASK_OUTPUT_CHANGE | + XCB_RANDR_NOTIFY_MASK_OUTPUT_PROPERTY); + + win->database = xcb_xrm_database_from_default(win->connection); + assert(win->database != NULL); + + char *dpi_value; + if (xcb_xrm_resource_get_string(win->database, "Xft.dpi", "Xft.dpi", &dpi_value) >= 0) { + log_debug("Xrm query '%s' found '%s'", "Xft.dpi", dpi_value); + + win->dpi = strtod(dpi_value, NULL); + g_free(dpi_value); + } else { + log_debug("Xrm query '%s' not found", "Xft.dpi"); + + // TODO: Calculate automatically somehow + win->dpi = 96.0; + } xcb_screen_iterator_t iter = xcb_setup_roots_iterator(xcb_get_setup(win->connection)); + log_debug("Default screen %d", preferred_screen); while (preferred_screen != 0 && iter.rem) { xcb_screen_next(&iter); @@ -65,6 +91,8 @@ Window *window_create(void) // XCB_CW_BORDER_PIXEL | XCB_CW_EVENT_MASK | XCB_CW_COLORMAP, &win->screen->white_pixel); + log_debug("X11 window created (id %u)", win->window); + xcb_icccm_set_wm_name(win->connection, win->window, XCB_ATOM_STRING, 8, strlen("comet"), "comet"); xcb_map_window(win->connection, win->window); xcb_flush(win->connection); @@ -86,8 +114,13 @@ Window *window_create(void) done: + log_debug("Xcb initialized"); + win->surface = cairo_xcb_surface_create(win->connection, win->window, win->visual_type, w, h); + assert(cairo_surface_status(win->surface) == CAIRO_STATUS_SUCCESS); + win->cr = cairo_create(win->surface); + assert(cairo_status(win->cr) == CAIRO_STATUS_SUCCESS); log_debug("Cairo initialized"); -- cgit v1.2.3