[gnome-session] Use "session-name" property which specifies which session to use



commit 71cc0cde1a3fe81639ad86dde11ee4b2be42955e
Author: Alexander Larsson <alexl redhat com>
Date:   Mon Feb 14 16:29:13 2011 +0100

    Use "session-name" property which specifies which session to use
    
    Currently we have two sessions:
    
    "gnome"
    "gnome-fallback"
    
    This adds a GSetting (actual key defined in gsettings-desktop-schemacs)
    which allows choosing between these, and potentially any arbitrary
    .desktop file that a fork or embed may write.
    
    This key will be toggled by gnome-control-center to implement
    the "always fall back" preference.

 gnome-session/gsm-manager.c      |   36 ++++++++++++++++++++++++++++++++++++
 gnome-session/gsm-manager.h      |    5 +++++
 gnome-session/gsm-session-fill.c |   25 +++++++++++++++++--------
 3 files changed, 58 insertions(+), 8 deletions(-)
---
diff --git a/gnome-session/gsm-manager.c b/gnome-session/gsm-manager.c
index f6c5399..e5559cf 100644
--- a/gnome-session/gsm-manager.c
+++ b/gnome-session/gsm-manager.c
@@ -74,6 +74,7 @@
 
 #define SESSION_SCHEMA            "org.gnome.desktop.session"
 #define KEY_IDLE_DELAY            "idle-delay"
+#define KEY_SESSION_NAME          "session-name"
 
 #define GSM_MANAGER_SCHEMA        "org.gnome.SessionManager"
 #define KEY_AUTOSAVE              "auto-save-session"
@@ -102,6 +103,8 @@ struct GsmManagerPrivate
         GsmStore               *apps;
         GsmPresence            *presence;
 
+        gboolean                is_fallback_session : 1;
+
         /* Current status */
         GsmManagerPhase         phase;
         guint                   phase_timeout_id;
@@ -141,6 +144,7 @@ struct GsmManagerPrivate
 enum {
         PROP_0,
         PROP_CLIENT_STORE,
+        PROP_FALLBACK,
         PROP_FAILSAFE
 };
 
@@ -1431,6 +1435,21 @@ gsm_manager_start (GsmManager *manager)
         start_phase (manager);
 }
 
+const char *
+_gsm_manager_get_default_session (GsmManager     *manager)
+{
+        return g_settings_get_string (manager->priv->session_settings,
+                                      KEY_SESSION_NAME);
+}
+
+void
+_gsm_manager_set_is_fallback (GsmManager     *manager,
+                              gboolean        is_fallback)
+{
+        manager->priv->is_fallback_session = is_fallback;
+}
+
+
 static gboolean
 _app_has_app_id (const char   *id,
                  GsmApp       *app,
@@ -2179,6 +2198,9 @@ gsm_manager_get_property (GObject    *object,
         case PROP_FAILSAFE:
                 g_value_set_boolean (value, self->priv->failsafe);
                 break;
+        case PROP_FALLBACK:
+                g_value_set_boolean (value, self->priv->is_fallback_session);
+                break;
         case PROP_CLIENT_STORE:
                 g_value_set_object (value, self->priv->clients);
                 break;
@@ -2387,6 +2409,20 @@ gsm_manager_class_init (GsmManagerClass *klass)
                                                                NULL,
                                                                FALSE,
                                                                G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+        /**
+         * GsmManager::fallback
+         *
+         * If %TRUE, the current session is running in the "fallback" mode;
+         * this is distinct from whether or not it was configured as default.
+         */
+        g_object_class_install_property (object_class,
+                                         PROP_FALLBACK,
+                                         g_param_spec_boolean ("fallback",
+                                                               NULL,
+                                                               NULL,
+                                                               FALSE,
+                                                               G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+
         g_object_class_install_property (object_class,
                                          PROP_CLIENT_STORE,
                                          g_param_spec_object ("client-store",
diff --git a/gnome-session/gsm-manager.h b/gnome-session/gsm-manager.h
index e34308a..406af8f 100644
--- a/gnome-session/gsm-manager.h
+++ b/gnome-session/gsm-manager.h
@@ -126,6 +126,11 @@ gboolean            gsm_manager_add_legacy_session_apps        (GsmManager     *
 
 void                gsm_manager_start                          (GsmManager     *manager);
 
+const char *        _gsm_manager_get_default_session           (GsmManager     *manager);
+
+void                _gsm_manager_set_is_fallback               (GsmManager     *manager,
+                                                                gboolean        is_fallback);
+
 
 /* exported methods */
 
diff --git a/gnome-session/gsm-session-fill.c b/gnome-session/gsm-session-fill.c
index 80aa5ea..f1c61a2 100644
--- a/gnome-session/gsm-session-fill.c
+++ b/gnome-session/gsm-session-fill.c
@@ -28,8 +28,6 @@
 #include "gsm-process-helper.h"
 #include "gsm-util.h"
 
-#define GSM_DEFAULT_SESSION "gnome"
-
 #define GSM_KEYFILE_SESSION_GROUP "GNOME Session"
 #define GSM_KEYFILE_RUNNABLE_KEY "IsRunnableHelper"
 #define GSM_KEYFILE_FALLBACK_KEY "FallbackSession"
@@ -361,7 +359,8 @@ find_valid_session_keyfile (const char *session)
 }
 
 static GKeyFile *
-get_session_keyfile (const char *session)
+get_session_keyfile (const char *session,
+                     gboolean   *is_fallback)
 {
         GKeyFile *keyfile;
         gboolean  session_runnable;
@@ -389,8 +388,11 @@ get_session_keyfile (const char *session)
                 session_runnable = check_required_components (keyfile);
         }
 
-        if (session_runnable)
+        if (session_runnable) {
+                if (is_fallback)
+                        *is_fallback = FALSE;
                 return keyfile;
+        }
 
         g_debug ("fill: *** Session is not runnable");
 
@@ -402,8 +404,11 @@ get_session_keyfile (const char *session)
         g_key_file_free (keyfile);
         keyfile = NULL;
 
-        if (!IS_STRING_EMPTY (value))
-                keyfile = get_session_keyfile (value);
+        if (!IS_STRING_EMPTY (value)) {
+                if (is_fallback)
+                        *is_fallback = TRUE;
+                keyfile = get_session_keyfile (value, NULL);
+        }
         g_free (value);
 
         return keyfile;
@@ -415,6 +420,7 @@ gsm_session_fill (GsmManager  *manager,
                   const char  *session)
 {
         GKeyFile *keyfile;
+        gboolean is_fallback;
 
         if (override_autostart_dirs != NULL) {
                 load_override_apps (manager, override_autostart_dirs);
@@ -422,13 +428,16 @@ gsm_session_fill (GsmManager  *manager,
         }
 
         if (IS_STRING_EMPTY (session))
-                session = GSM_DEFAULT_SESSION;
+                session = _gsm_manager_get_default_session (manager);
 
-        keyfile = get_session_keyfile (session);
+        keyfile = get_session_keyfile (session, &is_fallback);
 
         if (!keyfile)
                 return FALSE;
 
+        if (is_fallback)
+                _gsm_manager_set_is_fallback (manager, TRUE);
+
         load_standard_apps (manager, keyfile);
 
         g_key_file_free (keyfile);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]