gnome-session r4952 - in trunk: . gnome-session



Author: mccann
Date: Thu Aug 14 18:17:06 2008
New Revision: 4952
URL: http://svn.gnome.org/viewvc/gnome-session?rev=4952&view=rev

Log:
2008-08-14  William Jon McCann  <jmccann redhat com>

	* gnome-session/gsm-manager.c (gsm_manager_constructor),
	(append_app), (gsm_manager_add_autostart_app),
	(gsm_manager_add_autostart_apps_from_dir),
	(gsm_manager_add_legacy_session_apps):
	* gnome-session/gsm-manager.h:
	* gnome-session/main.c (append_default_apps),
	(append_saved_session_apps), (append_required_apps), (load_apps),
	(main):
	Move the gconf key and dir loading code out of the manager.



Modified:
   trunk/ChangeLog
   trunk/gnome-session/gsm-manager.c
   trunk/gnome-session/gsm-manager.h
   trunk/gnome-session/main.c

Modified: trunk/gnome-session/gsm-manager.c
==============================================================================
--- trunk/gnome-session/gsm-manager.c	(original)
+++ trunk/gnome-session/gsm-manager.c	Thu Aug 14 18:17:06 2008
@@ -67,9 +67,6 @@
 
 #define GSM_MANAGER_PHASE_TIMEOUT 10 /* seconds */
 
-#define GSM_GCONF_DEFAULT_SESSION_KEY           "/desktop/gnome/session/default-session"
-#define GSM_GCONF_REQUIRED_COMPONENTS_DIRECTORY "/desktop/gnome/session/required-components"
-
 #define GDM_FLEXISERVER_COMMAND "gdmflexiserver"
 #define GDM_FLEXISERVER_ARGS    "--startnew Standard"
 
@@ -1675,222 +1672,6 @@
         }
 }
 
