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: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3567>
This commit is contained in:
Jonas Ådahl 2024-08-30 21:13:48 +02:00 committed by Marge Bot
parent b88482a56c
commit 5bf9cf59aa
3 changed files with 60 additions and 0 deletions

View File

@ -77,6 +77,8 @@ struct _MetaXWaylandManager
int rr_error_base;
gboolean should_enable_ei_portal;
double highest_monitor_scale;
};
struct _MetaWaylandCompositor

View File

@ -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;
}

View File

@ -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);