Blame SOURCES/0013-manager-save-session-type-in-session-dir.patch

d379a5
From 2dad276ed4db5ee510689f41cd96180415ac4745 Mon Sep 17 00:00:00 2001
5d36d8
From: Ray Strode <rstrode@redhat.com>
5d36d8
Date: Fri, 20 Dec 2013 15:32:04 -0500
5d36d8
Subject: [PATCH 13/19] manager: save session type in session dir
5d36d8
5d36d8
If a user saved their session when in classic mode, make sure we
5d36d8
record that information so subsequent calls to gnome-session will
5d36d8
restore classic mode.
5d36d8
---
d379a5
 gnome-session/gsm-manager.c      | 21 ++++++++++++++--
5d36d8
 gnome-session/gsm-manager.h      |  1 +
d379a5
 gnome-session/gsm-session-save.c | 43 +++++++++++++++++++++++++++++---
d379a5
 gnome-session/gsm-session-save.h |  7 +++---
d379a5
 gnome-session/main.c             | 11 +++++++-
d379a5
 5 files changed, 73 insertions(+), 10 deletions(-)
5d36d8
5d36d8
diff --git a/gnome-session/gsm-manager.c b/gnome-session/gsm-manager.c
d379a5
index 31dc67db..325c6c46 100644
5d36d8
--- a/gnome-session/gsm-manager.c
5d36d8
+++ b/gnome-session/gsm-manager.c
244a5d
@@ -1260,61 +1260,61 @@ finish_pending_save_invocations (GsmManager *manager)
5d36d8
         g_slist_free (manager->priv->pending_save_invocations);
5d36d8
         manager->priv->pending_save_invocations = NULL;
5d36d8
 }
5d36d8
 
5d36d8
 static void
5d36d8
 query_save_session_complete (GsmManager *manager)
5d36d8
 {
5d36d8
         GError *error = NULL;
5d36d8
 
5d36d8
         if (g_slist_length (manager->priv->next_query_clients) > 0) {
5d36d8
                 ClientEndSessionData data;
5d36d8
 
5d36d8
                 data.manager = manager;
5d36d8
                 data.flags = GSM_CLIENT_END_SESSION_FLAG_LAST;
5d36d8
 
5d36d8
                 g_slist_foreach (manager->priv->next_query_clients,
5d36d8
                                  (GFunc)_client_request_save,
5d36d8
                                  &data);
5d36d8
 
5d36d8
                 g_slist_free (manager->priv->next_query_clients);
5d36d8
                 manager->priv->next_query_clients = NULL;
5d36d8
 
5d36d8
                 return;
5d36d8
         }
5d36d8
 
5d36d8
         if (manager->priv->query_timeout_id > 0) {
5d36d8
                 g_source_remove (manager->priv->query_timeout_id);
5d36d8
                 manager->priv->query_timeout_id = 0;
5d36d8
         }
5d36d8
 
5d36d8
-        gsm_session_save (manager->priv->clients, &error);
d379a5
+        gsm_session_save (manager->priv->clients, manager->priv->apps, manager->priv->session_name, &error);
5d36d8
 
5d36d8
         if (error) {
5d36d8
                 g_warning ("Error saving session: %s", error->message);
5d36d8
                 fail_pending_save_invocations (manager, error);
5d36d8
                 g_error_free (error);
5d36d8
         } else {
5d36d8
                 finish_pending_save_invocations (manager);
5d36d8
         }
5d36d8
 }
5d36d8
 
5d36d8
 static guint32
5d36d8
 generate_cookie (void)
5d36d8
 {
5d36d8
         guint32 cookie;
5d36d8
 
5d36d8
         cookie = (guint32)g_random_int_range (1, G_MAXINT32);
5d36d8
 
5d36d8
         return cookie;
5d36d8
 }
5d36d8
 
5d36d8
 static guint32
5d36d8
 _generate_unique_cookie (GsmManager *manager)
