From 759ff8281f27a0c0a63b33ffb4e2aa4066429198 Mon Sep 17 00:00:00 2001 From: Adrian Vovk Date: Thu, 18 Sep 2025 23:55:19 -0400 Subject: [PATCH] manager: Support save/restore setting We're adding a toggle to gnome-control-center that lets you disable the session save/restore feature. This hooks up gnome-session to respect the setting. --- gnome-session/gsm-manager.c | 6 +++++ gnome-session/gsm-session-save.c | 31 ++++++++++++++++++++++ gnome-session/gsm-session-save.h | 1 + gnome-session/org.gnome.SessionManager.xml | 7 +++++ 4 files changed, 45 insertions(+) diff --git a/gnome-session/gsm-manager.c b/gnome-session/gsm-manager.c index e8abf601..fecde253 100644 --- a/gnome-session/gsm-manager.c +++ b/gnome-session/gsm-manager.c @@ -60,6 +60,7 @@ #define SESSION_SCHEMA "org.gnome.desktop.session" #define KEY_IDLE_DELAY "idle-delay" +#define KEY_SAVE_RESTORE "save-restore" #define GSM_MANAGER_SCHEMA "org.gnome.SessionManager" #define KEY_LOGOUT_PROMPT "logout-prompt" @@ -859,6 +860,7 @@ _gsm_manager_set_active_session (GsmManager *manager, if (!is_kiosk) manager->session_save = gsm_session_save_new (session_name); + gsm_exported_manager_set_restore_supported (manager->skeleton, manager->session_save != NULL); gsm_exported_manager_set_session_name (manager->skeleton, session_name); } @@ -2215,6 +2217,10 @@ handle_end_session_dialog_confirmation (GsmManager *manager, else if (manager->logout_type != confirmed_logout_type) g_warning ("GsmManager: Shell confirmed unexpected logout type"); + if (manager->session_save && + !g_settings_get_boolean (manager->session_settings, KEY_SAVE_RESTORE)) + gsm_session_save_discard (manager->session_save); + manager->logout_mode = GSM_MANAGER_LOGOUT_MODE_FORCE; manager->logout_type = confirmed_logout_type; end_phase (manager); diff --git a/gnome-session/gsm-session-save.c b/gnome-session/gsm-session-save.c index 034c7716..49ee1e34 100644 --- a/gnome-session/gsm-session-save.c +++ b/gnome-session/gsm-session-save.c @@ -714,6 +714,37 @@ gsm_session_save_unregister (GsmSessionSave *save, return TRUE; } +static gboolean +free_if_not_crashed (SavedAppInstance *instance, + SavedApp *app) +{ + /* Remember instances of crashed apps, so that we communicate the right + * restore reason on next launch */ + if (instance->crash_state == CRASH_STATE_INSTANCE_CRASHED) + return FALSE; + + saved_app_discard_instance (app, instance); + saved_app_instance_free (instance); + return TRUE; +} + +void +gsm_session_save_discard (GsmSessionSave *save) +{ + GHashTableIter iter; + gpointer value; + + g_hash_table_iter_init (&iter, save->apps); + while (g_hash_table_iter_next (&iter, NULL, &value)) { + SavedApp *app = value; + app->instances = remove_all_predicate (app->instances, + (DestroyPredicate) free_if_not_crashed, + app); + } + + flush_to_disk (save); +} + GsmSessionSave * gsm_session_save_new (const char *session_id) { diff --git a/gnome-session/gsm-session-save.h b/gnome-session/gsm-session-save.h index 15c0c8ec..82ee61cb 100644 --- a/gnome-session/gsm-session-save.h +++ b/gnome-session/gsm-session-save.h @@ -34,5 +34,6 @@ void gsm_session_save_deleted_ids (GsmSessionSave *save, gboolean gsm_session_save_unregister (GsmSessionSave *save, const char *app_id, const char *instance_id); +void gsm_session_save_discard (GsmSessionSave *save); G_END_DECLS diff --git a/gnome-session/org.gnome.SessionManager.xml b/gnome-session/org.gnome.SessionManager.xml index a5cf3fc4..1a5bec6c 100644 --- a/gnome-session/org.gnome.SessionManager.xml +++ b/gnome-session/org.gnome.SessionManager.xml @@ -453,5 +453,12 @@ --> + + + -- GitLab