aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Oleynikov <ivan.oleynikov95@gmail.com>2021-07-27 00:19:42 +0600
committerHarry Jeffery <harry@exec64.co.uk>2021-07-29 17:01:31 +0000
commit3c1d27d8859cc4eda5802c1502ee5ae7430a9c8f (patch)
tree42b5f3a59b327bcf60ae6e1881fb2ec3923f6ed5
parenteeaf5e3cb983befd20bc5d706f5b8e7cd321decf (diff)
downloadimv-3c1d27d8859cc4eda5802c1502ee5ae7430a9c8f.tar.gz
Scale fonts when Wayland updates scaling factor
Before this commit, the code in src/wl_window.c seemed to handle the Wayland scaling [1] correctly, it was sending resize events to imv to update the buffer size accordingly. One thing it didn't update is the scaling of fonts that Pango renders on Cairo. This commit simply forwards the scaling factor (computed as [1] requests) together with updated buffer dimentions in resize event, and when the resize event is handled it calls cairo_surface_set_device_scale to notify Pango/Cairo of the scaling. For X11, I simply assume the scaline factor is always 1. This seems to be what the old code did: `grep scale src/x11_window.c` gives no matches. AFAIK, X11 does not have an established way of telling clients what scaling factor to use (and never updates it at runtime). [1]: https://wayland-book.com/surfaces-in-depth/hidpi.html
-rw-r--r--src/canvas.c3
-rw-r--r--src/canvas.h2
-rw-r--r--src/imv.c3
-rw-r--r--src/window.h1
-rw-r--r--src/wl_window.c4
-rw-r--r--src/x11_window.c3
6 files changed, 11 insertions, 5 deletions
diff --git a/src/canvas.c b/src/canvas.c
index 7e21b2e..2cea61e 100644
--- a/src/canvas.c
+++ b/src/canvas.c
@@ -69,7 +69,7 @@ void imv_canvas_free(struct imv_canvas *canvas)
free(canvas);
}
-void imv_canvas_resize(struct imv_canvas *canvas, int width, int height)
+void imv_canvas_resize(struct imv_canvas *canvas, int width, int height, double scale)
{
cairo_destroy(canvas->cairo);
cairo_surface_destroy(canvas->surface);
@@ -80,6 +80,7 @@ void imv_canvas_resize(struct imv_canvas *canvas, int width, int height)
canvas->surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32,
canvas->width, canvas->height);
assert(canvas->surface);
+ cairo_surface_set_device_scale(canvas->surface, scale, scale);
canvas->cairo = cairo_create(canvas->surface);
assert(canvas->cairo);
}
diff --git a/src/canvas.h b/src/canvas.h
index 255c10c..faf4103 100644
--- a/src/canvas.h
+++ b/src/canvas.h
@@ -19,7 +19,7 @@ struct imv_canvas *imv_canvas_create(int width, int height);
void imv_canvas_free(struct imv_canvas *canvas);
/* Set the buffer size of the canvas */
-void imv_canvas_resize(struct imv_canvas *canvas, int width, int height);
+void imv_canvas_resize(struct imv_canvas *canvas, int width, int height, double scale);
/* Blank the canvas to be empty and transparent */
void imv_canvas_clear(struct imv_canvas *canvas);
diff --git a/src/imv.c b/src/imv.c
index b83980f..7842800 100644
--- a/src/imv.c
+++ b/src/imv.c
@@ -447,8 +447,9 @@ static void event_handler(void *data, const struct imv_event *e)
const int wh = e->data.resize.height;
const int bw = e->data.resize.buffer_width;
const int bh = e->data.resize.buffer_height;
+ const double scale = e->data.resize.scale;
imv_viewport_update(imv->view, ww, wh, bw, bh, imv->current_image, imv->scaling_mode);
- imv_canvas_resize(imv->canvas, bw, bh);
+ imv_canvas_resize(imv->canvas, bw, bh, scale);
break;
}
case IMV_EVENT_KEYBOARD:
diff --git a/src/window.h b/src/window.h
index f84cbaf..a4786bb 100644
--- a/src/window.h
+++ b/src/window.h
@@ -24,6 +24,7 @@ struct imv_event {
int height;
int buffer_width;
int buffer_height;
+ double scale;
} resize;
struct {
int scancode;
diff --git a/src/wl_window.c b/src/wl_window.c
index 698d0e7..d7025d2 100644
--- a/src/wl_window.c
+++ b/src/wl_window.c
@@ -558,7 +558,8 @@ static void update_scale(struct imv_window *window)
.width = window->width,
.height = window->height,
.buffer_width = buffer_width,
- .buffer_height = buffer_height
+ .buffer_height = buffer_height,
+ .scale = window->scale,
}
}
};
@@ -639,6 +640,7 @@ static void toplevel_configure(void *data, struct xdg_toplevel *toplevel,
.height = window->height,
.buffer_width = buffer_width,
.buffer_height = buffer_height,
+ .scale = window->scale,
}
}
};
diff --git a/src/x11_window.c b/src/x11_window.c
index 77699f6..12176aa 100644
--- a/src/x11_window.c
+++ b/src/x11_window.c
@@ -346,7 +346,8 @@ void imv_window_pump_events(struct imv_window *window, imv_event_handler handler
.width = wa.width,
.height = wa.height,
.buffer_width = wa.width,
- .buffer_height = wa.height
+ .buffer_height = wa.height,
+ .scale = 1,
}
}
};