From 1dc6998bf9cb2f5343bf411505c595f9a5f0a79c Mon Sep 17 00:00:00 2001 From: Benjamin Berg Date: Fri, 20 Dec 2019 14:24:46 +0100 Subject: [PATCH] monitor: Only take connector into account when required Add a flag to meta_monitor_spec_equals to disable full connector matching when this is possible. In this mode, the connector is simply skipped from the compare, assuming that all monitors can be disambiguated using just EDID information. Update all calls to the relevant functions to pass whether a full match is needed or not. https://gitlab.gnome.org/GNOME/mutter/issues/932 --- src/backends/meta-monitor-config-manager.c | 18 ++++++++++++------ src/backends/meta-monitor-config-manager.h | 3 ++- src/backends/meta-monitor-manager.c | 3 ++- src/backends/meta-monitor.c | 9 +++++---- src/backends/meta-monitor.h | 3 ++- 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c index a2e83d890..8a8abf5a1 100644 --- a/src/backends/meta-monitor-config-manager.c +++ b/src/backends/meta-monitor-config-manager.c @@ -943,7 +943,8 @@ find_logical_config_for_builtin_display_rotation (MetaMonitorConfigManager *conf monitor_config = logical_monitor_config->monitor_configs->data; if (meta_monitor_spec_equals (meta_monitor_get_spec (panel), - monitor_config->monitor_spec)) + monitor_config->monitor_spec, + config_manager->monitor_manager->edid_sufficient)) return logical_monitor_config; } } @@ -1432,7 +1433,8 @@ meta_monitors_config_key_equal (gconstpointer data_a, MetaMonitorSpec *monitor_spec_a = l_a->data; MetaMonitorSpec *monitor_spec_b = l_b->data; - if (!meta_monitor_spec_equals (monitor_spec_a, monitor_spec_b)) + if (!meta_monitor_spec_equals (monitor_spec_a, monitor_spec_b, + config_key_a->edid_sufficient)) return FALSE; } @@ -1497,7 +1499,8 @@ meta_monitors_config_new (MetaMonitorManager *monitor_manager, monitor_spec = meta_monitor_get_spec (monitor); if (meta_logical_monitor_configs_have_monitor (logical_monitor_configs, - monitor_spec)) + monitor_spec, + monitor_manager->edid_sufficient)) continue; disabled_monitor_specs = @@ -1700,7 +1703,8 @@ has_adjacent_neighbour (MetaMonitorsConfig *config, gboolean meta_logical_monitor_configs_have_monitor (GList *logical_monitor_configs, - MetaMonitorSpec *monitor_spec) + MetaMonitorSpec *monitor_spec, + gboolean edid_sufficient) { GList *l; @@ -1714,7 +1718,8 @@ meta_logical_monitor_configs_have_monitor (GList *logical_monitor_conf MetaMonitorConfig *monitor_config = k->data; if (meta_monitor_spec_equals (monitor_spec, - monitor_config->monitor_spec)) + monitor_config->monitor_spec, + edid_sufficient)) return TRUE; } } @@ -1727,7 +1732,8 @@ meta_monitors_config_is_monitor_enabled (MetaMonitorsConfig *config, MetaMonitorSpec *monitor_spec) { return meta_logical_monitor_configs_have_monitor (config->logical_monitor_configs, - monitor_spec); + monitor_spec, + config->key->edid_sufficient); } gboolean diff --git a/src/backends/meta-monitor-config-manager.h b/src/backends/meta-monitor-config-manager.h index 207cec473..ee743e5c1 100644 --- a/src/backends/meta-monitor-config-manager.h +++ b/src/backends/meta-monitor-config-manager.h @@ -178,7 +178,8 @@ MetaMonitorsConfigKey * meta_create_monitors_config_key_for_current_state (MetaM META_EXPORT_TEST gboolean meta_logical_monitor_configs_have_monitor (GList *logical_monitor_configs, - MetaMonitorSpec *monitor_spec); + MetaMonitorSpec *monitor_spec, + gboolean edid_sufficient); META_EXPORT_TEST gboolean meta_verify_monitor_mode_spec (MetaMonitorModeSpec *monitor_mode_spec, diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c index b0e1c449c..19cdee592 100644 --- a/src/backends/meta-monitor-manager.c +++ b/src/backends/meta-monitor-manager.c @@ -2475,7 +2475,8 @@ meta_monitor_manager_get_monitor_from_spec (MetaMonitorManager *manager, MetaMonitor *monitor = l->data; if (meta_monitor_spec_equals (meta_monitor_get_spec (monitor), - monitor_spec)) + monitor_spec, + manager->edid_sufficient)) return monitor; } diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c index 5d163e1a8..ae405aa29 100644 --- a/src/backends/meta-monitor.c +++ b/src/backends/meta-monitor.c @@ -126,12 +126,13 @@ meta_monitor_spec_clone (MetaMonitorSpec *monitor_spec) gboolean meta_monitor_spec_equals (MetaMonitorSpec *monitor_spec, - MetaMonitorSpec *other_monitor_spec) + MetaMonitorSpec *other_monitor_spec, + gboolean edid_only) { - return (g_str_equal (monitor_spec->connector, other_monitor_spec->connector) && - g_str_equal (monitor_spec->vendor, other_monitor_spec->vendor) && + return (g_str_equal (monitor_spec->vendor, other_monitor_spec->vendor) && g_str_equal (monitor_spec->product, other_monitor_spec->product) && - g_str_equal (monitor_spec->serial, other_monitor_spec->serial)); + g_str_equal (monitor_spec->serial, other_monitor_spec->serial) && + (edid_only || g_str_equal (monitor_spec->connector, other_monitor_spec->connector))); } int diff --git a/src/backends/meta-monitor.h b/src/backends/meta-monitor.h index 58d2950c9..60472dd97 100644 --- a/src/backends/meta-monitor.h +++ b/src/backends/meta-monitor.h @@ -272,7 +272,8 @@ MetaMonitorSpec * meta_monitor_spec_clone (MetaMonitorSpec *monitor_id); META_EXPORT_TEST gboolean meta_monitor_spec_equals (MetaMonitorSpec *monitor_id, - MetaMonitorSpec *other_monitor_id); + MetaMonitorSpec *other_monitor_id, + gboolean edid_only); META_EXPORT_TEST int meta_monitor_spec_compare (MetaMonitorSpec *monitor_spec_a,