From 3e77c1699a843c0512a347cf25938d1f93e715ae Mon Sep 17 00:00:00 2001 From: Olivier Fourdan Date: Mon, 27 Nov 2023 13:57:58 +0100 Subject: [PATCH] xwayland: Add helper function for fractional scaling Fractional scaling may not be available, or not suitable for the current configuration (e.g. if running rootless). Add a helper function to tell whether fractional scaling should be used. Signed-off-by: Olivier Fourdan Reviewed-By: Kenny Levinsen Acked-by: Peter Hutterer Part-of: --- hw/xwayland/xwayland-screen.c | 23 +++++++++++++++++++++++ hw/xwayland/xwayland-screen.h | 1 + 2 files changed, 24 insertions(+) diff --git a/hw/xwayland/xwayland-screen.c b/hw/xwayland/xwayland-screen.c index 6a0f5a2ef..42c9a0e20 100644 --- a/hw/xwayland/xwayland-screen.c +++ b/hw/xwayland/xwayland-screen.c @@ -773,6 +773,26 @@ xwl_screen_lost_focus(struct xwl_screen *xwl_screen) } } +Bool +xwl_screen_should_use_fractional_scale(struct xwl_screen *xwl_screen) +{ + /* Fullscreen uses a viewport already */ + if (xwl_screen->fullscreen) + return FALSE; + + if (xwl_screen->rootless) + return FALSE; + + /* We need both fractional scale and viewporter protocols */ + if (!xwl_screen->fractional_scale_manager) + return FALSE; + + if (!xwl_screen->viewporter) + return FALSE; + + return xwl_screen->hidpi; +} + Bool xwl_screen_update_global_surface_scale(struct xwl_screen *xwl_screen) { @@ -780,6 +800,9 @@ xwl_screen_update_global_surface_scale(struct xwl_screen *xwl_screen) struct xwl_window *xwl_window; int32_t old_scale; + if (xwl_screen_should_use_fractional_scale(xwl_screen)) + return FALSE; + if (xwl_screen->rootless) return FALSE; diff --git a/hw/xwayland/xwayland-screen.h b/hw/xwayland/xwayland-screen.h index d2c0865b8..477473eea 100644 --- a/hw/xwayland/xwayland-screen.h +++ b/hw/xwayland/xwayland-screen.h @@ -173,5 +173,6 @@ void xwl_surface_damage(struct xwl_screen *xwl_screen, int xwl_screen_get_next_output_serial(struct xwl_screen * xwl_screen); void xwl_screen_lost_focus(struct xwl_screen *xwl_screen); Bool xwl_screen_update_global_surface_scale(struct xwl_screen *xwl_screen); +Bool xwl_screen_should_use_fractional_scale(struct xwl_screen *xwl_screen); #endif /* XWAYLAND_SCREEN_H */