-static void
-append_app (GsmManager *manager,
-            GsmApp     *app)
-{
-        const char *id;
-        const char *app_id;
-        GsmApp     *dup;
-
-        id = gsm_app_peek_id (app);
-        if (IS_STRING_EMPTY (id)) {
-                g_debug ("GsmManager: not adding app: no id");
-                return;
-        }
-
-        dup = (GsmApp *)gsm_store_lookup (manager->priv->apps, id);
-        if (dup != NULL) {
-                g_debug ("GsmManager: not adding app: already added");
-                return;
-        }
-
-        app_id = gsm_app_peek_app_id (app);
-        if (IS_STRING_EMPTY (app_id)) {
-                g_debug ("GsmManager: not adding app: no app-id");
-                return;
-        }
-
-        dup = find_app_for_app_id (manager, app_id);
-        if (dup != NULL) {
-                g_debug ("GsmManager: not adding app: app-id already exists");
-                return;
-        }
-
-        gsm_store_add (manager->priv->apps, id, G_OBJECT (app));
-}
-
-static void
-append_default_apps (GsmManager *manager,
-                     char      **autostart_dirs)
-{
-        GSList      *default_apps;
-        GSList      *a;
-        char       **app_dirs;
-        GConfClient *client;
-
-        g_debug ("GsmManager: *** Adding default apps");
-
-        app_dirs = gsm_util_get_app_dirs ();
-
-        client = gconf_client_get_default ();
-        default_apps = gconf_client_get_list (client,
-                                              GSM_GCONF_DEFAULT_SESSION_KEY,
-                                              GCONF_VALUE_STRING,
-                                              NULL);
-        g_object_unref (client);
-
-        for (a = default_apps; a; a = a->next) {
-                GKeyFile *key_file;
-                char     *app_path = NULL;
-                char     *desktop_file;
-
-                key_file = g_key_file_new ();
-
-                if (IS_STRING_EMPTY ((char *)a->data)) {
-                        continue;
-                }
-
-                desktop_file = g_strdup_printf ("%s.desktop", (char *) a->data);
-                g_key_file_load_from_dirs (key_file,
-                                           desktop_file,
-                                           (const gchar**) app_dirs,
-                                           &app_path,
-                                           G_KEY_FILE_NONE,
-                                           NULL);
-
-                if (app_path == NULL) {
-                        g_key_file_load_from_dirs (key_file,
-                                                   desktop_file,
-                                                   (const gchar**) autostart_dirs,
-                                                   &app_path,
-                                                   G_KEY_FILE_NONE,
-                                                   NULL);
-                }
-
-                /* look for gnome vender prefix */
-                if (app_path == NULL) {
-                        g_free (desktop_file);
-                        desktop_file = g_strdup_printf ("gnome-%s.desktop", (char *) a->data);
-
-                        g_key_file_load_from_dirs (key_file,
-                                                   desktop_file,
-                                                   (const gchar**) app_dirs,
-                                                   &app_path,
-                                                   G_KEY_FILE_NONE,
-                                                   NULL);
-                }
-
-                if (app_path == NULL) {
-                        g_key_file_load_from_dirs (key_file,
-                                                   desktop_file,
-                                                   (const gchar**) autostart_dirs,
-                                                   &app_path,
-                                                   G_KEY_FILE_NONE,
-                                                   NULL);
-                }
-
-                if (app_path != NULL) {
-                        GsmApp *app;
-
-                        app = gsm_autostart_app_new (app_path);
-                        if (app != NULL) {
-                                g_debug ("GsmManager: read %s", app_path);
-                                append_app (manager, app);
-                                g_object_unref (app);
-                        } else {
-                                g_warning ("could not read %s", app_path);
-                        }
-                        g_free (app_path);
-                }
-
-                g_free (desktop_file);
-                g_key_file_free (key_file);
-        }
-
-        g_slist_foreach (default_apps, (GFunc) g_free, NULL);
-        g_slist_free (default_apps);
-        g_strfreev (app_dirs);
-}
-
-static void
-append_autostart_apps (GsmManager *manager,
-                       const char *path)
-{
-        GDir       *dir;
-        const char *name;
-
-        g_debug ("GsmManager: *** Adding autostart apps (%s)", path);
-
-        dir = g_dir_open (path, 0, NULL);
-        if (dir == NULL) {
-                return;
-        }
-
-        while ((name = g_dir_read_name (dir))) {
-                GsmApp *app;
-                char   *desktop_file;
-
-                if (!g_str_has_suffix (name, ".desktop")) {
-                        continue;
-                }
-
-                desktop_file = g_build_filename (path, name, NULL);
-
-                app = gsm_autostart_app_new (desktop_file);
-                if (app != NULL) {
-                        g_debug ("GsmManager: read %s\n", desktop_file);
-                        append_app (manager, app);
-                        g_object_unref (app);
-                } else {
-                        g_warning ("could not read %s\n", desktop_file);
-                }
-
-                g_free (desktop_file);
-        }
-
-        g_dir_close (dir);
-}
-
-/* FIXME: need to make sure this only happens once */
-static void
-append_legacy_session_apps (GsmManager *manager,
-                            const char *session_filename)
-{
-        GKeyFile *saved;
-        int num_clients, i;
-
-        saved = g_key_file_new ();
-        if (!g_key_file_load_from_file (saved, session_filename, 0, NULL)) {
-                /* FIXME: error handling? */
-                g_key_file_free (saved);
-                return;
-        }
-
-        num_clients = g_key_file_get_integer (saved,
-                                              "Default",
-                                              "num_clients",
-                                              NULL);
-        for (i = 0; i < num_clients; i++) {
-                GsmApp *app = gsm_resumed_app_new_from_legacy_session (saved, i);
-                if (app != NULL) {
-                        append_app (manager, app);
-                        g_object_unref (app);
-                }
-        }
-
-        g_key_file_free (saved);
-}
-
-static void
-append_saved_session_apps (GsmManager *manager)
-{
-        char *session_filename;
-
-        /* try resuming from the old gnome-session's files */
-        session_filename = g_build_filename (g_get_home_dir (),
-                                             ".gnome2",
-                                             "session",
-                                             NULL);
-        if (g_file_test (session_filename, G_FILE_TEST_EXISTS)) {
-                append_legacy_session_apps (manager, session_filename);
-                g_free (session_filename);
-                return;
-        }
-
-        g_free (session_filename);
-}
-
 static gboolean
 _find_app_provides (const char *id,
                     GsmApp     *app,
@@ -1899,84 +1680,6 @@
         return gsm_app_provides (app, service);
 }
 
