[mutter/benzea/ignore-monitor-connector: 1249/1253] monitor: Add flag whether EDID is sufficient to disambiguate monitors




commit ef7d9d43fbd9d56ea7a5b85c6adae9ffae633cd4
Author: Benjamin Berg <bberg redhat com>
Date:   Fri Dec 20 14:17:46 2019 +0100

    monitor: Add flag whether EDID is sufficient to disambiguate monitors
    
    If the EDID of the attached or stored monitor configurations contain
    proper serial numbers, then we do not need to rely on the connector to
    disambiguate them. Add a boolean to both MetaMonitorManager and
    MetaMonitorsConfigKey to store this information.
    
    https://gitlab.gnome.org/GNOME/mutter/issues/932

 src/backends/meta-monitor-config-manager.c  | 25 +++++++++++++++++++++++--
 src/backends/meta-monitor-config-manager.h  |  5 +++++
 src/backends/meta-monitor-manager-private.h |  1 +
 src/backends/meta-monitor-manager.c         | 10 ++++++++++
 src/tests/monitor-store-unit-tests.c        |  3 ++-
 5 files changed, 41 insertions(+), 3 deletions(-)
---
diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c
index b317aca0e0..3d469d8eaa 100644
--- a/src/backends/meta-monitor-config-manager.c
+++ b/src/backends/meta-monitor-config-manager.c
@@ -456,6 +456,25 @@ is_lid_closed (MetaMonitorManager *monitor_manager)
     return meta_backend_is_lid_closed (backend);
 }
 
+gboolean
+meta_config_key_edid_sufficient_for_specs (GList *monitor_specs)
+{
+  GList *l;
+
+  for (l = monitor_specs; l && l->next; l = l->next)
+    {
+      MetaMonitorSpec *spec = l->data;
+      MetaMonitorSpec *spec_next = l->next->data;
+
+      if (meta_monitor_spec_equals (spec, spec_next, TRUE))
+        return FALSE;
+
+      /* XXX: Should we reject e.g. only 0 serial numbers? */
+    }
+
+  return TRUE;
+}
+
 MetaMonitorsConfigKey *
 meta_create_monitors_config_key_for_current_state (MetaMonitorManager *monitor_manager)
 {
@@ -497,7 +516,8 @@ meta_create_monitors_config_key_for_current_state (MetaMonitorManager *monitor_m
 
   config_key = g_new0 (MetaMonitorsConfigKey, 1);
   *config_key = (MetaMonitorsConfigKey) {
-    .monitor_specs = monitor_specs
+    .monitor_specs = monitor_specs,
+    .edid_sufficient = meta_config_key_edid_sufficient_for_specs (monitor_specs)
   };
 
   return config_key;
@@ -1435,7 +1455,8 @@ meta_monitors_config_key_new (GList *logical_monitor_configs,
 
   config_key = g_new0 (MetaMonitorsConfigKey, 1);
   *config_key = (MetaMonitorsConfigKey) {
-    .monitor_specs = monitor_specs
+    .monitor_specs = monitor_specs,
+    .edid_sufficient = meta_config_key_edid_sufficient_for_specs (monitor_specs)
   };
 
   return config_key;
diff --git a/src/backends/meta-monitor-config-manager.h b/src/backends/meta-monitor-config-manager.h
index 86756a7e33..972e1ec9e1 100644
--- a/src/backends/meta-monitor-config-manager.h
+++ b/src/backends/meta-monitor-config-manager.h
@@ -48,7 +48,9 @@ typedef struct _MetaLogicalMonitorConfig
 
 typedef struct _MetaMonitorsConfigKey
 {
+  /* monitor_specs needs to be sorted using meta_monitor_spec_compare. */
   GList *monitor_specs;
+  gboolean edid_sufficient;
 } MetaMonitorsConfigKey;
 
 typedef enum _MetaMonitorsConfigFlag
@@ -159,6 +161,9 @@ META_EXPORT_TEST
 gboolean meta_monitors_config_key_equal (gconstpointer config_key_a,
                                          gconstpointer config_key_b);
 
+META_EXPORT_TEST
+gboolean meta_config_key_edid_sufficient_for_specs (GList *monitor_specs);
+
 META_EXPORT_TEST
 void meta_monitors_config_key_free (MetaMonitorsConfigKey *config_key);
 
diff --git a/src/backends/meta-monitor-manager-private.h b/src/backends/meta-monitor-manager-private.h
index b9c68aad47..a05d9e0247 100644
--- a/src/backends/meta-monitor-manager-private.h
+++ b/src/backends/meta-monitor-manager-private.h
@@ -121,6 +121,7 @@ struct _MetaMonitorManager
   int screen_height;
 
   GList *monitors;
+  gboolean edid_sufficient;
 
   GList *logical_monitors;
   MetaLogicalMonitor *primary_logical_monitor;
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index 4488ab32ac..035b07250c 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -2781,6 +2781,7 @@ rebuild_monitors (MetaMonitorManager *manager)
 {
   GList *gpus;
   GList *l;
+  GList *specs;
 
   if (manager->monitors)
     {
@@ -2820,6 +2821,15 @@ rebuild_monitors (MetaMonitorManager *manager)
             }
         }
     }
+
+  specs = NULL;
+  for (l = manager->monitors; l; l = l->next)
+    specs = g_list_prepend (specs, meta_monitor_get_spec (l->data));
+
+  specs = g_list_sort (specs,
+                       (GCompareFunc) meta_monitor_spec_compare);
+  manager->edid_sufficient = meta_config_key_edid_sufficient_for_specs (specs);
+  g_list_free (specs);
 }
 
 void
diff --git a/src/tests/monitor-store-unit-tests.c b/src/tests/monitor-store-unit-tests.c
index b9d5622b7a..4ad70cbd9e 100644
--- a/src/tests/monitor-store-unit-tests.c
+++ b/src/tests/monitor-store-unit-tests.c
@@ -108,7 +108,8 @@ create_config_key_from_expect (MonitorStoreTestConfiguration *expect_config)
 
   config_key = g_new0 (MetaMonitorsConfigKey, 1);
   *config_key = (MetaMonitorsConfigKey) {
-    .monitor_specs = monitor_specs
+    .monitor_specs = monitor_specs,
+    .edid_sufficient = meta_config_key_edid_sufficient_for_specs (monitor_specs)
   };
 
   return config_key;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]