[mutter] monitor-manager: Only derive global scales supported by all monitors



commit 4ca5a97ea80a1ea5b9f8c8f32de70e503c2049bb
Author: Marco Trevisan (TreviƱo) <mail 3v1n0 net>
Date:   Thu Nov 29 23:51:55 2018 -0500

    monitor-manager: Only derive global scales supported by all monitors
    
    When deriving the global scale from current monitor, we were just checking the
    supported value by the primary monitor, without considering weather the current
    scale was supported by other monitors.
    
    Resolve this by checking if the picked global scale is valid for all active
    monitors, and if it's not the case, use a fallback strategy by just picking the
    maximum scale level supported by every head.
    
    Fixes https://gitlab.gnome.org/GNOME/mutter/issues/407
    
    Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/336>

 src/backends/meta-monitor-manager.c | 65 +++++++++++++++++++++++++++++--------
 1 file changed, 51 insertions(+), 14 deletions(-)
---
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index 1d42cad210..9ab846c676 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -119,9 +119,6 @@ static gboolean
 meta_monitor_manager_is_config_complete (MetaMonitorManager *manager,
                                          MetaMonitorsConfig *config);
 
-static MetaMonitor *
-meta_monitor_manager_get_active_monitor (MetaMonitorManager *manager);
-
 static void
 meta_monitor_manager_real_read_current_state (MetaMonitorManager *manager);
 
@@ -245,20 +242,66 @@ calculate_monitor_scale (MetaMonitorManager *manager,
                                                             monitor_mode);
 }
 
+static gboolean
+meta_monitor_manager_is_scale_supported_by_other_monitors (MetaMonitorManager *manager,
+                                                           MetaMonitor        *not_this_one,
+                                                           float               scale)
+{
+  GList *l;
+
+  for (l = manager->monitors; l; l = l->next)
+    {
+      MetaMonitor *monitor = l->data;
+      MetaMonitorMode *mode;
+
+      if (monitor == not_this_one || !meta_monitor_is_active (monitor))
+        continue;
+
+      mode = meta_monitor_get_current_mode (monitor);
+      if (!meta_monitor_manager_is_scale_supported (manager,
+                                                    manager->layout_mode,
+                                                    monitor, mode, scale))
+        return FALSE;
+    }
+
+  return TRUE;
+}
+
 static float
 derive_calculated_global_scale (MetaMonitorManager *manager)
 {
   MetaMonitor *monitor = NULL;
+  float scale;
+  GList *l;
 
+  scale = 1.0;
   monitor = meta_monitor_manager_get_primary_monitor (manager);
 
-  if (!monitor || !meta_monitor_is_active (monitor))
-    monitor = meta_monitor_manager_get_active_monitor (manager);
+  if (monitor && meta_monitor_is_active (monitor))
+    {
+      scale = calculate_monitor_scale (manager, monitor);
+      if (meta_monitor_manager_is_scale_supported_by_other_monitors (manager,
+                                                                     monitor,
+                                                                     scale))
+        return scale;
+    }
 
-  if (!monitor)
-    return 1.0;
+  for (l = manager->monitors; l; l = l->next)
+    {
+      MetaMonitor *other_monitor = l->data;
+      float monitor_scale;
 
-  return calculate_monitor_scale (manager, monitor);
+      if (other_monitor == monitor || !meta_monitor_is_active (other_monitor))
+        continue;
+
+      monitor_scale = calculate_monitor_scale (manager, other_monitor);
+      if (meta_monitor_manager_is_scale_supported_by_other_monitors (manager,
+                                                                     other_monitor,
+                                                                     monitor_scale))
+        scale = MAX (scale, monitor_scale);
+    }
+
+  return scale;
 }
 
 static float
@@ -2800,12 +2843,6 @@ meta_monitor_manager_get_laptop_panel (MetaMonitorManager *manager)
   return find_monitor (manager, meta_monitor_is_laptop_panel);
 }
 
-static MetaMonitor *
-meta_monitor_manager_get_active_monitor (MetaMonitorManager *manager)
-{
-  return find_monitor (manager, meta_monitor_is_active);
-}
-
 MetaMonitor *
 meta_monitor_manager_get_monitor_from_connector (MetaMonitorManager *manager,
                                                  const char         *connector)


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