[mutter/gnome-3-26] monitor-manager: Compare keys when checking whether a config is complete
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/gnome-3-26] monitor-manager: Compare keys when checking whether a config is complete
- Date: Thu, 30 Nov 2017 04:02:37 +0000 (UTC)
commit 205dc28eae33fa8278bf1a32827023c600a79d20
Author: Jonas Ådahl <jadahl gmail com>
Date: Fri Nov 3 16:03:23 2017 +0800
monitor-manager: Compare keys when checking whether a config is complete
We only counted configured monitors and whether the config was
applicable (could be assigned), howeverwe didn't include disabled
monitors when comparing. This could caused incorrect configurations to
be applied when trying to use the previous configuration.
One scenario where this happened was one a system with one laptop
screen and one external monitor that was hot plugged some point after
start up. When the laptop lid was closed, the 'previous configuration'
being the configuration where only the laptop panel was enabled, passed
'is-complete' check as the number of configured monitors were correct,
and the configuration was applicable.
Avoid this issue by simply comparing the configuration key of the
previous configuration and the configuration key of the current state.
This correctly identifies a laptop panel with the lid closed as
inaccessible, thus doesn't incorrectly revert to the previous
configuration.
https://bugzilla.gnome.org/show_bug.cgi?id=788915
src/backends/meta-monitor-config-manager.c | 7 +++--
src/backends/meta-monitor-config-manager.h | 2 +
src/backends/meta-monitor-manager.c | 36 +++++++--------------------
3 files changed, 16 insertions(+), 29 deletions(-)
---
diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c
index 63cc152..b1aa165 100644
--- a/src/backends/meta-monitor-config-manager.c
+++ b/src/backends/meta-monitor-config-manager.c
@@ -326,8 +326,8 @@ meta_monitor_config_manager_assign (MetaMonitorManager *manager,
return TRUE;
}
-static MetaMonitorsConfigKey *
-create_key_for_current_state (MetaMonitorManager *monitor_manager)
+MetaMonitorsConfigKey *
+meta_create_monitors_config_key_for_current_state (MetaMonitorManager *monitor_manager)
{
MetaMonitorsConfigKey *config_key;
GList *l;
@@ -369,7 +369,8 @@ meta_monitor_config_manager_get_stored (MetaMonitorConfigManager *config_manager
MetaMonitorsConfig *config;
GError *error = NULL;
- config_key = create_key_for_current_state (monitor_manager);
+ config_key =
+ meta_create_monitors_config_key_for_current_state (monitor_manager);
if (!config_key)
return NULL;
diff --git a/src/backends/meta-monitor-config-manager.h b/src/backends/meta-monitor-config-manager.h
index b99cdab..269d8e1 100644
--- a/src/backends/meta-monitor-config-manager.h
+++ b/src/backends/meta-monitor-config-manager.h
@@ -135,6 +135,8 @@ void meta_logical_monitor_config_free (MetaLogicalMonitorConfig *logical_monitor
void meta_monitor_config_free (MetaMonitorConfig *monitor_config);
+MetaMonitorsConfigKey * meta_create_monitors_config_key_for_current_state (MetaMonitorManager
*monitor_manager);
+
gboolean meta_logical_monitor_configs_have_monitor (GList *logical_monitor_configs,
MetaMonitorSpec *monitor_spec);
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index 33ef0ef..e5a5e00 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -1539,35 +1539,19 @@ static gboolean
meta_monitor_manager_is_config_complete (MetaMonitorManager *manager,
MetaMonitorsConfig *config)
{
- GList *l;
- unsigned int configured_monitor_count = 0;
- unsigned int expected_monitor_count = 0;
-
- for (l = config->logical_monitor_configs; l; l = l->next)
- {
- MetaLogicalMonitorConfig *logical_monitor_config = l->data;
- GList *k;
+ MetaMonitorsConfigKey *current_state_key;
+ gboolean is_config_complete;
- for (k = logical_monitor_config->monitor_configs; k; k = k->next)
- configured_monitor_count++;
- }
-
- for (l = manager->monitors; l; l = l->next)
- {
- MetaMonitor *monitor = l->data;
+ current_state_key =
+ meta_create_monitors_config_key_for_current_state (manager);
+ if (!current_state_key)
+ return FALSE;
- if (meta_monitor_is_laptop_panel (monitor))
- {
- if (!meta_monitor_manager_is_lid_closed (manager))
- expected_monitor_count++;
- }
- else
- {
- expected_monitor_count++;
- }
- }
+ is_config_complete = meta_monitors_config_key_equal (current_state_key,
+ config->key);
+ meta_monitors_config_key_free (current_state_key);
- if (configured_monitor_count != expected_monitor_count)
+ if (!is_config_complete)
return FALSE;
return meta_monitor_manager_is_config_applicable (manager, config, NULL);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]