From 0b3c8210f3472c7d420c503193391fe9ace0c8cc Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 22 Nov 2018 15:37:33 +0530 Subject: [PATCH] Various Wayland DPI scaling fixes Use the glfw window content scale api to get the DPI for windows. Likely, more accurate than our logic to find the overlapping monitor to get the DPI. Also, after a DPI change event send a fake resize event to workaround render surface not being properly updated. Fixes #1143 --- kitty/glfw.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/kitty/glfw.c b/kitty/glfw.c index f31641486..cc8b359c1 100644 --- a/kitty/glfw.c +++ b/kitty/glfw.c @@ -27,9 +27,13 @@ static void set_os_window_dpi(OSWindow *w); void update_os_window_viewport(OSWindow *window, bool notify_boss) { - int w, h; - glfwGetFramebufferSize(window->handle, &window->viewport_width, &window->viewport_height); + int w, h, fw, fh; + glfwGetFramebufferSize(window->handle, &fw, &fh); glfwGetWindowSize(window->handle, &w, &h); + if (fw == window->viewport_width && fh == window->viewport_height && w == window->window_width && h == window->window_height) { + return; // no change, ignore + } + window->viewport_width = fw; window->viewport_height = fh; double xr = window->viewport_x_ratio, yr = window->viewport_y_ratio; window->viewport_x_ratio = (double)window->viewport_width / (double)w; window->viewport_y_ratio = (double)window->viewport_height / (double)h; @@ -45,6 +49,11 @@ update_os_window_viewport(OSWindow *window, bool notify_boss) { window->window_height = MAX(h, 100); if (notify_boss) { call_boss(on_window_resize, "KiiO", window->id, window->viewport_width, window->viewport_height, dpi_changed ? Py_True : Py_False); + if (dpi_changed && global_state.is_wayland) { + // Fake resize event needed on weston to ensure surface is + // positioned correctly after DPI change + glfwSetWindowSize(window->handle, window->window_width, window->window_height); + } } } @@ -338,12 +347,9 @@ current_monitor(GLFWwindow *window) { static inline void get_window_dpi(GLFWwindow *w, double *x, double *y) { - GLFWmonitor *monitor = NULL; - if (w) monitor = current_monitor(w); - if (monitor == NULL) { PyErr_Print(); monitor = glfwGetPrimaryMonitor(); } float xscale = 1, yscale = 1; - if (monitor) glfwGetMonitorContentScale(monitor, &xscale, &yscale); - if (!xscale || !yscale) glfwGetMonitorContentScale(glfwGetPrimaryMonitor(), &xscale, &yscale); + if (w) glfwGetWindowContentScale(w, &xscale, &yscale); + else glfwGetMonitorContentScale(glfwGetPrimaryMonitor(), &xscale, &yscale); if (!xscale) xscale = 1.0; if (!yscale) yscale = 1.0; #ifdef __APPLE__