monitor-config-manager: Keep short history of configurations

In order to go back in monitor configurations, save them to a history.
The history is implemented as a max 3 element long queue, where newly
set configurations are pushed to the head, and old are popped from the
tail.

The difference between using a single previous config reference and a
queue is that we can now remember the configuration used prior to a
D-Bus triggered configuration when the user discarded the configuration.

This will later be used to restore a previous configuration when a
laptop lid is opened.

https://bugzilla.gnome.org/show_bug.cgi?id=777732
This commit is contained in:
Jonas Ådahl 2017-08-11 15:16:15 +08:00
parent 6c0f107db0
commit b140e7fbeb
3 changed files with 33 additions and 7 deletions

View File

@ -28,6 +28,8 @@
#include "backends/meta-monitor-manager-private.h" #include "backends/meta-monitor-manager-private.h"
#include "core/boxes-private.h" #include "core/boxes-private.h"
#define CONFIG_HISTORY_MAX_SIZE 3
struct _MetaMonitorConfigManager struct _MetaMonitorConfigManager
{ {
GObject parent; GObject parent;
@ -37,7 +39,7 @@ struct _MetaMonitorConfigManager
MetaMonitorConfigStore *config_store; MetaMonitorConfigStore *config_store;
MetaMonitorsConfig *current_config; MetaMonitorsConfig *current_config;
MetaMonitorsConfig *previous_config; GQueue config_history;
}; };
G_DEFINE_TYPE (MetaMonitorConfigManager, meta_monitor_config_manager, G_DEFINE_TYPE (MetaMonitorConfigManager, meta_monitor_config_manager,
@ -988,8 +990,15 @@ void
meta_monitor_config_manager_set_current (MetaMonitorConfigManager *config_manager, meta_monitor_config_manager_set_current (MetaMonitorConfigManager *config_manager,
MetaMonitorsConfig *config) MetaMonitorsConfig *config)
{ {
g_set_object (&config_manager->previous_config, if (config_manager->current_config)
config_manager->current_config); {
g_queue_push_head (&config_manager->config_history,
g_object_ref (config_manager->current_config));
if (g_queue_get_length (&config_manager->config_history) >
CONFIG_HISTORY_MAX_SIZE)
g_object_unref (g_queue_pop_tail (&config_manager->config_history));
}
g_set_object (&config_manager->current_config, config); g_set_object (&config_manager->current_config, config);
} }
@ -1008,10 +1017,23 @@ meta_monitor_config_manager_get_current (MetaMonitorConfigManager *config_manage
return config_manager->current_config; return config_manager->current_config;
} }
MetaMonitorsConfig *
meta_monitor_config_manager_pop_previous (MetaMonitorConfigManager *config_manager)
{
return g_queue_pop_head (&config_manager->config_history);
}
MetaMonitorsConfig * MetaMonitorsConfig *
meta_monitor_config_manager_get_previous (MetaMonitorConfigManager *config_manager) meta_monitor_config_manager_get_previous (MetaMonitorConfigManager *config_manager)
{ {
return config_manager->previous_config; return g_queue_peek_head (&config_manager->config_history);
}
void
meta_monitor_config_manager_clear_history (MetaMonitorConfigManager *config_manager)
{
g_queue_foreach (&config_manager->config_history, (GFunc) g_object_unref, NULL);
g_queue_clear (&config_manager->config_history);
} }
static void static void
@ -1021,7 +1043,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->previous_config); 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);
} }
@ -1029,6 +1051,7 @@ meta_monitor_config_manager_dispose (GObject *object)
static void static void
meta_monitor_config_manager_init (MetaMonitorConfigManager *config_manager) meta_monitor_config_manager_init (MetaMonitorConfigManager *config_manager)
{ {
g_queue_init (&config_manager->config_history);
} }
static void static void

View File

@ -104,8 +104,12 @@ void meta_monitor_config_manager_set_current (MetaMonitorConfigManager *config_m
MetaMonitorsConfig * meta_monitor_config_manager_get_current (MetaMonitorConfigManager *config_manager); MetaMonitorsConfig * meta_monitor_config_manager_get_current (MetaMonitorConfigManager *config_manager);
MetaMonitorsConfig * meta_monitor_config_manager_pop_previous (MetaMonitorConfigManager *config_manager);
MetaMonitorsConfig * meta_monitor_config_manager_get_previous (MetaMonitorConfigManager *config_manager); MetaMonitorsConfig * meta_monitor_config_manager_get_previous (MetaMonitorConfigManager *config_manager);
void meta_monitor_config_manager_clear_history (MetaMonitorConfigManager *config_manager);
void meta_monitor_config_manager_save_current (MetaMonitorConfigManager *config_manager); void meta_monitor_config_manager_save_current (MetaMonitorConfigManager *config_manager);
MetaMonitorsConfig * meta_monitors_config_new (GList *logical_monitor_configs, MetaMonitorsConfig * meta_monitors_config_new (GList *logical_monitor_configs,

View File

@ -1111,14 +1111,13 @@ restore_previous_config (MetaMonitorManager *manager)
GError *error = NULL; GError *error = NULL;
previous_config = previous_config =
meta_monitor_config_manager_get_previous (manager->config_manager); meta_monitor_config_manager_pop_previous (manager->config_manager);
if (previous_config) if (previous_config)
{ {
MetaMonitorsConfigMethod method; MetaMonitorsConfigMethod method;
method = META_MONITORS_CONFIG_METHOD_TEMPORARY; method = META_MONITORS_CONFIG_METHOD_TEMPORARY;
g_object_ref (previous_config);
if (meta_monitor_manager_apply_monitors_config (manager, if (meta_monitor_manager_apply_monitors_config (manager,
previous_config, previous_config,
method, method,