diff --git a/gnome-session/gsm-manager.c b/gnome-session/gsm-manager.c index e8abf601a573daf312ef49ae4456e4c22529b607..fecde253e76efddefd282effa4b2d83cba6d583c 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 034c7716313e429bc372aa6ec7ec2146be1cdfc7..49ee1e34495a6e7f8290b3bd76e2cec385293800 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 15c0c8eca6110a36838855768abf55004482bea2..82ee61cbb9bb8b8c9e552254d50b94c0897b4004 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 a5cf3fc49825c3a12d3220a3d21468945dd460c7..1a5bec6c7c040267815d63d51edfd34289a891ae 100644 --- a/gnome-session/org.gnome.SessionManager.xml +++ b/gnome-session/org.gnome.SessionManager.xml @@ -453,5 +453,12 @@ --> + + +