[mutter] monitor-manager: Only derive global scales supported by all monitors
- From: Marge Bot <marge-bot src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] monitor-manager: Only derive global scales supported by all monitors
- Date: Thu, 22 Jul 2021 14:14:13 +0000 (UTC)
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]