From 0c567c67933cc48ac57f08167d88a57ce0504524 Mon Sep 17 00:00:00 2001 From: Federico Angelilli Date: Tue, 9 Jul 2024 17:02:42 +0200 Subject: Add event handling --- src/display.c | 115 +++++++++++++++++++++------------------------------------- 1 file changed, 42 insertions(+), 73 deletions(-) (limited to 'src/display.c') diff --git a/src/display.c b/src/display.c index 09549ce..a34e609 100644 --- a/src/display.c +++ b/src/display.c @@ -6,77 +6,6 @@ #include "any_log.h" #include "display.h" -static bool query_xrm(display_t *display, const char *resource, char **value) -{ - bool found = xcb_xrm_resource_get_string(display->database, resource, NULL, value) >= 0; - log_value_debug("Xrm query", - "b:found", found, - "s:resource", resource, - "s:value", *value ? *value : ""); - return found; -} - -static void update_xrm(display_t *display) -{ - xcb_flush(display->connection); - xcb_xrm_database_t *database = xcb_xrm_database_from_default(display->connection); - - if (database == NULL) { - log_warn("Xrm database couldn't be updated"); - return; - } - - xcb_xrm_database_free(display->database); - display->database = database; - log_debug("Xrm database updated"); -} - -static void update_scale(display_t *display) -{ - char *dpi_value; - if (query_xrm(display, "Xft.dpi", &dpi_value)) { - display->screen_dpi = strtod(dpi_value, NULL); - free(dpi_value); - - // Ignore invalid values - if (display->screen_dpi != 0) - return; - } - - display->screen_dpi = (double)display->screen_size->height * 25.4 / (double)display->screen_size->mheight; - log_debug("Fallback dpi value '%.2lf'", display->screen_dpi); -} - -// Check if point (px, py) is inside a rectangle in (x, y), (x+w, y), (x, y+h) and (w+h, y+h) -static inline bool in_rect(int px, int py, int x, int y, int w, int h) -{ - return px >= x && px <= x + w && py >= y && py <= y + h; -} - -// Check if point (px, py) is inside a circle of radius r and center (x, y) -static inline bool in_circle(int px, int py, int x, int y, int r) -{ - int dx = x - px; - int dy = y - py; - return (dx * dx + dy * dy) <= r * r; -} - -// Check if point (px, py) is inside a capsule in (x, y), (x+w, y), (x, y+h) and (w+h, y+h) -static inline bool in_capsule(int px, int py, int x, int y, int w, int h) -{ - assert(w >= h); - int radius = h / 2; - - // Trivial case - if (w == h) - return in_circle(px, py, x + radius, y + radius, radius); - - // General case - return in_circle(px, py, x + radius, y + radius, radius) - || in_circle(px, py, x + w - radius, y + radius, radius) - || in_rect(px, py, x + radius, y, w - 2 * radius, h); -} - void display_init(display_t *display) { memset(display, 0, sizeof(display_t)); @@ -149,8 +78,7 @@ void display_init(display_t *display) display->database = xcb_xrm_database_from_default(display->connection); assert(display->database != NULL); - // TODO: Dpi aware scaling - update_scale(display); + display_update_scale(display); assert(xcb_errors_context_new(display->connection, &display->errors) == 0); log_debug("Xcb errors loaded"); @@ -158,6 +86,47 @@ void display_init(display_t *display) xcb_flush(display->connection); } +bool display_query_xrm(display_t *display, const char *resource, char **value) +{ + bool found = xcb_xrm_resource_get_string(display->database, resource, NULL, value) >= 0; + log_value_debug("Xrm query", + "b:found", found, + "s:resource", resource, + "s:value", *value ? *value : ""); + return found; +} + +void display_update_xrm(display_t *display) +{ + xcb_flush(display->connection); + xcb_xrm_database_t *database = xcb_xrm_database_from_default(display->connection); + + if (database == NULL) { + log_warn("Xrm database couldn't be updated"); + return; + } + + xcb_xrm_database_free(display->database); + display->database = database; + log_debug("Xrm database updated"); +} + +void display_update_scale(display_t *display) +{ + char *dpi_value; + if (display_query_xrm(display, "Xft.dpi", &dpi_value)) { + display->screen_dpi = strtod(dpi_value, NULL); + free(dpi_value); + + // Ignore invalid values + if (display->screen_dpi != 0) + return; + } + + display->screen_dpi = (double)display->screen_size->height * 25.4 / (double)display->screen_size->mheight; + log_debug("Fallback dpi value '%.2lf'", display->screen_dpi); +} + void display_close(display_t *display) { xcb_ewmh_connection_wipe(&display->ewmh); -- cgit v1.2.3