Blob Blame History Raw
From 2fd3910c29d2af2a7c64b82f075cd3647d7e4bee Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Mon, 18 Mar 2019 17:08:11 +0100
Subject: [PATCH 1/2] monitor-config-manager: Use current mode when deriving
 current config

Instead of overriding the existing mode with the preferred mode of the monitor,
use the one already configured. Also use the MetaMonitor API for deriving the
position of the monitor in the screen coordinate space.
---
 src/backends/meta-monitor-config-manager.c | 77 +++++++++++++---------
 1 file changed, 47 insertions(+), 30 deletions(-)

diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c
index c09edbe00..a3387aa0f 100644
--- a/src/backends/meta-monitor-config-manager.c
+++ b/src/backends/meta-monitor-config-manager.c
@@ -592,20 +592,19 @@ create_monitor_config (MetaMonitor     *monitor,
 }
 
 static MetaLogicalMonitorConfig *
-create_preferred_logical_monitor_config (MetaMonitorManager          *monitor_manager,
-                                         MetaMonitor                 *monitor,
-                                         int                          x,
-                                         int                          y,
-                                         MetaLogicalMonitorConfig    *primary_logical_monitor_config,
-                                         MetaLogicalMonitorLayoutMode layout_mode)
+create_logical_monitor_config (MetaMonitorManager           *monitor_manager,
+                               MetaMonitor                  *monitor,
+                               MetaMonitorMode              *mode,
+                               int                           x,
+                               int                           y,
+                               MetaLogicalMonitorConfig     *primary_logical_monitor_config,
+                               MetaLogicalMonitorLayoutMode  layout_mode)
 {
-  MetaMonitorMode *mode;
   int width, height;
   float scale;
   MetaMonitorConfig *monitor_config;
   MetaLogicalMonitorConfig *logical_monitor_config;
 
-  mode = meta_monitor_get_preferred_mode (monitor);
   meta_monitor_mode_get_resolution (mode, &width, &height);
 
   if ((meta_monitor_manager_get_capabilities (monitor_manager) &
@@ -645,22 +644,40 @@ create_preferred_logical_monitor_config (MetaMonitorManager          *monitor_ma
 }
 
 static MetaLogicalMonitorConfig *
-create_logical_monitor_config_from_output (MetaMonitorManager           *monitor_manager,
-                                           MetaMonitor                  *monitor,
-                                           MetaLogicalMonitorConfig     *primary_logical_monitor_config,
-                                           MetaLogicalMonitorLayoutMode  layout_mode)
+create_preferred_logical_monitor_config (MetaMonitorManager           *monitor_manager,
+                                         MetaMonitor                  *monitor,
+                                         int                           x,
+                                         int                           y,
+                                         MetaLogicalMonitorConfig     *primary_logical_monitor_config,
+                                         MetaLogicalMonitorLayoutMode  layout_mode)
 {
-    MetaOutput *output;
-    MetaCrtc *crtc;
+  return create_logical_monitor_config (monitor_manager,
+                                        monitor,
+                                        meta_monitor_get_preferred_mode (monitor),
+                                        x, y,
+                                        primary_logical_monitor_config,
+                                        layout_mode);
+}
 
-    output = meta_monitor_get_main_output (monitor);
-    crtc = meta_output_get_assigned_crtc (output);
-    return create_preferred_logical_monitor_config (monitor_manager,
-                                                    monitor,
-                                                    crtc->rect.x,
-                                                    crtc->rect.y,
-                                                    primary_logical_monitor_config,
-                                                    layout_mode);
+static MetaLogicalMonitorConfig *
+create_logical_monitor_config_from_monitor (MetaMonitorManager           *monitor_manager,
+                                            MetaMonitor                  *monitor,
+                                            MetaLogicalMonitorConfig     *primary_logical_monitor_config,
+                                            MetaLogicalMonitorLayoutMode  layout_mode)
+{
+  MetaRectangle monitor_layout;
+  MetaMonitorMode *mode;
+
+  meta_monitor_derive_layout (monitor, &monitor_layout);
+  mode = meta_monitor_get_current_mode (monitor);
+
+  return create_logical_monitor_config (monitor_manager,
+                                        monitor,
+                                        mode,
+                                        monitor_layout.x,
+                                        monitor_layout.y,
+                                        primary_logical_monitor_config,
+                                        layout_mode);
 }
 
 MetaMonitorsConfig *
@@ -688,10 +705,10 @@ meta_monitor_config_manager_create_initial (MetaMonitorConfigManager *config_man
   layout_mode = meta_monitor_manager_get_default_layout_mode (monitor_manager);
 
   primary_logical_monitor_config =
-    create_logical_monitor_config_from_output (monitor_manager,
-                                               primary_monitor,
-                                               NULL,
-                                               layout_mode);
+    create_logical_monitor_config_from_monitor (monitor_manager,
+                                                primary_monitor,
+                                                NULL,
+                                                layout_mode);
 
   primary_logical_monitor_config->is_primary = TRUE;
   logical_monitor_configs = g_list_append (NULL,
@@ -710,10 +727,10 @@ meta_monitor_config_manager_create_initial (MetaMonitorConfigManager *config_man
         continue;
 
       logical_monitor_config =
-        create_logical_monitor_config_from_output (monitor_manager,
-                                                   monitor,
-                                                   primary_logical_monitor_config,
-                                                   layout_mode);
+        create_logical_monitor_config_from_monitor (monitor_manager,
+                                                    monitor,
+                                                    primary_logical_monitor_config,
+                                                    layout_mode);
 
       logical_monitor_configs = g_list_append (logical_monitor_configs,
                                                logical_monitor_config);
-- 
2.21.0


From d8c34e4cd7e500567e72e0f219295d7c2162dcf3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Mon, 18 Mar 2019 17:10:37 +0100
Subject: [PATCH 2/2] monitor-manager: Don't try to derive current config on
 non-X11

This commit also reworks the initial config state reading some. Appart from
avoiding trying to inherit from backends where it doesn't make sense, it does
the following changes:

 * Replace the name "initial" with "inherited", as the initial config in the
   context of monitor management is the one used initialization. E.g. if there is
   a applicable configuration in monitors.xml, the initial config is taken from
   there.

 * Don't make "_create_()" functions have side effects. Previously
   meta_monitor_config_manager_create_initial() also set state on the config
   manager object. Instead, add a meta_monitor_config_manager_ensure_inherited()
   and meta_monitor_manager_get_inherited_config() function to make things more
   explicit.

 * Don't recreate "is-applicable" logic, just use the existing helper.
---
 src/backends/meta-monitor-config-manager.c    | 39 +++++++++++--------
 src/backends/meta-monitor-config-manager.h    |  5 +++
 src/backends/meta-monitor-manager-private.h   |  4 +-
 src/backends/meta-monitor-manager.c           | 32 ++++++++-------
 .../x11/meta-monitor-manager-xrandr.c         |  3 +-
 5 files changed, 49 insertions(+), 34 deletions(-)

diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c
index a3387aa0f..bc1a39db8 100644
--- a/src/backends/meta-monitor-config-manager.c
+++ b/src/backends/meta-monitor-config-manager.c
@@ -42,7 +42,7 @@ struct _MetaMonitorConfigManager
   MetaMonitorConfigStore *config_store;
 
   MetaMonitorsConfig *current_config;
-  MetaMonitorsConfig *initial_config;
+  MetaMonitorsConfig *inherited_config;
   GQueue config_history;
 };
 
@@ -680,11 +680,10 @@ create_logical_monitor_config_from_monitor (MetaMonitorManager           *monito
                                         layout_mode);
 }
 
-MetaMonitorsConfig *
-meta_monitor_config_manager_create_initial (MetaMonitorConfigManager *config_manager)
+static MetaMonitorsConfig *
+meta_monitor_config_manager_derive_current (MetaMonitorConfigManager *config_manager)
 {
   MetaMonitorManager *monitor_manager = config_manager->monitor_manager;
-  MetaMonitorsConfig *initial_config;
   GList *logical_monitor_configs;
   MetaMonitor *primary_monitor;
   MetaLogicalMonitorLayoutMode layout_mode;
@@ -692,12 +691,6 @@ meta_monitor_config_manager_create_initial (MetaMonitorConfigManager *config_man
   GList *monitors;
   GList *l;
 
-  if (config_manager->initial_config != NULL)
-    return g_object_ref (config_manager->initial_config);
-
-  if (meta_monitor_config_store_get_config_count (config_manager->config_store) > 0)
-    return NULL;
-
   primary_monitor = find_primary_monitor (monitor_manager);
   if (!primary_monitor || !meta_monitor_is_active (primary_monitor))
     return NULL;
@@ -736,14 +729,26 @@ meta_monitor_config_manager_create_initial (MetaMonitorConfigManager *config_man
                                                logical_monitor_config);
     }
 
-  initial_config = meta_monitors_config_new (monitor_manager,
-                                             logical_monitor_configs,
-                                             layout_mode,
-                                             META_MONITORS_CONFIG_FLAG_NONE);
+  return meta_monitors_config_new (monitor_manager,
+                                   logical_monitor_configs,
+                                   layout_mode,
+                                   META_MONITORS_CONFIG_FLAG_NONE);
+}
+
+void
+meta_monitor_config_manager_ensure_inherited_config (MetaMonitorConfigManager *config_manager)
+{
+  if (config_manager->inherited_config)
+    return;
 
-  config_manager->initial_config = g_object_ref (initial_config);
+  config_manager->inherited_config =
+    meta_monitor_config_manager_derive_current (config_manager);
+}
 
-  return initial_config;
+MetaMonitorsConfig *
+meta_monitor_config_manager_get_inherited_config (MetaMonitorConfigManager *config_manager)
+{
+  return config_manager->inherited_config;
 }
 
 MetaMonitorsConfig *
@@ -1282,7 +1287,7 @@ meta_monitor_config_manager_dispose (GObject *object)
     META_MONITOR_CONFIG_MANAGER (object);
 
   g_clear_object (&config_manager->current_config);
-  g_clear_object (&config_manager->initial_config);
+  g_clear_object (&config_manager->inherited_config);
   meta_monitor_config_manager_clear_history (config_manager);
 
   G_OBJECT_CLASS (meta_monitor_config_manager_parent_class)->dispose (object);
diff --git a/src/backends/meta-monitor-config-manager.h b/src/backends/meta-monitor-config-manager.h
index 409611bb0..bb847b96e 100644
--- a/src/backends/meta-monitor-config-manager.h
+++ b/src/backends/meta-monitor-config-manager.h
@@ -96,6 +96,11 @@ MetaMonitorsConfig * meta_monitor_config_manager_get_stored (MetaMonitorConfigMa
 
 META_EXPORT_TEST
 MetaMonitorsConfig * meta_monitor_config_manager_create_initial (MetaMonitorConfigManager *config_manager);
+
+void meta_monitor_config_manager_ensure_inherited_config (MetaMonitorConfigManager *config_manager);
+
+MetaMonitorsConfig * meta_monitor_config_manager_get_inherited_config (MetaMonitorConfigManager *config_manager);
+
 META_EXPORT_TEST
 MetaMonitorsConfig * meta_monitor_config_manager_create_linear (MetaMonitorConfigManager *config_manager);
 
diff --git a/src/backends/meta-monitor-manager-private.h b/src/backends/meta-monitor-manager-private.h
index cdb8f4209..223b5dfbd 100644
--- a/src/backends/meta-monitor-manager-private.h
+++ b/src/backends/meta-monitor-manager-private.h
@@ -44,7 +44,8 @@ typedef enum _MetaMonitorManagerCapability
   META_MONITOR_MANAGER_CAPABILITY_NONE = 0,
   META_MONITOR_MANAGER_CAPABILITY_MIRRORING = (1 << 0),
   META_MONITOR_MANAGER_CAPABILITY_LAYOUT_MODE = (1 << 1),
-  META_MONITOR_MANAGER_CAPABILITY_GLOBAL_SCALE_REQUIRED = (1 << 2)
+  META_MONITOR_MANAGER_CAPABILITY_GLOBAL_SCALE_REQUIRED = (1 << 2),
+  META_MONITOR_MANAGER_CAPABILITY_CAN_DERIVE_CURRENT = (1 << 3),
 } MetaMonitorManagerCapability;
 
 /* Equivalent to the 'method' enum in org.gnome.Mutter.DisplayConfig */
@@ -133,6 +134,7 @@ struct _MetaMonitorManager
   int persistent_timeout_id;
 
   MetaMonitorConfigManager *config_manager;
+  MetaMonitorsConfig *initial_config;
 
   GnomePnpIds *pnp_ids;
 
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index bb4b44188..076dca8cb 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -531,14 +531,21 @@ should_use_stored_config (MetaMonitorManager *manager)
           !meta_monitor_manager_has_hotplug_mode_update (manager));
 }
 
+static gboolean
+can_derive_current_config (MetaMonitorManager *manager)
+{
+  MetaMonitorManagerCapability capabilities;
+
+  capabilities = meta_monitor_manager_get_capabilities (manager);
+  return !!(capabilities & META_MONITOR_MANAGER_CAPABILITY_CAN_DERIVE_CURRENT);
+}
+
 MetaMonitorsConfig *
 meta_monitor_manager_ensure_configured (MetaMonitorManager *manager)
 {
-  g_autoptr (MetaMonitorsConfig) initial_config = NULL;
   MetaMonitorsConfig *config = NULL;
   GError *error = NULL;
   gboolean use_stored_config;
-  MetaMonitorsConfigKey *current_state_key;
   MetaMonitorsConfigMethod method;
   MetaMonitorsConfigMethod fallback_method =
     META_MONITORS_CONFIG_METHOD_TEMPORARY;
@@ -549,17 +556,8 @@ meta_monitor_manager_ensure_configured (MetaMonitorManager *manager)
   else
     method = META_MONITORS_CONFIG_METHOD_TEMPORARY;
 
-  initial_config = meta_monitor_config_manager_create_initial (manager->config_manager);
-
-  if (initial_config)
-    {
-      current_state_key = meta_create_monitors_config_key_for_current_state (manager);
-
-      /* don't ever reuse initial configuration, if the monitor topology changed
-       */
-      if (current_state_key && !meta_monitors_config_key_equal (current_state_key, initial_config->key))
-        g_clear_object (&initial_config);
-    }
+  if (can_derive_current_config (manager))
+    meta_monitor_config_manager_ensure_inherited_config (manager->config_manager);
 
   if (use_stored_config)
     {
@@ -628,9 +626,13 @@ meta_monitor_manager_ensure_configured (MetaMonitorManager *manager)
       g_clear_object (&config);
     }
 
-  config = g_steal_pointer (&initial_config);
-  if (config)
+  config =
+    meta_monitor_config_manager_get_inherited_config (manager->config_manager);
+  if (config &&
+      meta_monitor_manager_is_config_complete (manager, config))
     {
+      config = g_object_ref (config);
+
       if (!meta_monitor_manager_apply_monitors_config (manager,
                                                        config,
                                                        method,
diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c
index d60f00325..b8d6342b6 100644
--- a/src/backends/x11/meta-monitor-manager-xrandr.c
+++ b/src/backends/x11/meta-monitor-manager-xrandr.c
@@ -999,7 +999,8 @@ static MetaMonitorManagerCapability
 meta_monitor_manager_xrandr_get_capabilities (MetaMonitorManager *manager)
 {
   return (META_MONITOR_MANAGER_CAPABILITY_MIRRORING |
-          META_MONITOR_MANAGER_CAPABILITY_GLOBAL_SCALE_REQUIRED);
+          META_MONITOR_MANAGER_CAPABILITY_GLOBAL_SCALE_REQUIRED |
+          META_MONITOR_MANAGER_CAPABILITY_CAN_DERIVE_CURRENT);
 }
 
 static gboolean
-- 
2.21.0