aboutsummaryrefslogtreecommitdiff
path: root/x11.c
diff options
context:
space:
mode:
authorFederico Angelilli <code@fedang.net>2023-11-15 20:55:54 +0100
committerFederico Angelilli <code@fedang.net>2023-11-15 20:55:54 +0100
commit7d795eede96e08bf7673a3264648b33693adea21 (patch)
treeb862640400334500c529d0b6c9a1be48cacecc07 /x11.c
parent68ef49366f267bc9f93ba779639022a5e171d375 (diff)
Fix dpi calculation
Diffstat (limited to 'x11.c')
-rw-r--r--x11.c40
1 files 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)