From 8cfbdb4313edbd7748fb21769d37bf5c35692042 Mon Sep 17 00:00:00 2001 From: Robert Mader Date: Mon, 28 Aug 2023 14:41:39 +0200 Subject: [PATCH] wayland/surface: Add fallback for get_highest_output_scale If we don't have a monitor for a surface - e.g. because the surface is not mapped yet - return the highest scale of all outputs. This makes us send a preferred scale before a client draws its first frame. The highest scale is always correct in single monitor cases and arguably a good option otherwise as scaling down usually looks better than scaling up. Note that this is currently only used by the fractional scale protocol, but will also be used for the core `send_preferred_scale()` once we implement it. Part-of: --- src/wayland/meta-wayland-surface.c | 31 +++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c index c9458e60c..60f306bfb 100644 --- a/src/wayland/meta-wayland-surface.c +++ b/src/wayland/meta-wayland-surface.c @@ -1419,6 +1419,26 @@ surface_output_disconnect_signals (gpointer key, surface); } +static void +get_highest_output_scale (gpointer key, + gpointer value, + gpointer user_data) +{ + MetaWaylandOutput *wayland_output = value; + MetaLogicalMonitor *logical_monitor; + double *highest_scale = user_data; + double scale; + + logical_monitor = meta_wayland_output_get_logical_monitor (wayland_output); + if (!logical_monitor) + return; + + scale = meta_logical_monitor_get_scale (logical_monitor); + + if (scale > *highest_scale) + *highest_scale = scale; +} + double meta_wayland_surface_get_highest_output_scale (MetaWaylandSurface *surface) { @@ -1428,15 +1448,20 @@ meta_wayland_surface_get_highest_output_scale (MetaWaylandSurface *surface) window = meta_wayland_surface_get_window (surface); if (!window) - goto out; + goto fallback; logical_monitor = meta_window_get_highest_scale_monitor (window); if (!logical_monitor) - goto out; + goto fallback; scale = meta_logical_monitor_get_scale (logical_monitor); + return scale; + +fallback: + g_hash_table_foreach (surface->compositor->outputs, + get_highest_output_scale, + &scale); -out: return scale; }