-static void
-append_required_apps (GsmManager *manager)
-{
-        GSList      *required_components;
-        GSList      *r;
-        GsmApp      *app;
-        GConfClient *client;
-
-        client = gconf_client_get_default ();
-        required_components = gconf_client_all_entries (client,
-                                                        GSM_GCONF_REQUIRED_COMPONENTS_DIRECTORY,
-                                                        NULL);
-        g_object_unref (client);
-
-        for (r = required_components; r; r = r->next) {
-                GConfEntry *entry;
-                const char *default_provider;
-                const char *service;
-
-                entry = (GConfEntry *) r->data;
-
-                service = strrchr (entry->key, '/');
-                if (service == NULL) {
-                        continue;
-                }
-                service++;
-
-                default_provider = gconf_value_get_string (entry->value);
-                if (default_provider == NULL) {
-                        continue;
-                }
-
-                app = (GsmApp *)gsm_store_find (manager->priv->apps,
-                                                (GsmStoreFunc)_find_app_provides,
-                                                (char *)service);
-                if (app == NULL) {
-                        app = gsm_autostart_app_new (default_provider);
-                        if (app != NULL) {
-                                append_app (manager, app);
-                                g_object_unref (app);
-                        }
-                        /* FIXME: else error */
-                }
-
-                gconf_entry_free (entry);
-        }
-
-        g_slist_free (required_components);
-}
-
-static void
-load_apps (GsmManager *manager)
-{
-        char **autostart_dirs;
-        int    i;
-
-        autostart_dirs = gsm_util_get_autostart_dirs ();
-
-        append_default_apps (manager, autostart_dirs);
-
-        if (manager->priv->failsafe) {
-                goto out;
-        }
-
-        for (i = 0; autostart_dirs[i]; i++) {
-                append_autostart_apps (manager, autostart_dirs[i]);
-        }
-
-        append_saved_session_apps (manager);
-
-        /* We don't do this in the failsafe case, because the default
-         * session should include all requirements anyway. */
-        append_required_apps (manager);
-
- out:
-        g_strfreev (autostart_dirs);
-}
-
 static GObject *
 gsm_manager_constructor (GType                  type,
                          guint                  n_construct_properties,
@@ -1987,8 +1690,6 @@
         manager = GSM_MANAGER (G_OBJECT_CLASS (gsm_manager_parent_class)->constructor (type,
                                                                                        n_construct_properties,
                                                                                        construct_properties));
-        load_apps (manager);
-
         return G_OBJECT (manager);
 }
 
@@ -2950,3 +2651,145 @@
 
         return TRUE;
 }
+
+static void
+append_app (GsmManager *manager,
+            GsmApp     *app)
+{
+        const char *id;
+        const char *app_id;
+        GsmApp     *dup;
+
+        id = gsm_app_peek_id (app);
+        if (IS_STRING_EMPTY (id)) {
+                g_debug ("GsmManager: not adding app: no id");
+                return;
+        }
+
+        dup = (GsmApp *)gsm_store_lookup (manager->priv->apps, id);
+        if (dup != NULL) {
+                g_debug ("GsmManager: not adding app: already added");
+                return;
+        }
+
+        app_id = gsm_app_peek_app_id (app);
+        if (IS_STRING_EMPTY (app_id)) {
+                g_debug ("GsmManager: not adding app: no app-id");
+                return;
+        }
+
+        dup = find_app_for_app_id (manager, app_id);
+        if (dup != NULL) {
+                g_debug ("GsmManager: not adding app: app-id already exists");
+                return;
+        }
+
+        gsm_store_add (manager->priv->apps, id, G_OBJECT (app));
+}
+
+gboolean
+gsm_manager_add_autostart_app (GsmManager *manager,
+                               const char *path,
+                               const char *provides)
+{
+        GsmApp *app;
+
+        g_return_val_if_fail (GSM_IS_MANAGER (manager), FALSE);
+        g_return_val_if_fail (path != NULL, FALSE);
+
+        /* first check to see if service is already provided */
+        if (provides != NULL) {
+                GsmApp *dup;
+
+                dup = (GsmApp *)gsm_store_find (manager->priv->apps,
+                                                (GsmStoreFunc)_find_app_provides,
+                                                (char *)provides);
+                if (dup != NULL) {
+                        g_debug ("GsmManager: service '%s' is already provided", provides);
+                        return FALSE;
+                }
+        }
+
+        app = gsm_autostart_app_new (path);
+        if (app == NULL) {
+                g_warning ("could not read %s", path);
+                return FALSE;
+        }
+
+        g_debug ("GsmManager: read %s", path);
+        append_app (manager, app);
+        g_object_unref (app);
+
+        return TRUE;
+}
+
+gboolean
+gsm_manager_add_autostart_apps_from_dir (GsmManager *manager,
+                                         const char *path)
+{
+        GDir       *dir;
+        const char *name;
+
+        g_return_val_if_fail (GSM_IS_MANAGER (manager), FALSE);
+        g_return_val_if_fail (path != NULL, FALSE);
+
+        g_debug ("GsmManager: *** Adding autostart apps for %s", path);
+
+        dir = g_dir_open (path, 0, NULL);
+        if (dir == NULL) {
+                return FALSE;
+        }
+
+        while ((name = g_dir_read_name (dir))) {
+                char *desktop_file;
+
+                if (!g_str_has_suffix (name, ".desktop")) {
+                        continue;
+                }
+
+                desktop_file = g_build_filename (path, name, NULL);
+                gsm_manager_add_autostart_app (manager, desktop_file, NULL);
+                g_free (desktop_file);
+        }
+
+        g_dir_close (dir);
+
+        return TRUE;
+}
+
+gboolean
+gsm_manager_add_legacy_session_apps (GsmManager *manager,
+                                     const char *path)
+{
+        GKeyFile *saved;
+        int       num_clients;
+        int       i;
+
+        g_return_val_if_fail (GSM_IS_MANAGER (manager), FALSE);
+        g_return_val_if_fail (path != NULL, FALSE);
+
+        saved = g_key_file_new ();
+        if (!g_key_file_load_from_file (saved, path, 0, NULL)) {
+                /* FIXME: error handling? */
+                g_key_file_free (saved);
+                return FALSE;
+        }
+
+        num_clients = g_key_file_get_integer (saved,
+                                              "Default",
+                                              "num_clients",
+                                              NULL);
+        for (i = 0; i < num_clients; i++) {
+                GsmApp *app;
+
+                app = gsm_resumed_app_new_from_legacy_session (saved, i);
+                if (app != NULL) {
+                        append_app (manager, app);
+                        g_object_unref (app);
+                }
+        }
+
+        g_key_file_free (saved);
+
+        return TRUE;
+}

