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:
parent
b88482a56c
commit
5bf9cf59aa
@ -77,6 +77,8 @@ struct _MetaXWaylandManager
|
||||
int rr_error_base;
|
||||
|
||||
gboolean should_enable_ei_portal;
|
||||
|
||||
double highest_monitor_scale;
|
||||
};
|
||||
|
||||
struct _MetaWaylandCompositor
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user