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 @@
-->
+
+
+