aboutsummaryrefslogtreecommitdiff
path: root/src/display.c
diff options
context:
space:
mode:
authorFederico Angelilli <code@fedang.net>2024-07-09 17:02:42 +0200
committerFederico Angelilli <code@fedang.net>2024-07-09 17:02:42 +0200
commit0c567c67933cc48ac57f08167d88a57ce0504524 (patch)
treeda7c5ccc0935093cf5ecc661371db324ea0005cb /src/display.c
parent28adc6b395d2fb7545189636cec3651b9c2a5f73 (diff)
Add event handling
Diffstat (limited to 'src/display.c')
-rw-r--r--src/display.c115
1 files changed, 42 insertions, 73 deletions
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);