From 7d795eede96e08bf7673a3264648b33693adea21 Mon Sep 17 00:00:00 2001 From: Federico Angelilli Date: Wed, 15 Nov 2023 20:55:54 +0100 Subject: Fix dpi calculation --- x11.c | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/x11.c b/x11.c index ac1d858..beb65b8 100644 --- a/x11.c +++ b/x11.c @@ -22,6 +22,7 @@ struct Window { xcb_connection_t *connection; xcb_screen_t *screen; + xcb_randr_screen_size_t *screen_size; xcb_xrm_database_t *database; xcb_errors_context_t *errors; xcb_drawable_t window; @@ -30,8 +31,6 @@ struct Window { cairo_surface_t *surface; cairo_t *cr; double dpi; - uint16_t screen_width; - uint16_t screen_height; int x, y; int width, height; GSource *source; @@ -151,6 +150,17 @@ static void attach_source(Window *win) g_source_attach(win->source, NULL); } +static bool query_xrm(Window *win, const char *res, char **value) +{ + if (xcb_xrm_resource_get_string(win->database,res, res, value) >= 0) { + log_debug("Xrm query '%s' found '%s'", res, *value); + return true; + } + + log_debug("Xrm query '%s' not found", res); + return false; +} + static xcb_atom_t intern_atom(Window *win, const char *atom) { xcb_generic_error_t *error; @@ -277,11 +287,9 @@ Window *window_create(void) xcb_randr_get_screen_info_reply_t *info_reply = xcb_randr_get_screen_info_reply(win->connection, cookie, &error); g_assert_null(error); - xcb_randr_screen_size_t *screen_size = xcb_randr_get_screen_info_sizes(info_reply); - log_debug("Screen size [width=%d, height=%d]", screen_size->width, screen_size->height); - - win->screen_width = screen_size->width; - win->screen_height = screen_size->height; + win->screen_size = xcb_randr_get_screen_info_sizes(info_reply); + g_assert_nonnull(win->screen_size); + log_debug("Screen size [width=%d, height=%d]", win->screen_size->width, win->screen_size->height); win->width = win->height = 0; win->x = win->y = 0; @@ -367,8 +375,8 @@ found_visual: win->surface = cairo_xcb_surface_create(win->connection, win->window, win->visual_type, - screen_size->width, - screen_size->height); + win->screen_size->width, + win->screen_size->height); g_assert_cmpint(cairo_surface_status(win->surface), ==, CAIRO_STATUS_SUCCESS); log_debug("Cairo surface created"); @@ -394,17 +402,11 @@ void window_update_scale(Window *win) const char *dpi_res = "Xft.dpi"; char *dpi_value; - if (xcb_xrm_resource_get_string(win->database, dpi_res, dpi_res, &dpi_value) >= 0) { - log_debug("Xrm query '%s' found '%s'", dpi_res, dpi_value); + if (query_xrm(win, dpi_res, &dpi_value)) { win->dpi = strtod(dpi_value, NULL); g_free(dpi_value); } else { - log_debug("Xrm query '%s' not found", dpi_res); - - win->dpi = 96.0; - // TODO: Should we actually calculate the dpi depending on the screen size? - //win->dpi = (double)screen_size->height * 25.4 / (double)screen_size->mheight; - + win->dpi = (double)win->screen_size->height * 25.4 / (double)win->screen_size->mheight; log_debug("Fallback dpi value '%.2lf'", win->dpi); } } @@ -416,8 +418,8 @@ double window_get_scale(Window *win) void window_get_screen_size(Window *win, int *width, int *height) { - *width = win->screen_width; - *height = win->screen_height; + *width = win->screen_size->width; + *height = win->screen_size->height; } void window_set_opacity(Window *win, double alpha) -- cgit v1.2.3