Modified: trunk/gnome-session/gsm-manager.h
==============================================================================
--- trunk/gnome-session/gsm-manager.h	(original)
+++ trunk/gnome-session/gsm-manager.h	Thu Aug 14 18:17:06 2008
@@ -114,6 +114,14 @@
 GsmManager *        gsm_manager_new                            (GsmStore       *client_store,
                                                                 gboolean        failsafe);
 
+gboolean            gsm_manager_add_autostart_app              (GsmManager     *manager,
+                                                                const char     *path,
+                                                                const char     *provides);
+gboolean            gsm_manager_add_autostart_apps_from_dir    (GsmManager     *manager,
+                                                                const char     *path);
+gboolean            gsm_manager_add_legacy_session_apps        (GsmManager     *manager,
+                                                                const char     *path);
+
 void                gsm_manager_start                          (GsmManager     *manager);
 
 

Modified: trunk/gnome-session/main.c
==============================================================================
--- trunk/gnome-session/main.c	(original)
+++ trunk/gnome-session/main.c	Thu Aug 14 18:17:06 2008
@@ -24,6 +24,7 @@
 #include <libintl.h>
 #include <signal.h>
 #include <stdlib.h>
+#include <string.h>
 
 #include <glib/gi18n.h>
 #include <glib/goption.h>
@@ -40,8 +41,13 @@
 #include "gsm-xsmp-server.h"
 #include "gsm-store.h"
 
+#define GSM_GCONF_DEFAULT_SESSION_KEY           "/desktop/gnome/session/default-session"
+#define GSM_GCONF_REQUIRED_COMPONENTS_DIRECTORY "/desktop/gnome/session/required-components"
+
 #define GSM_DBUS_NAME "org.gnome.SessionManager"
 
+#define IS_STRING_EMPTY(x) ((x)==NULL||(x)[0]=='\0')
+
 static gboolean failsafe = FALSE;
 static gboolean show_version = FALSE;
 
@@ -155,6 +161,176 @@
         return TRUE;
 }
 
