monitor-manager: only reuse initial-config if monitor topology matches startup

Right now we try to apply the current monitor config when a new
monitor is attached.  The current config obviously doesn't include the
new monitor, so the new monitor isn't lit up.

The only reason we apply the current config at all is to handle the
startup case:  We want to reuse the config set in Xorg when first
logging in.

This commit changes the code to look at the *initial config* instead
of the current config, and only if the new monitor topology matches
the start up topology.
This commit is contained in:
rpm-build 2018-09-11 10:19:44 -04:00 committed by Ray Strode
parent c15c8facfe
commit 0a50755fd6
3 changed files with 31 additions and 7 deletions

View File

@ -40,6 +40,7 @@ struct _MetaMonitorConfigManager
MetaMonitorConfigStore *config_store; MetaMonitorConfigStore *config_store;
MetaMonitorsConfig *current_config; MetaMonitorsConfig *current_config;
MetaMonitorsConfig *initial_config;
GQueue config_history; GQueue config_history;
}; };
@ -579,9 +580,10 @@ create_logical_monitor_config_from_output (MetaMonitorManager *monitor
} }
MetaMonitorsConfig * MetaMonitorsConfig *
meta_monitor_config_manager_create_current (MetaMonitorConfigManager *config_manager) meta_monitor_config_manager_create_initial (MetaMonitorConfigManager *config_manager)
{ {
MetaMonitorManager *monitor_manager = config_manager->monitor_manager; MetaMonitorManager *monitor_manager = config_manager->monitor_manager;
MetaMonitorsConfig *initial_config;
GList *logical_monitor_configs; GList *logical_monitor_configs;
MetaMonitor *primary_monitor; MetaMonitor *primary_monitor;
MetaLogicalMonitorLayoutMode layout_mode; MetaLogicalMonitorLayoutMode layout_mode;
@ -589,6 +591,9 @@ meta_monitor_config_manager_create_current (MetaMonitorConfigManager *config_man
GList *monitors; GList *monitors;
GList *l; 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) if (meta_monitor_config_store_get_config_count (config_manager->config_store) > 0)
return NULL; return NULL;
@ -630,10 +635,14 @@ meta_monitor_config_manager_create_current (MetaMonitorConfigManager *config_man
logical_monitor_config); logical_monitor_config);
} }
return meta_monitors_config_new (monitor_manager, initial_config = meta_monitors_config_new (monitor_manager,
logical_monitor_configs, logical_monitor_configs,
layout_mode, layout_mode,
META_MONITORS_CONFIG_FLAG_NONE); META_MONITORS_CONFIG_FLAG_NONE);
config_manager->initial_config = g_object_ref (initial_config);
return initial_config;
} }
MetaMonitorsConfig * MetaMonitorsConfig *
@ -1162,6 +1171,7 @@ meta_monitor_config_manager_dispose (GObject *object)
META_MONITOR_CONFIG_MANAGER (object); META_MONITOR_CONFIG_MANAGER (object);
g_clear_object (&config_manager->current_config); g_clear_object (&config_manager->current_config);
g_clear_object (&config_manager->initial_config);
meta_monitor_config_manager_clear_history (config_manager); meta_monitor_config_manager_clear_history (config_manager);
G_OBJECT_CLASS (meta_monitor_config_manager_parent_class)->dispose (object); G_OBJECT_CLASS (meta_monitor_config_manager_parent_class)->dispose (object);

View File

@ -87,7 +87,7 @@ gboolean meta_monitor_config_manager_assign (MetaMonitorManager *manager,
MetaMonitorsConfig * meta_monitor_config_manager_get_stored (MetaMonitorConfigManager *config_manager); MetaMonitorsConfig * meta_monitor_config_manager_get_stored (MetaMonitorConfigManager *config_manager);
MetaMonitorsConfig * meta_monitor_config_manager_create_current (MetaMonitorConfigManager *config_manager); MetaMonitorsConfig * meta_monitor_config_manager_create_initial (MetaMonitorConfigManager *config_manager);
MetaMonitorsConfig * meta_monitor_config_manager_create_linear (MetaMonitorConfigManager *config_manager); MetaMonitorsConfig * meta_monitor_config_manager_create_linear (MetaMonitorConfigManager *config_manager);
MetaMonitorsConfig * meta_monitor_config_manager_create_fallback (MetaMonitorConfigManager *config_manager); MetaMonitorsConfig * meta_monitor_config_manager_create_fallback (MetaMonitorConfigManager *config_manager);

View File

@ -496,9 +496,11 @@ should_use_stored_config (MetaMonitorManager *manager)
MetaMonitorsConfig * MetaMonitorsConfig *
meta_monitor_manager_ensure_configured (MetaMonitorManager *manager) meta_monitor_manager_ensure_configured (MetaMonitorManager *manager)
{ {
g_autoptr (MetaMonitorsConfig) initial_config = NULL;
MetaMonitorsConfig *config = NULL; MetaMonitorsConfig *config = NULL;
GError *error = NULL; GError *error = NULL;
gboolean use_stored_config; gboolean use_stored_config;
MetaMonitorsConfigKey *current_state_key;
MetaMonitorsConfigMethod method; MetaMonitorsConfigMethod method;
MetaMonitorsConfigMethod fallback_method = MetaMonitorsConfigMethod fallback_method =
META_MONITORS_CONFIG_METHOD_TEMPORARY; META_MONITORS_CONFIG_METHOD_TEMPORARY;
@ -509,6 +511,18 @@ meta_monitor_manager_ensure_configured (MetaMonitorManager *manager)
else else
method = META_MONITORS_CONFIG_METHOD_TEMPORARY; 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 (use_stored_config) if (use_stored_config)
{ {
config = meta_monitor_config_manager_get_stored (manager->config_manager); config = meta_monitor_config_manager_get_stored (manager->config_manager);
@ -576,7 +590,7 @@ meta_monitor_manager_ensure_configured (MetaMonitorManager *manager)
g_clear_object (&config); g_clear_object (&config);
} }
config = meta_monitor_config_manager_create_current (manager->config_manager); config = g_steal_pointer (&initial_config);
if (config) if (config)
{ {
if (!meta_monitor_manager_apply_monitors_config (manager, if (!meta_monitor_manager_apply_monitors_config (manager,