monitor-manager: Check if all monitor scales are matching in global mode

When global scaling is set we need to ensure that all the requested scale
configurations are matching, otherwise we'd end up in a mixed setup that
we don't support in this scenario.

Fixes https://gitlab.gnome.org/GNOME/mutter/issues/407

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/336>
This commit is contained in:
Marco Trevisan (Treviño) 2018-11-29 23:04:17 -05:00
parent 1ac63fcd77
commit 7c87c1c24f

View File

@ -125,6 +125,10 @@ meta_monitor_manager_get_active_monitor (MetaMonitorManager *manager);
static void static void
meta_monitor_manager_real_read_current_state (MetaMonitorManager *manager); meta_monitor_manager_real_read_current_state (MetaMonitorManager *manager);
static gboolean
is_global_scale_matching_in_config (MetaMonitorsConfig *config,
float scale);
MetaBackend * MetaBackend *
meta_monitor_manager_get_backend (MetaMonitorManager *manager) meta_monitor_manager_get_backend (MetaMonitorManager *manager)
{ {
@ -1761,6 +1765,43 @@ meta_monitor_manager_is_scale_supported (MetaMonitorManager *manager,
return FALSE; return FALSE;
} }
static gboolean
is_global_scale_matching_in_config (MetaMonitorsConfig *config,
float scale)
{
GList *l;
for (l = config->logical_monitor_configs; l; l = l->next)
{
MetaLogicalMonitorConfig *logical_monitor_config = l->data;
if (!G_APPROX_VALUE (logical_monitor_config->scale, scale, FLT_EPSILON))
return FALSE;
}
return TRUE;
}
static gboolean
meta_monitor_manager_is_scale_supported_for_config (MetaMonitorManager *manager,
MetaMonitorsConfig *config,
MetaMonitor *monitor,
MetaMonitorMode *monitor_mode,
float scale)
{
if (meta_monitor_manager_is_scale_supported (manager, config->layout_mode,
monitor, monitor_mode, scale))
{
if (meta_monitor_manager_get_capabilities (manager) &
META_MONITOR_MANAGER_CAPABILITY_GLOBAL_SCALE_REQUIRED)
return is_global_scale_matching_in_config (config, scale);
return TRUE;
}
return FALSE;
}
static gboolean static gboolean
meta_monitor_manager_is_config_applicable (MetaMonitorManager *manager, meta_monitor_manager_is_config_applicable (MetaMonitorManager *manager,
MetaMonitorsConfig *config, MetaMonitorsConfig *config,
@ -1799,11 +1840,11 @@ meta_monitor_manager_is_config_applicable (MetaMonitorManager *manager,
return FALSE; return FALSE;
} }
if (!meta_monitor_manager_is_scale_supported (manager, if (!meta_monitor_manager_is_scale_supported_for_config (manager,
config->layout_mode, config,
monitor, monitor,
monitor_mode, monitor_mode,
scale)) scale))
{ {
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"Scale not supported by backend"); "Scale not supported by backend");