diff options
author | Jonas Ã…dahl <jadahl@gmail.com> | 2023-03-14 17:28:24 +0100 |
---|---|---|
committer | Marge Bot <marge-bot@gnome.org> | 2023-03-18 16:20:49 +0000 |
commit | 214a7d393b014cb12c1b7986e99e92d1eb324ff2 (patch) | |
tree | fcace47bb8bf36bbf1423dc148afebe4129871e0 /src/backends/meta-monitor-manager.c | |
parent | 5daddf0bc733c4d935767d1598610837347606e1 (diff) | |
download | mutter-214a7d393b014cb12c1b7986e99e92d1eb324ff2.tar.gz |
monitor-manager: Apply switch-config in idle callback
Just as with restoring the previous monitor configuration in case the
user clicked "revert" in GNOME Shell's monitor configuration
confirmation dialog, we need to do switch configs in an idle callback as
well.
Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2694
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2912>
Diffstat (limited to 'src/backends/meta-monitor-manager.c')
-rw-r--r-- | src/backends/meta-monitor-manager.c | 60 |
1 files changed, 48 insertions, 12 deletions
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c index e6df87630..28cc457e7 100644 --- a/src/backends/meta-monitor-manager.c +++ b/src/backends/meta-monitor-manager.c @@ -116,6 +116,8 @@ typedef struct _MetaMonitorManagerPrivate gboolean has_builtin_panel; gboolean night_light_supported; const char *experimental_hdr; + + guint switch_config_handle_id; } MetaMonitorManagerPrivate; G_DEFINE_TYPE_WITH_PRIVATE (MetaMonitorManager, meta_monitor_manager, @@ -1356,6 +1358,8 @@ static void meta_monitor_manager_dispose (GObject *object) { MetaMonitorManager *manager = META_MONITOR_MANAGER (object); + MetaMonitorManagerPrivate *priv = + meta_monitor_manager_get_instance_private (manager); g_clear_handle_id (&manager->dbus_name_id, g_bus_unown_name); @@ -1364,6 +1368,7 @@ meta_monitor_manager_dispose (GObject *object) g_clear_handle_id (&manager->persistent_timeout_id, g_source_remove); g_clear_handle_id (&manager->restore_config_id, g_source_remove); + g_clear_handle_id (&priv->switch_config_handle_id, g_source_remove); G_OBJECT_CLASS (meta_monitor_manager_parent_class)->dispose (object); } @@ -3863,35 +3868,66 @@ meta_monitor_manager_rotate_monitor (MetaMonitorManager *manager) g_object_unref (config); } -void -meta_monitor_manager_switch_config (MetaMonitorManager *manager, - MetaMonitorSwitchConfigType config_type) +typedef struct { - GError *error = NULL; + MetaMonitorManager *monitor_manager; + MetaMonitorSwitchConfigType config_type; +} SwitchConfigData; + +static gboolean +switch_config_idle_cb (gpointer user_data) +{ + SwitchConfigData *data = user_data; + MetaMonitorManager *monitor_manager = data->monitor_manager; + MetaMonitorManagerPrivate *priv = + meta_monitor_manager_get_instance_private (monitor_manager); + MetaMonitorConfigManager *config_manager = monitor_manager->config_manager; MetaMonitorsConfig *config; + g_autoptr (GError) error = NULL; - g_return_if_fail (config_type != META_MONITOR_SWITCH_CONFIG_UNKNOWN); + priv->switch_config_handle_id = 0; config = - meta_monitor_config_manager_create_for_switch_config (manager->config_manager, - config_type); + meta_monitor_config_manager_create_for_switch_config (config_manager, + data->config_type); if (!config) - return; + return G_SOURCE_REMOVE; - if (!meta_monitor_manager_apply_monitors_config (manager, + if (!meta_monitor_manager_apply_monitors_config (monitor_manager, config, META_MONITORS_CONFIG_METHOD_TEMPORARY, &error)) { g_warning ("Failed to use switch monitor configuration: %s", error->message); - g_error_free (error); } else { - manager->current_switch_config = config_type; + monitor_manager->current_switch_config = data->config_type; } - g_object_unref (config); + + return G_SOURCE_REMOVE; +} + +void +meta_monitor_manager_switch_config (MetaMonitorManager *manager, + MetaMonitorSwitchConfigType config_type) +{ + MetaMonitorManagerPrivate *priv = + meta_monitor_manager_get_instance_private (manager); + SwitchConfigData *data; + + g_return_if_fail (config_type != META_MONITOR_SWITCH_CONFIG_UNKNOWN); + + data = g_new0 (SwitchConfigData, 1); + data->monitor_manager = manager; + data->config_type = config_type; + + g_clear_handle_id (&priv->switch_config_handle_id, g_source_remove); + priv->switch_config_handle_id = g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, + switch_config_idle_cb, + data, + g_free); } gboolean |