5d36d8
 {
5d36d8
         guint32 cookie;
5d36d8
 
5d36d8
         do {
5d36d8
                 cookie = generate_cookie ();
5d36d8
         } while (gsm_store_find (manager->priv->inhibitors, (GsmStoreFunc)_find_by_cookie, &cookie) != NULL);
5d36d8
 
5d36d8
         return cookie;
244a5d
@@ -1528,60 +1528,77 @@ debug_app_summary (GsmManager *manager)
5d36d8
 
5d36d8
         g_debug ("GsmManager: App startup summary");
5d36d8
         for (phase = GSM_MANAGER_PHASE_EARLY_INITIALIZATION; phase < GSM_MANAGER_PHASE_RUNNING; phase++) {
5d36d8
                 g_debug ("GsmManager: Phase %s", phase_num_to_name (phase));
5d36d8
                 gsm_store_foreach (manager->priv->apps,
5d36d8
                                    (GsmStoreFunc)_debug_app_for_phase,
5d36d8
                                    GUINT_TO_POINTER (phase));
5d36d8
         }
5d36d8
 }
5d36d8
 
5d36d8
 void
5d36d8
 gsm_manager_start (GsmManager *manager)
5d36d8
 {
5d36d8
         g_debug ("GsmManager: GSM starting to manage");
5d36d8
 
5d36d8
         g_return_if_fail (GSM_IS_MANAGER (manager));
5d36d8
 
5d36d8
         gsm_xsmp_server_start (manager->priv->xsmp_server);
5d36d8
         gsm_manager_set_phase (manager, GSM_MANAGER_PHASE_EARLY_INITIALIZATION);
5d36d8
         debug_app_summary (manager);
5d36d8
         start_phase (manager);
5d36d8
 }
5d36d8
 
5d36d8
 const char *
5d36d8
 _gsm_manager_get_default_session (GsmManager     *manager)
5d36d8
 {
5d36d8
         return g_settings_get_string (manager->priv->session_settings,
5d36d8
                                       KEY_SESSION_NAME);
5d36d8
 }
5d36d8
 
5d36d8
+char *
5d36d8
+_gsm_manager_get_saved_session (GsmManager     *manager)
5d36d8
+{
5d36d8
+        char *file;
5d36d8
+        char *type;
5d36d8
+        gboolean loaded;
5d36d8
+
5d36d8
+        file = g_build_filename (gsm_util_get_saved_session_dir (), "type", NULL);
5d36d8
+        loaded = g_file_get_contents (file, &type, NULL, NULL);
5d36d8
+        g_free (file);
5d36d8
+
5d36d8
+        if (!loaded)
5d36d8
+                return NULL;
5d36d8
+
5d36d8
+        return type;
5d36d8
+}
5d36d8
+
5d36d8
 void
5d36d8
 _gsm_manager_set_active_session (GsmManager     *manager,
5d36d8
                                  const char     *session_name,
5d36d8
                                  gboolean        is_fallback)
5d36d8
 {
5d36d8
         g_free (manager->priv->session_name);
5d36d8
         manager->priv->session_name = g_strdup (session_name);
5d36d8
         manager->priv->is_fallback_session = is_fallback;
5d36d8
 
5d36d8
         gsm_exported_manager_set_session_name (manager->priv->skeleton, session_name);
5d36d8
 }
5d36d8
 
5d36d8
 void
5d36d8
 _gsm_manager_set_renderer (GsmManager *manager,
5d36d8
                            const char *renderer)
5d36d8
 {
5d36d8
         gsm_exported_manager_set_renderer (manager->priv->skeleton, renderer);
5d36d8
 }
5d36d8
 
5d36d8
 static gboolean
5d36d8
 _app_has_app_id (const char   *id,
5d36d8
                  GsmApp       *app,
5d36d8
                  const char   *app_id_a)
5d36d8
 {
5d36d8
         const char *app_id_b;
5d36d8
 
5d36d8
         app_id_b = gsm_app_peek_app_id (app);
5d36d8
         return (app_id_b != NULL && strcmp (app_id_a, app_id_b) == 0);
5d36d8
 }
