[gnome-flashback] monitor-config-manager: use scale from past configs when generating



commit 1ffefee4bd68751f92bec66357986c152622377f
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Fri Aug 19 21:01:04 2022 +0300

    monitor-config-manager: use scale from past configs when generating
    
    Based on mutter commit:
    https://gitlab.gnome.org/GNOME/mutter/-/commit/3dca01a06c1b082823a8938f6397979e44cdd644

 backends/gf-monitor-config-manager.c | 95 ++++++++++++++++++++++++++++++++++--
 1 file changed, 90 insertions(+), 5 deletions(-)
---
diff --git a/backends/gf-monitor-config-manager.c b/backends/gf-monitor-config-manager.c
index fb7fbdc..4dcc172 100644
--- a/backends/gf-monitor-config-manager.c
+++ b/backends/gf-monitor-config-manager.c
@@ -340,17 +340,96 @@ create_preferred_logical_monitor_config (GfMonitorManager           *monitor_man
   return logical_monitor_config;
 }
 
+static GfLogicalMonitorConfig *
+find_monitor_config (GfMonitorsConfig *config,
+                     GfMonitor        *monitor,
+                     GfMonitorMode    *monitor_mode)
+{
+  int mode_width;
+  int mode_height;
+  GList *l;
+
+  gf_monitor_mode_get_resolution (monitor_mode, &mode_width, &mode_height);
+
+  for (l = config->logical_monitor_configs; l; l = l->next)
+    {
+      GfLogicalMonitorConfig *logical_monitor_config;
+      GList *l_monitor;
+
+      logical_monitor_config = l->data;
+
+      for (l_monitor = logical_monitor_config->monitor_configs; l_monitor; l_monitor = l_monitor->next)
+        {
+          GfMonitorConfig *monitor_config;
+          GfMonitorModeSpec *mode_spec;
+
+          monitor_config = l_monitor->data;
+          mode_spec = gf_monitor_mode_get_spec (monitor_mode);
+
+          if (gf_monitor_spec_equals (gf_monitor_get_spec (monitor), monitor_config->monitor_spec) &&
+              gf_monitor_mode_spec_has_similar_size (mode_spec, monitor_config->mode_spec))
+            return logical_monitor_config;
+        }
+    }
+
+  return NULL;
+}
+
+static gboolean
+get_last_scale_for_monitor (GfMonitorConfigManager *config_manager,
+                            GfMonitor              *monitor,
+                            GfMonitorMode          *monitor_mode,
+                            float                  *out_scale)
+{
+  GList *configs;
+  GList *l;
+
+  configs = NULL;
+
+  if (config_manager->current_config != NULL)
+    configs = g_list_append (configs, config_manager->current_config);
+
+  configs = g_list_concat (configs, g_list_copy (config_manager->config_history.head));
+
+  for (l = configs; l; l = l->next)
+    {
+      GfMonitorsConfig *config;
+      GfLogicalMonitorConfig *logical_monitor_config;
+
+      config = l->data;
+      logical_monitor_config = find_monitor_config (config,
+                                                    monitor,
+                                                    monitor_mode);
+
+      if (logical_monitor_config != NULL)
+        {
+          *out_scale = logical_monitor_config->scale;
+          g_list_free (configs);
+
+          return TRUE;
+        }
+    }
+
+  g_list_free (configs);
+
+  return FALSE;
+}
+
+
 static float
-compute_scale_for_monitor (GfMonitorManager *monitor_manager,
-                           GfMonitor        *monitor,
-                           GfMonitor        *primary_monitor)
+compute_scale_for_monitor (GfMonitorConfigManager *config_manager,
+                           GfMonitor              *monitor,
+                           GfMonitor              *primary_monitor)
 
 {
+  GfMonitorManager *monitor_manager;
   GfMonitor *target_monitor;
   GfMonitorManagerCapability capabilities;
   GfLogicalMonitorLayoutMode layout_mode;
   GfMonitorMode *monitor_mode;
+  float scale;
 
+  monitor_manager = config_manager->monitor_manager;
   target_monitor = monitor;
   capabilities = gf_monitor_manager_get_capabilities (monitor_manager);
 
@@ -363,6 +442,12 @@ compute_scale_for_monitor (GfMonitorManager *monitor_manager,
   layout_mode = gf_monitor_manager_get_default_layout_mode (monitor_manager);
   monitor_mode = gf_monitor_get_preferred_mode (target_monitor);
 
+  if (get_last_scale_for_monitor (config_manager,
+                                  target_monitor,
+                                  monitor_mode,
+                                  &scale))
+    return scale;
+
   return gf_monitor_manager_calculate_monitor_mode_scale (monitor_manager,
                                                           layout_mode,
                                                           target_monitor,
@@ -466,7 +551,7 @@ create_for_switch_config_all_mirror (GfMonitorConfigManager *config_manager)
       if (!mode)
         continue;
 
-      scale = compute_scale_for_monitor (monitor_manager,
+      scale = compute_scale_for_monitor (config_manager,
                                          l_monitor,
                                          primary_monitor);
 
@@ -609,7 +694,7 @@ create_monitors_config (GfMonitorConfigManager *config_manager,
             break;
         }
 
-      scale = compute_scale_for_monitor (monitor_manager,
+      scale = compute_scale_for_monitor (config_manager,
                                          monitor,
                                          primary_monitor);
 


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