Blame SOURCES/remember-saved-multi-monitor-configuration.patch

e3f29c
From 702f204a281c6525da6bfcd2286d70b1ab6eab13 Mon Sep 17 00:00:00 2001
e3f29c
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
e3f29c
Date: Fri, 3 Nov 2017 15:58:02 +0800
e3f29c
Subject: [PATCH 1/4] monitor-config-manager: Don't include closed laptop panel
e3f29c
 in config key
e3f29c
e3f29c
When deriving the list of disabled monitors when creating new monitors
e3f29c
configs, don't include the laptop panel if the lid is currently closed,
e3f29c
as we consider the laptop panel nonexistent when the laptop lid is
e3f29c
closed when it comes to configuration.
e3f29c
e3f29c
The laptop panel connector(s) will either way be appropriately disabled
e3f29c
anyway, as the field listing disabled monitors in the configuration do
e3f29c
not affect actual CRTC/connector assignments.
e3f29c
e3f29c
https://bugzilla.gnome.org/show_bug.cgi?id=788915
e3f29c
---
e3f29c
 src/backends/meta-monitor-config-manager.c | 4 ++++
e3f29c
 1 file changed, 4 insertions(+)
e3f29c
e3f29c
diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c
e3f29c
index 2fe620767..2a7287778 100644
e3f29c
--- a/src/backends/meta-monitor-config-manager.c
e3f29c
+++ b/src/backends/meta-monitor-config-manager.c
e3f29c
@@ -1308,6 +1308,10 @@ meta_monitors_config_new (MetaMonitorManager           *monitor_manager,
e3f29c
       MetaMonitor *monitor = l->data;
e3f29c
       MetaMonitorSpec *monitor_spec;
e3f29c
 
e3f29c
+      if (meta_monitor_manager_is_lid_closed (monitor_manager) &&
e3f29c
+          meta_monitor_is_laptop_panel (monitor))
e3f29c
+        continue;
e3f29c
+
e3f29c
       monitor_spec = meta_monitor_get_spec (monitor);
e3f29c
       if (meta_logical_monitor_configs_have_monitor (logical_monitor_configs,
e3f29c
                                                      monitor_spec))
e3f29c
-- 
e3f29c
2.14.2
e3f29c
e3f29c
From 584e2b93d9f28557cfe8a6ff720b4c3e45c458ab Mon Sep 17 00:00:00 2001
e3f29c
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
e3f29c
Date: Fri, 3 Nov 2017 16:03:23 +0800
e3f29c
Subject: [PATCH 2/4] monitor-manager: Compare keys when checking whether a
e3f29c
 config is complete
e3f29c
e3f29c
We only counted configured monitors and whether the config was
e3f29c
applicable (could be assigned), howeverwe didn't include disabled
e3f29c
monitors when comparing. This could caused incorrect configurations to
e3f29c
be applied when trying to use the previous configuration.
e3f29c
e3f29c
One scenario where this happened was one a system with one laptop
e3f29c
screen and one external monitor that was hot plugged some point after
e3f29c
start up. When the laptop lid was closed, the 'previous configuration'
e3f29c
being the configuration where only the laptop panel was enabled, passed
e3f29c
'is-complete' check as the number of configured monitors were correct,
e3f29c
and the configuration was applicable.
e3f29c
e3f29c
Avoid this issue by simply comparing the configuration key of the
e3f29c
previous configuration and the configuration key of the current state.
e3f29c
This correctly identifies a laptop panel with the lid closed as
e3f29c
inaccessible, thus doesn't incorrectly revert to the previous
e3f29c
configuration.
e3f29c
e3f29c
https://bugzilla.gnome.org/show_bug.cgi?id=788915
e3f29c
---
e3f29c
 src/backends/meta-monitor-config-manager.c |  7 +++---
e3f29c
 src/backends/meta-monitor-config-manager.h |  2 ++
e3f29c
 src/backends/meta-monitor-manager.c        | 36 +++++++++---------------------
e3f29c
 3 files changed, 16 insertions(+), 29 deletions(-)
e3f29c
e3f29c
diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c
e3f29c
index 2a7287778..bdf863055 100644
e3f29c
--- a/src/backends/meta-monitor-config-manager.c
e3f29c
+++ b/src/backends/meta-monitor-config-manager.c
e3f29c
@@ -326,8 +326,8 @@ meta_monitor_config_manager_assign (MetaMonitorManager *manager,
e3f29c
   return TRUE;
e3f29c
 }
e3f29c
 
e3f29c
-static MetaMonitorsConfigKey *
e3f29c
-create_key_for_current_state (MetaMonitorManager *monitor_manager)
e3f29c
+MetaMonitorsConfigKey *
e3f29c
+meta_create_monitors_config_key_for_current_state (MetaMonitorManager *monitor_manager)
e3f29c
 {
e3f29c
   MetaMonitorsConfigKey *config_key;
e3f29c
   GList *l;
e3f29c
@@ -369,7 +369,8 @@ meta_monitor_config_manager_get_stored (MetaMonitorConfigManager *config_manager
e3f29c
   MetaMonitorsConfig *config;
e3f29c
   GError *error = NULL;
e3f29c
 
e3f29c
-  config_key = create_key_for_current_state (monitor_manager);
e3f29c
+  config_key =
e3f29c
+    meta_create_monitors_config_key_for_current_state (monitor_manager);
e3f29c
   if (!config_key)
e3f29c
     return NULL;
e3f29c
 
e3f29c
diff --git a/src/backends/meta-monitor-config-manager.h b/src/backends/meta-monitor-config-manager.h
e3f29c
index 516909dd7..c36df38e6 100644
e3f29c
--- a/src/backends/meta-monitor-config-manager.h
e3f29c
+++ b/src/backends/meta-monitor-config-manager.h
e3f29c
@@ -136,6 +136,8 @@ void meta_logical_monitor_config_free (MetaLogicalMonitorConfig *logical_monitor
e3f29c
 
e3f29c
 void meta_monitor_config_free (MetaMonitorConfig *monitor_config);
e3f29c
 
e3f29c
+MetaMonitorsConfigKey * meta_create_monitors_config_key_for_current_state (MetaMonitorManager *monitor_manager);
e3f29c
+
e3f29c
 gboolean meta_logical_monitor_configs_have_monitor (GList           *logical_monitor_configs,
e3f29c
                                                     MetaMonitorSpec *monitor_spec);
e3f29c
 
e3f29c
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
e3f29c
index 8b548fd68..eb3612cf0 100644
e3f29c
--- a/src/backends/meta-monitor-manager.c
e3f29c
+++ b/src/backends/meta-monitor-manager.c
e3f29c
@@ -1551,35 +1551,19 @@ static gboolean
e3f29c
 meta_monitor_manager_is_config_complete (MetaMonitorManager *manager,
e3f29c
                                          MetaMonitorsConfig *config)
e3f29c
 {
e3f29c
-  GList *l;
e3f29c
-  unsigned int configured_monitor_count = 0;
e3f29c
-  unsigned int expected_monitor_count = 0;
e3f29c
-
e3f29c
-  for (l = config->logical_monitor_configs; l; l = l->next)
e3f29c
-    {
e3f29c
-      MetaLogicalMonitorConfig *logical_monitor_config = l->data;
e3f29c
-      GList *k;
e3f29c
+  MetaMonitorsConfigKey *current_state_key;
e3f29c
+  gboolean is_config_complete;
e3f29c
 
e3f29c
-      for (k = logical_monitor_config->monitor_configs; k; k = k->next)
e3f29c
-        configured_monitor_count++;
e3f29c
-    }
e3f29c
-
e3f29c
-  for (l = manager->monitors; l; l = l->next)
e3f29c
-    {
e3f29c
-      MetaMonitor *monitor = l->data;
e3f29c
+  current_state_key =
e3f29c
+    meta_create_monitors_config_key_for_current_state (manager);
e3f29c
+  if (!current_state_key)
e3f29c
+    return FALSE;
e3f29c
 
e3f29c
-      if (meta_monitor_is_laptop_panel (monitor))
e3f29c
-        {
e3f29c
-          if (!meta_monitor_manager_is_lid_closed (manager))
e3f29c
-            expected_monitor_count++;
e3f29c
-        }
e3f29c
-      else
e3f29c
-        {
e3f29c
-          expected_monitor_count++;
e3f29c
-        }
e3f29c
-    }
e3f29c
+  is_config_complete = meta_monitors_config_key_equal (current_state_key,
e3f29c
+                                                       config->key);
e3f29c
+  meta_monitors_config_key_free (current_state_key);
e3f29c
 
e3f29c
-  if (configured_monitor_count != expected_monitor_count)
e3f29c
+  if (!is_config_complete)
e3f29c
     return FALSE;
e3f29c
 
e3f29c
   return meta_monitor_manager_is_config_applicable (manager, config, NULL);
e3f29c
-- 
e3f29c
2.14.2
e3f29c