5d36d8
 
244a5d
@@ -1946,61 +1963,61 @@ on_xsmp_client_register_confirmed (GsmXSMPClient *client,
5d36d8
         }
5d36d8
 }
5d36d8
 
5d36d8
 static gboolean
5d36d8
 auto_save_is_enabled (GsmManager *manager)
5d36d8
 {
5d36d8
         return g_settings_get_boolean (manager->priv->settings, KEY_AUTOSAVE_ONE_SHOT)
5d36d8
             || g_settings_get_boolean (manager->priv->settings, KEY_AUTOSAVE);
5d36d8
 }
5d36d8
 
5d36d8
 static void
5d36d8
 maybe_save_session (GsmManager *manager)
5d36d8
 {
5d36d8
         GError *error;
5d36d8
 
5d36d8
         if (gsm_system_is_login_session (manager->priv->system))
5d36d8
                 return;
5d36d8
 
5d36d8
         /* We only allow session saving when session is running or when
5d36d8
          * logging out */
5d36d8
         if (manager->priv->phase != GSM_MANAGER_PHASE_RUNNING &&
5d36d8
             manager->priv->phase != GSM_MANAGER_PHASE_END_SESSION) {
5d36d8
                 return;
5d36d8
         }
5d36d8
 
5d36d8
         if (!auto_save_is_enabled (manager)) {
5d36d8
                 return;
5d36d8
         }
5d36d8
 
5d36d8
         error = NULL;
d379a5
-        gsm_session_save (manager->priv->clients, manager->priv->apps, &error);
d379a5
+        gsm_session_save (manager->priv->clients, manager->priv->apps, manager->priv->session_name, &error);
5d36d8
 
5d36d8
         if (error) {
5d36d8
                 g_warning ("Error saving session: %s", error->message);
5d36d8
                 g_error_free (error);
5d36d8
         }
5d36d8
 }
5d36d8
 
5d36d8
 static void
5d36d8
 _handle_client_end_session_response (GsmManager *manager,
5d36d8
                                      GsmClient  *client,
5d36d8
                                      gboolean    is_ok,
5d36d8
                                      gboolean    do_last,
5d36d8
                                      gboolean    cancel,
5d36d8
                                      const char *reason)
