[mutter] monitor-config: ignore stored config when hotplug_mode_update is set



commit 7012c82fc7ac1ff5f2d6ef12d2e6e01b2bef9472
Author: Jonathon Jongsma <jjongsma redhat com>
Date:   Wed Nov 12 10:25:55 2014 -0600

    monitor-config: ignore stored config when hotplug_mode_update is set
    
    When the output device has hotplug_mode_update (e.g. the qxl driver used in
    vms), the displays can be dynamically resized, so the current display
    configuration does not often match a stored configuration. When a new
    monitor is added, make_default_config() tries to create a new display
    configuration by choosing a stored configuration with N-1 monitors, and then
    adding a new monitor to the end of the layout. Because the stored config
    doesn't match the current outputs, apply_configuration() will routinely
    fail, leaving the additional display unconfigured. In this case, it's more
    useful to just fall back to creating a new default configuration from
    scratch so that all outputs get configured to their preferred mode.

 src/backends/meta-monitor-config.c |   18 +++++++++++++++---
 1 files changed, 15 insertions(+), 3 deletions(-)
---
diff --git a/src/backends/meta-monitor-config.c b/src/backends/meta-monitor-config.c
index 90b2e6a..74239a3 100644
--- a/src/backends/meta-monitor-config.c
+++ b/src/backends/meta-monitor-config.c
@@ -1209,7 +1209,8 @@ make_default_config (MetaMonitorConfig *self,
                      MetaOutput        *outputs,
                      unsigned           n_outputs,
                      int                max_width,
-                     int                max_height)
+                     int                max_height,
+                     gboolean           use_stored_config)
 {
   MetaConfiguration *ret = NULL;
 
@@ -1227,7 +1228,8 @@ make_default_config (MetaMonitorConfig *self,
       return ret;
     }
 
-  if (extend_stored_config (self, outputs, n_outputs, max_width, max_height, ret))
+  if (use_stored_config &&
+      extend_stored_config (self, outputs, n_outputs, max_width, max_height, ret))
       return ret;
 
   make_linear_config (self, outputs, n_outputs, max_width, max_height, ret);
@@ -1287,6 +1289,7 @@ meta_monitor_config_make_default (MetaMonitorConfig  *self,
   unsigned n_outputs;
   gboolean ok = FALSE;
   int max_width, max_height;
+  gboolean use_stored_config;
 
   outputs = meta_monitor_manager_get_outputs (manager, &n_outputs);
   meta_monitor_manager_get_screen_limits (manager, &max_width, &max_height);
@@ -1297,7 +1300,16 @@ meta_monitor_config_make_default (MetaMonitorConfig  *self,
       return;
     }
 
-  default_config = make_default_config (self, outputs, n_outputs, max_width, max_height);
+  /* if the device has hotplug_mode_update, it's possible that the
+   * current display configuration does not match a stored configuration.
+   * Since extend_existing_config() tries to build a configuration that is
+   * based on a previously-stored configuration, it's quite likely that the
+   * resulting config will fail. Even if it doesn't fail, it may result in
+   * an unexpected configuration, so don't attempt to use a stored config
+   * in this situation. */
+  use_stored_config = !meta_monitor_manager_has_hotplug_mode_update (manager);
+  default_config = make_default_config (self, outputs, n_outputs, max_width, max_height, use_stored_config);
+
   if (default_config != NULL)
     {
       ok = apply_configuration_with_lid (self, default_config, manager);


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