From 5bf9cf59aaeedcbce7c06829d3d0986e4d8f9b1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Fri, 30 Aug 2024 21:13:48 +0200 Subject: [PATCH] xwayland: Introduce an 'effective scale' This scale is currently a lie, it doesn't do anything. What it represents is the current highest monitor scale, and will eventually be used to, when configured to do so, scale X11 coordinates as well as coordinates given to Xwayland. Part-of: --- src/wayland/meta-wayland-private.h | 2 ++ src/wayland/meta-xwayland.c | 56 ++++++++++++++++++++++++++++++ src/wayland/meta-xwayland.h | 2 ++ 3 files changed, 60 insertions(+) diff --git a/src/wayland/meta-wayland-private.h b/src/wayland/meta-wayland-private.h index d65ea5ef5..9cf193677 100644 --- a/src/wayland/meta-wayland-private.h +++ b/src/wayland/meta-wayland-private.h @@ -77,6 +77,8 @@ struct _MetaXWaylandManager int rr_error_base; gboolean should_enable_ei_portal; + + double highest_monitor_scale; }; struct _MetaWaylandCompositor diff --git a/src/wayland/meta-xwayland.c b/src/wayland/meta-xwayland.c index 406f8d218..eee4bf055 100644 --- a/src/wayland/meta-xwayland.c +++ b/src/wayland/meta-xwayland.c @@ -1050,6 +1050,29 @@ meta_xwayland_shutdown (MetaWaylandCompositor *compositor) } } +static void +update_highest_monitor_scale (MetaXWaylandManager *manager) +{ + MetaWaylandCompositor *compositor = manager->compositor; + MetaContext *context = meta_wayland_compositor_get_context (compositor); + MetaBackend *backend = meta_context_get_backend (context); + MetaMonitorManager *monitor_manager = + meta_backend_get_monitor_manager (backend); + GList *logical_monitors; + GList *l; + double scale = 1.0; + + logical_monitors = meta_monitor_manager_get_logical_monitors (monitor_manager); + for (l = logical_monitors; l; l = l->next) + { + MetaLogicalMonitor *logical_monitor = l->data; + + scale = MAX (scale, meta_logical_monitor_get_scale (logical_monitor)); + } + + manager->highest_monitor_scale = scale; +} + gboolean meta_xwayland_init (MetaXWaylandManager *manager, MetaWaylandCompositor *compositor, @@ -1057,6 +1080,9 @@ meta_xwayland_init (MetaXWaylandManager *manager, GError **error) { MetaContext *context = compositor->context; + MetaBackend *backend = meta_context_get_backend (context); + MetaMonitorManager *monitor_manager = + meta_backend_get_monitor_manager (backend); MetaX11DisplayPolicy policy; int display = 0; @@ -1120,6 +1146,10 @@ meta_xwayland_init (MetaXWaylandManager *manager, /* Xwayland specific protocol, needs to be filtered out for all other clients */ meta_xwayland_grab_keyboard_init (compositor); + g_signal_connect_swapped (monitor_manager, "monitors-changed-internal", + G_CALLBACK (update_highest_monitor_scale), manager); + update_highest_monitor_scale (manager); + return TRUE; } @@ -1300,3 +1330,29 @@ meta_xwayland_set_should_enable_ei_portal (MetaXWaylandManager *manager, { manager->should_enable_ei_portal = should_enable_ei_portal; } + +int +meta_xwayland_get_effective_scale (MetaXWaylandManager *manager) +{ + MetaWaylandCompositor *compositor = manager->compositor; + MetaContext *context = meta_wayland_compositor_get_context (compositor); + MetaBackend *backend = meta_context_get_backend (context); + MetaMonitorManager *monitor_manager = + meta_backend_get_monitor_manager (backend); + MetaSettings *settings = meta_backend_get_settings (backend); + + switch (meta_monitor_manager_get_layout_mode (monitor_manager)) + { + case META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL: + break; + + case META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL: + if (meta_settings_is_experimental_feature_enabled (settings, + META_EXPERIMENTAL_FEATURE_XWAYLAND_NATIVE_SCALING) && + meta_settings_is_experimental_feature_enabled (settings, + META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER)) + return (int) ceil (manager->highest_monitor_scale); + } + + return 1; +} diff --git a/src/wayland/meta-xwayland.h b/src/wayland/meta-xwayland.h index daf9d1abb..ae7a06977 100644 --- a/src/wayland/meta-xwayland.h +++ b/src/wayland/meta-xwayland.h @@ -48,3 +48,5 @@ META_EXPORT_TEST gboolean meta_xwayland_signal (MetaXWaylandManager *manager, int signum, GError **error); + +int meta_xwayland_get_effective_scale (MetaXWaylandManager *manager);