5d36d8
 {
5d36d8
         /* just ignore if we are not yet running */
5d36d8
         if (manager->priv->phase < GSM_MANAGER_PHASE_RUNNING) {
5d36d8
                 return;
5d36d8
         }
5d36d8
 
5d36d8
         g_debug ("GsmManager: Response from end session request: is-ok=%d do-last=%d cancel=%d reason=%s", is_ok, do_last, cancel, reason ? reason :"");
5d36d8
 
5d36d8
         if (manager->priv->phase == GSM_MANAGER_PHASE_RUNNING) {
5d36d8
                 /* Ignore responses when no requests were sent */
5d36d8
                 if (manager->priv->query_clients == NULL) {
5d36d8
                         return;
5d36d8
                 }
5d36d8
 
5d36d8
                 manager->priv->query_clients = g_slist_remove (manager->priv->query_clients, client);
5d36d8
 
5d36d8
diff --git a/gnome-session/gsm-manager.h b/gnome-session/gsm-manager.h
5d36d8
index a8de58de..fcf36019 100644
5d36d8
--- a/gnome-session/gsm-manager.h
5d36d8
+++ b/gnome-session/gsm-manager.h
5d36d8
@@ -88,51 +88,52 @@ typedef enum
5d36d8
         GSM_MANAGER_ERROR_INVALID_OPTION,
5d36d8
         GSM_MANAGER_ERROR_LOCKED_DOWN,
5d36d8
         GSM_MANAGER_NUM_ERRORS
5d36d8
 } GsmManagerError;
5d36d8
 
5d36d8
 #define GSM_MANAGER_ERROR gsm_manager_error_quark ()
5d36d8
 GQuark              gsm_manager_error_quark                    (void);
5d36d8
 
5d36d8
 GType               gsm_manager_get_type                       (void);
5d36d8
 
5d36d8
 GsmManager *        gsm_manager_new                            (GsmStore       *client_store,
5d36d8
                                                                 gboolean        failsafe);
5d36d8
 GsmManager *        gsm_manager_get                            (void);
5d36d8
 
5d36d8
 gboolean            gsm_manager_get_failsafe                   (GsmManager     *manager);
5d36d8
 
5d36d8
 gboolean            gsm_manager_add_autostart_app              (GsmManager     *manager,
5d36d8
                                                                 const char     *path,
5d36d8
                                                                 const char     *provides);
5d36d8
 gboolean            gsm_manager_add_required_app               (GsmManager     *manager,
5d36d8
                                                                 const char     *path,
5d36d8
                                                                 const char     *provides);
5d36d8
 gboolean            gsm_manager_add_autostart_apps_from_dir    (GsmManager     *manager,
5d36d8
                                                                 const char     *path);
5d36d8
 gboolean            gsm_manager_add_legacy_session_apps        (GsmManager     *manager,
5d36d8
                                                                 const char     *path);
5d36d8
 
5d36d8
 void                gsm_manager_start                          (GsmManager     *manager);
5d36d8
 
5d36d8
 const char *        _gsm_manager_get_default_session           (GsmManager     *manager);
5d36d8
+char *              _gsm_manager_get_saved_session             (GsmManager     *manager);
5d36d8
 
5d36d8
 void                _gsm_manager_set_active_session            (GsmManager     *manager,
5d36d8
                                                                 const char     *session_name,
5d36d8
                                                                 gboolean        is_fallback);
5d36d8
 
5d36d8
 void                _gsm_manager_set_renderer                  (GsmManager     *manager,
5d36d8
                                                                 const char     *renderer);
5d36d8
 
5d36d8
 gboolean            gsm_manager_save_session                   (GsmManager     *manager,
5d36d8
 								DBusGMethodInvocation *context);
5d36d8
 
5d36d8
 gboolean            gsm_manager_logout                         (GsmManager     *manager,
5d36d8
                                                                 guint           logout_mode,
5d36d8
                                                                 GError        **error);
5d36d8
 
5d36d8
 gboolean            gsm_manager_set_phase                      (GsmManager     *manager,
5d36d8
                                                                 GsmManagerPhase phase);
5d36d8
 
5d36d8
 G_END_DECLS
5d36d8
 
5d36d8
 #endif /* __GSM_MANAGER_H */
5d36d8
diff --git a/gnome-session/gsm-session-save.c b/gnome-session/gsm-session-save.c
d379a5
index 7cbc72fe..22706953 100644
5d36d8
--- a/gnome-session/gsm-session-save.c
5d36d8
+++ b/gnome-session/gsm-session-save.c
d379a5
@@ -1,75 +1,107 @@
5d36d8
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
5d36d8
  * gsm-session-save.c
5d36d8
  * Copyright (C) 2008 Lucas Rocha.
5d36d8
  *
5d36d8
  * This program is free software; you can redistribute it and/or
5d36d8
  * modify it under the terms of the GNU General Public License as
5d36d8
  * published by the Free Software Foundation; either version 2 of the
5d36d8
  * License, or (at your option) any later version.
5d36d8
  *
5d36d8
  * This program is distributed in the hope that it will be useful, but
5d36d8
  * WITHOUT ANY WARRANTY; without even the implied warranty of
5d36d8
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5d36d8
  * Lesser General Public License for more details.
5d36d8
  *
5d36d8
  * You should have received a copy of the GNU General Public License
5d36d8
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
5d36d8
  */
5d36d8
 
5d36d8
 #include <config.h>
5d36d8
 
5d36d8
+#include <string.h>
5d36d8
+
5d36d8
 #include <glib.h>
5d36d8
 #include <glib/gstdio.h>
5d36d8
 #include <gio/gio.h>
5d36d8
 
d379a5
 #include "gsm-app.h"
5d36d8
 #include "gsm-util.h"
5d36d8
 #include "gsm-autostart-app.h"
5d36d8
 #include "gsm-client.h"
5d36d8
 
5d36d8
 #include "gsm-session-save.h"
5d36d8
 
5d36d8
 #define GSM_MANAGER_SCHEMA        "org.gnome.SessionManager"
5d36d8
 #define KEY_AUTOSAVE_ONE_SHOT     "auto-save-session-one-shot"
5d36d8
 
5d36d8
 
5d36d8
 static gboolean gsm_session_clear_saved_session (const char *directory,
5d36d8
                                                  GHashTable *discard_hash);
5d36d8
 
5d36d8
 typedef struct {
5d36d8
         char        *dir;
5d36d8
         GHashTable  *discard_hash;
d379a5
         GsmStore    *app_store;
5d36d8
         GError     **error;
5d36d8
 } SessionSaveData;
5d36d8
 
5d36d8
+static void
5d36d8
+clear_session_type (const char *save_dir)
5d36d8
+{
5d36d8
+        char *file;
5d36d8
+
5d36d8
+        file = g_build_filename (save_dir, "type", NULL);
5d36d8
+
5d36d8
+        g_unlink (file);
5d36d8
+
5d36d8
+        g_free (file);
5d36d8
+}
5d36d8
+
5d36d8
+static void
5d36d8
+set_session_type (const char *save_dir,
5d36d8
+                  const char *type)
5d36d8
+{
5d36d8
+        char *file;
5d36d8
+        GError *error;
5d36d8
+
5d36d8
+        file = g_build_filename (save_dir, "type", NULL);
5d36d8
+
5d36d8
+        error = NULL;
5d36d8
+        g_file_set_contents (file, type, strlen (type), &error);
5d36d8
+        if (error != NULL)
5d36d8
+                g_warning ("couldn't save session type to %s: %s",
5d36d8
+                           type, error->message);
5d36d8
+
5d36d8
+        g_free (file);
5d36d8
+}
5d36d8
+
5d36d8
 static gboolean
d379a5
 _app_has_app_id (const char   *id,
d379a5
                  GsmApp       *app,
d379a5
                  const char   *app_id_a)
d379a5
 {
d379a5
         const char *app_id_b;
d379a5
 
d379a5
         app_id_b = gsm_app_peek_app_id (app);
d379a5
         return g_strcmp0 (app_id_a, app_id_b) == 0;
d379a5
 }
d379a5
 
d379a5
 static gboolean
5d36d8
 save_one_client (char            *id,
5d36d8
                  GObject         *object,
5d36d8
                  SessionSaveData *data)
5d36d8
 {
5d36d8
         GsmClient  *client;
5d36d8
         GKeyFile   *keyfile;
d379a5
         GsmApp     *app = NULL;
5d36d8
         const char *app_id;
5d36d8
         char       *path = NULL;
5d36d8
         char       *filename = NULL;
5d36d8
         char       *contents = NULL;
5d36d8
         gsize       length = 0;
5d36d8
         char       *discard_exec;
5d36d8
         GError     *local_error;
5d36d8
 
5d36d8
         client = GSM_CLIENT (object);
5d36d8
 
5d36d8
         local_error = NULL;
d379a5
@@ -124,114 +156,116 @@ save_one_client (char            *id,
5d36d8
                                               GSM_AUTOSTART_APP_DISCARD_KEY,
5d36d8
                                               NULL);
5d36d8
         if (discard_exec) {
5d36d8
                 g_hash_table_insert (data->discard_hash,
5d36d8
                                      discard_exec, discard_exec);
5d36d8
         }
5d36d8
 
5d36d8
         g_debug ("GsmSessionSave: saved client %s to %s", id, filename);
5d36d8
 
5d36d8
 out:
5d36d8
         if (keyfile != NULL) {
5d36d8
                 g_key_file_free (keyfile);
5d36d8
         }
5d36d8
 
5d36d8
         g_free (contents);
5d36d8
         g_free (filename);
5d36d8
         g_free (path);
5d36d8
 
5d36d8
         /* in case of any error, stop saving session */
5d36d8
         if (local_error) {
5d36d8
                 g_propagate_error (data->error, local_error);
5d36d8
                 g_error_free (local_error);
5d36d8
 
5d36d8
                 return TRUE;
5d36d8
         }
5d36d8
 
5d36d8
         return FALSE;
5d36d8
 }
5d36d8
 
5d36d8
 void
5d36d8
-gsm_session_save (GsmStore  *client_store,
d379a5
-                  GsmStore  *app_store,
5d36d8
-                  GError   **error)
5d36d8
+gsm_session_save (GsmStore    *client_store,
d379a5
+                  GsmStore    *app_store,
5d36d8
+                  const char  *type,
5d36d8
+                  GError     **error)
5d36d8
 {
5d36d8
         GSettings       *settings;
5d36d8
         const char      *save_dir;
5d36d8
         char            *tmp_dir;
5d36d8
         SessionSaveData  data;
5d36d8
 
5d36d8
         g_debug ("GsmSessionSave: Saving session");
5d36d8
 
5d36d8
         /* Clear one shot key autosave in the event its set (so that it's actually
5d36d8
          * one shot only)
5d36d8
          */
5d36d8
         settings = g_settings_new (GSM_MANAGER_SCHEMA);
5d36d8
         g_settings_set_boolean (settings, KEY_AUTOSAVE_ONE_SHOT, FALSE);
5d36d8
         g_object_unref (settings);
5d36d8
 
5d36d8
         save_dir = gsm_util_get_saved_session_dir ();
5d36d8
         if (save_dir == NULL) {
5d36d8
                 g_warning ("GsmSessionSave: cannot create saved session directory");
5d36d8
                 return;
5d36d8
         }
5d36d8
 
5d36d8
         tmp_dir = gsm_util_get_empty_tmp_session_dir ();
5d36d8
         if (tmp_dir == NULL) {
5d36d8
                 g_warning ("GsmSessionSave: cannot create new saved session directory");
5d36d8
                 return;
5d36d8
         }
5d36d8
 
5d36d8
         /* save the session in a temp directory, and remember the discard
5d36d8
          * commands */
5d36d8
         data.dir = tmp_dir;
5d36d8
         data.discard_hash = g_hash_table_new_full (g_str_hash, g_str_equal,
5d36d8
                                                    g_free, NULL);
d379a5
         data.app_store = app_store;
5d36d8
         data.error = error;
5d36d8
 
5d36d8
         gsm_store_foreach (client_store,
5d36d8
                            (GsmStoreFunc) save_one_client,
5d36d8
                            &data);
5d36d8
 
5d36d8
         if (!*error) {
5d36d8
                 char *session_dir;
5d36d8
 
5d36d8
                 if (g_file_test (save_dir, G_FILE_TEST_IS_SYMLINK))
5d36d8
                         session_dir = g_file_read_link (save_dir, error);
5d36d8
                 else
5d36d8
                         session_dir = g_strdup (save_dir);
5d36d8
 
5d36d8
                 if (session_dir != NULL) {
5d36d8
-
5d36d8
                         char *absolute_session_dir;
5d36d8
 
5d36d8
+                        set_session_type (tmp_dir, type);
5d36d8
+
5d36d8
                         if (g_path_is_absolute (session_dir)) {
5d36d8
                                 absolute_session_dir = g_strdup (session_dir);
5d36d8
                         } else {
5d36d8
                                 char *parent_dir;
5d36d8
 
5d36d8
                                 parent_dir = g_path_get_dirname (save_dir);
5d36d8
                                 absolute_session_dir = g_build_filename (parent_dir, session_dir, NULL);
5d36d8
                                 g_free (parent_dir);
5d36d8
                         }
5d36d8
                         g_free (session_dir);
5d36d8
 
5d36d8
                         /* remove the old saved session */
5d36d8
                         gsm_session_clear_saved_session (absolute_session_dir, data.discard_hash);
5d36d8
 
5d36d8
                         if (g_file_test (absolute_session_dir, G_FILE_TEST_IS_DIR))
5d36d8
                                 g_rmdir (absolute_session_dir);
5d36d8
                         g_rename (tmp_dir, absolute_session_dir);
5d36d8
 
5d36d8
                         g_free (absolute_session_dir);
5d36d8
                 }
5d36d8
         } else {
5d36d8
                 g_warning ("GsmSessionSave: error saving session: %s", (*error)->message);
5d36d8
                 /* FIXME: we should create a hash table filled with the discard
5d36d8
                  * commands that are in desktop files from save_dir. */
5d36d8
                 gsm_session_clear_saved_session (tmp_dir, NULL);
5d36d8
                 g_rmdir (tmp_dir);
5d36d8
         }
5d36d8
 
5d36d8
         g_hash_table_destroy (data.discard_hash);
5d36d8
         g_free (tmp_dir);
d379a5
@@ -313,31 +347,32 @@ gsm_session_clear_saved_session (const char *directory,
5d36d8
 
5d36d8
         while ((filename = g_dir_read_name (dir))) {
5d36d8
                 char *path = g_build_filename (directory,
5d36d8
                                                filename, NULL);
5d36d8
 
5d36d8
                 result = gsm_session_clear_one_client (path, discard_hash)
5d36d8
                          && result;
5d36d8
 
5d36d8
                 g_free (path);
5d36d8
         }
5d36d8
 
5d36d8
         g_dir_close (dir);
5d36d8
 
5d36d8
         return result;
5d36d8
 }
5d36d8
 
5d36d8
 void
5d36d8
 gsm_session_save_clear (void)
5d36d8
 {
5d36d8
         const char *save_dir;
5d36d8
 
5d36d8
         g_debug ("GsmSessionSave: Clearing saved session");
5d36d8
 
5d36d8
         save_dir = gsm_util_get_saved_session_dir ();
5d36d8
         if (save_dir == NULL) {
5d36d8
                 g_warning ("GsmSessionSave: cannot create saved session directory");
5d36d8
                 return;
5d36d8
         }
5d36d8
 
5d36d8
         gsm_session_clear_saved_session (save_dir, NULL);
5d36d8
+        clear_session_type (save_dir);
5d36d8
 }
5d36d8
diff --git a/gnome-session/gsm-session-save.h b/gnome-session/gsm-session-save.h
d379a5
index f55c9c16..b32673c4 100644
5d36d8
--- a/gnome-session/gsm-session-save.h
5d36d8
+++ b/gnome-session/gsm-session-save.h
d379a5
@@ -1,34 +1,35 @@
5d36d8
 /* gsm-session-save.h
5d36d8
  * Copyright (C) 2008 Lucas Rocha.
5d36d8
  *
5d36d8
  * This program is free software; you can redistribute it and/or
5d36d8
  * modify it under the terms of the GNU General Public License as
5d36d8
  * published by the Free Software Foundation; either version 2 of the
5d36d8
  * License, or (at your option) any later version.
5d36d8
  *
5d36d8
  * This program is distributed in the hope that it will be useful, but
5d36d8
  * WITHOUT ANY WARRANTY; without even the implied warranty of
5d36d8
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5d36d8
  * Lesser General Public License for more details.
5d36d8
  *
5d36d8
  * You should have received a copy of the GNU General Public License
5d36d8
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
5d36d8
  */
5d36d8
 
5d36d8
 #ifndef __GSM_SESSION_SAVE_H__
5d36d8
 #define __GSM_SESSION_SAVE_H__
5d36d8
 
5d36d8
 #include <glib.h>
5d36d8
 
5d36d8
 #include "gsm-store.h"
5d36d8
 
5d36d8
 G_BEGIN_DECLS
5d36d8
 
5d36d8
-void      gsm_session_save                 (GsmStore  *client_store,
d379a5
-                                            GsmStore  *app_store,
5d36d8
-                                            GError   **error);
5d36d8
+void      gsm_session_save                 (GsmStore    *client_store,
d379a5
+                                            GsmStore    *app_store,
5d36d8
+                                            const char  *type,
5d36d8
+                                            GError     **error);
5d36d8
 void      gsm_session_save_clear           (void);
5d36d8
 
5d36d8
 G_END_DECLS
5d36d8
 
5d36d8
 #endif /* __GSM_SESSION_SAVE_H__ */
5d36d8
diff --git a/gnome-session/main.c b/gnome-session/main.c
d379a5
index b1ac3850..cee385d9 100644
5d36d8
--- a/gnome-session/main.c
5d36d8
+++ b/gnome-session/main.c
244a5d
@@ -119,61 +119,70 @@ sigusr2_cb (gpointer data)
5d36d8
 static gboolean
244a5d
 sigusr1_cb (gpointer data)
5d36d8
 {
244a5d
         gdm_log_toggle_debug ();
5d36d8
         return TRUE;
5d36d8
 }
5d36d8
 
244a5d
 static void
244a5d
 on_name_acquired (GDBusConnection *connection,
244a5d
                   const char *name,
244a5d
                   gpointer data)
5d36d8
 {
244a5d
         gsm_manager_start (manager);
5d36d8
 }
5d36d8
 
5d36d8
 static void
5d36d8
 create_manager (void)
5d36d8
 {
5d36d8
         GsmStore *client_store;
5d36d8
 
5d36d8
         client_store = gsm_store_new ();
5d36d8
         manager = gsm_manager_new (client_store, failsafe);
5d36d8
         g_object_unref (client_store);
5d36d8
 
5d36d8
         g_unix_signal_add (SIGTERM, term_or_int_signal_cb, manager);
5d36d8
         g_unix_signal_add (SIGINT, term_or_int_signal_cb, manager);
5d36d8
         g_unix_signal_add (SIGUSR1, sigusr1_cb, manager);
5d36d8
         g_unix_signal_add (SIGUSR2, sigusr2_cb, manager);
5d36d8
 
5d36d8
         if (IS_STRING_EMPTY (session_name)) {
5d36d8
-                session_name = _gsm_manager_get_default_session (manager);
5d36d8
+                char *saved_session_name;
5d36d8
+
5d36d8
+                saved_session_name = _gsm_manager_get_saved_session (manager);
5d36d8
+
5d36d8
+                if (IS_STRING_EMPTY (saved_session_name))
5d36d8
+                        session_name = _gsm_manager_get_default_session (manager);
5d36d8
+                else
5d36d8
+                        session_name = g_steal_pointer (&saved_session_name);
5d36d8
+
5d36d8
+                g_free (saved_session_name);
5d36d8
         }
5d36d8
 
5d36d8
         if (!gsm_session_fill (manager, session_name)) {
5d36d8
                 gsm_fail_whale_dialog_we_failed (FALSE, TRUE, NULL);
5d36d8
         }
5d36d8
 
5d36d8
         _gsm_manager_set_renderer (manager, gl_renderer);
5d36d8
 }
5d36d8
 
5d36d8
 static void
5d36d8
 on_bus_acquired (GDBusConnection *connection,
5d36d8
                  const char *name,
5d36d8
                  gpointer data)
5d36d8
 {
5d36d8
         create_manager ();
5d36d8
 }
5d36d8
 
5d36d8
 static guint
5d36d8
 acquire_name (void)
5d36d8
 {
5d36d8
         return g_bus_own_name (G_BUS_TYPE_SESSION,
5d36d8
                                GSM_DBUS_NAME,
5d36d8
                                G_BUS_NAME_OWNER_FLAGS_NONE,
5d36d8
                                on_bus_acquired,
244a5d
                                on_name_acquired,
5d36d8
                                on_name_lost,
5d36d8
                                NULL, NULL);
5d36d8
 }
5d36d8
 
244a5d
 static gboolean
5d36d8
-- 
d379a5
2.17.0
5d36d8