+static void
+append_default_apps (GsmManager *manager,
+                     char      **autostart_dirs)
+{
+        GSList      *default_apps;
+        GSList      *a;
+        char       **app_dirs;
+        GConfClient *client;
+
+        g_debug ("main: *** Adding default apps");
+
+        app_dirs = gsm_util_get_app_dirs ();
+
+        client = gconf_client_get_default ();
+        default_apps = gconf_client_get_list (client,
+                                              GSM_GCONF_DEFAULT_SESSION_KEY,
+                                              GCONF_VALUE_STRING,
+                                              NULL);
+        g_object_unref (client);
+
+        for (a = default_apps; a; a = a->next) {
+                GKeyFile *key_file;
+                char     *app_path = NULL;
+                char     *desktop_file;
+
+                key_file = g_key_file_new ();
+
+                if (IS_STRING_EMPTY ((char *)a->data)) {
+                        continue;
+                }
+
+                desktop_file = g_strdup_printf ("%s.desktop", (char *) a->data);
+                g_key_file_load_from_dirs (key_file,
+                                           desktop_file,
+                                           (const char**) app_dirs,
+                                           &app_path,
+                                           G_KEY_FILE_NONE,
+                                           NULL);
+
+                if (app_path == NULL) {
+                        g_key_file_load_from_dirs (key_file,
+                                                   desktop_file,
+                                                   (const char**) autostart_dirs,
+                                                   &app_path,
+                                                   G_KEY_FILE_NONE,
+                                                   NULL);
+                }
+
+                /* look for gnome vender prefix */
+                if (app_path == NULL) {
+                        g_free (desktop_file);
+                        desktop_file = g_strdup_printf ("gnome-%s.desktop", (char *) a->data);
+
+                        g_key_file_load_from_dirs (key_file,
+                                                   desktop_file,
+                                                   (const char**) app_dirs,
+                                                   &app_path,
+                                                   G_KEY_FILE_NONE,
+                                                   NULL);
+                }
+
+                if (app_path == NULL) {
+                        g_key_file_load_from_dirs (key_file,
+                                                   desktop_file,
+                                                   (const char**) autostart_dirs,
+                                                   &app_path,
+                                                   G_KEY_FILE_NONE,
+                                                   NULL);
+                }
+
+                if (app_path != NULL) {
+                        gsm_manager_add_autostart_app (manager, app_path, NULL);
+                        g_free (app_path);
+                }
+
+                g_free (desktop_file);
+                g_key_file_free (key_file);
+        }
+
+        g_slist_foreach (default_apps, (GFunc) g_free, NULL);
+        g_slist_free (default_apps);
+        g_strfreev (app_dirs);
+}
+
+static void
+append_saved_session_apps (GsmManager *manager)
+{
+        char *session_filename;
+
+        /* try resuming from the old gnome-session's files */
+        session_filename = g_build_filename (g_get_home_dir (),
+                                             ".gnome2",
+                                             "session",
+                                             NULL);
+        if (g_file_test (session_filename, G_FILE_TEST_EXISTS)) {
+                gsm_manager_add_legacy_session_apps (manager, session_filename);
+                g_free (session_filename);
+                return;
+        }
+
+        g_free (session_filename);
+}
+
+static void
+append_required_apps (GsmManager *manager)
+{
+        GSList      *required_components;
+        GSList      *r;
+        GConfClient *client;
+
+        client = gconf_client_get_default ();
+        required_components = gconf_client_all_entries (client,
+                                                        GSM_GCONF_REQUIRED_COMPONENTS_DIRECTORY,
+                                                        NULL);
+        g_object_unref (client);
+
+        for (r = required_components; r != NULL; r = r->next) {
+                GConfEntry *entry;
+                const char *default_provider;
+                const char *service;
+
+                entry = (GConfEntry *) r->data;
+
+                service = strrchr (entry->key, '/');
+                if (service == NULL) {
+                        continue;
+                }
+                service++;
+
+                default_provider = gconf_value_get_string (entry->value);
+                if (default_provider == NULL) {
+                        continue;
+                }
+
+                gsm_manager_add_autostart_app (manager, default_provider, service);
+
+                gconf_entry_free (entry);
+        }
+
+        g_slist_free (required_components);
+}
+
+static void
+load_apps (GsmManager *manager)
+{
+        char **autostart_dirs;
+        int    i;
+
+        autostart_dirs = gsm_util_get_autostart_dirs ();
+
+        append_default_apps (manager, autostart_dirs);
+
+        if (failsafe) {
+                goto out;
+        }
+
+        for (i = 0; autostart_dirs[i]; i++) {
+                gsm_manager_add_autostart_apps_from_dir (manager, autostart_dirs[i]);
+        }
+
+        append_saved_session_apps (manager);
+
+        /* We don't do this in the failsafe case, because the default
+         * session should include all requirements anyway. */
+        append_required_apps (manager);
+
+ out:
+        g_strfreev (autostart_dirs);
+}
+
 int
 main (int argc, char **argv)
 {
@@ -211,6 +387,7 @@
         acquire_name ();
 
         manager = gsm_manager_new (client_store, failsafe);
+        load_apps (manager);
 
         gsm_xsmp_server_start (xsmp_server);
         gsm_manager_start (manager);



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