2 * Copyright (C) 2010 Robert Ancell.
3 * Author: Robert Ancell <robert.ancell@canonical.com>
5 * This program is free software: you can redistribute it and/or modify it under
6 * the terms of the GNU General Public License as published by the Free Software
7 * Foundation, either version 3 of the License, or (at your option) any later
8 * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
13 #include <gio/gdesktopappinfo.h>
15 #include "session-manager.h"
16 #include "session-manager-glue.h"
18 struct SessionManagerPrivate
20 gboolean sessions_loaded;
24 G_DEFINE_TYPE (SessionManager, session_manager, G_TYPE_OBJECT);
27 session_manager_new (void)
29 return g_object_new (SESSION_MANAGER_TYPE, NULL);
33 session_free (Session *session)
35 g_free (session->key);
36 g_free (session->name);
37 g_free (session->comment);
38 g_free (session->exec);
43 load_sessions (SessionManager *manager)
49 if (manager->priv->sessions_loaded)
52 directory = g_dir_open (XSESSIONS_DIR, 0, &error);
54 g_warning ("Failed to open sessions directory: %s", error->message);
55 g_clear_error (&error);
59 key_file = g_key_file_new ();
62 const gchar *filename;
66 filename = g_dir_read_name (directory);
70 if (!g_str_has_suffix (filename, ".desktop"))
73 key = g_strndup (filename, strlen (filename) - strlen (".desktop"));
74 path = g_build_filename (XSESSIONS_DIR, filename, NULL);
75 g_debug ("Loading session %s", path);
77 result = g_key_file_load_from_file (key_file, path, G_KEY_FILE_NONE, &error);
79 g_warning ("Failed to load session file %s: %s:", path, error->message);
80 g_clear_error (&error);
84 GDesktopAppInfo *desktop_file;
86 desktop_file = g_desktop_app_info_new_from_keyfile (key_file);
88 if (g_app_info_should_show (G_APP_INFO (desktop_file)))
92 session = g_malloc0 (sizeof (Session));
93 session->key = g_strdup (key);
94 session->name = g_strdup (g_app_info_get_name (G_APP_INFO (desktop_file)));
95 session->comment = g_strdup (g_app_info_get_display_name (G_APP_INFO (desktop_file)));
96 session->exec = g_strdup (g_app_info_get_executable (G_APP_INFO (desktop_file)));
98 if (session->name && session->comment && session->exec)
100 g_debug ("Loaded session %s (%s, %s)", session->key, session->name, session->comment);
101 manager->priv->sessions = g_list_append (manager->priv->sessions, session);
105 g_warning ("Invalid session %s: %s", path, error->message);
106 session_free (session);
108 g_clear_error (&error);
116 g_dir_close (directory);
117 g_key_file_free (key_file);
119 manager->priv->sessions_loaded = TRUE;
123 session_manager_get_session (SessionManager *manager, const gchar *key)
127 load_sessions (manager);
129 for (link = manager->priv->sessions; link; link = link->next)
131 Session *session = link->data;
132 if (g_str_equal (session->key, key))
139 #define TYPE_SESSION dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID)
142 session_manager_get_sessions (SessionManager *manager, GPtrArray **sessions, GError *error)
146 load_sessions (manager);
148 *sessions = g_ptr_array_sized_new (g_list_length (manager->priv->sessions));
149 for (link = manager->priv->sessions; link; link = link->next)
151 Session *session = link->data;
152 GValue value = { 0 };
154 g_value_init (&value, TYPE_SESSION);
155 g_value_take_boxed (&value, dbus_g_type_specialized_construct (TYPE_SESSION));
156 dbus_g_type_struct_set (&value, 0, session->key, 1, session->name, 2, session->comment, G_MAXUINT);
157 g_ptr_array_add (*sessions, g_value_get_boxed (&value));
164 session_manager_init (SessionManager *manager)
166 manager->priv = G_TYPE_INSTANCE_GET_PRIVATE (manager, SESSION_MANAGER_TYPE, SessionManagerPrivate);
170 session_manager_class_init (SessionManagerClass *klass)
172 g_type_class_add_private (klass, sizeof (SessionManagerPrivate));
174 dbus_g_object_type_install_info (SESSION_MANAGER_TYPE, &dbus_glib_session_manager_object_info);