]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blobdiff - liblightdm-gobject/session.c
Revert r2392 - it seems to have broken ABI in liblightdm-gobject
[sojka/lightdm.git] / liblightdm-gobject / session.c
index b6cb4d03ca6272fa6b9768d1e31124cfcf0af9b5..7549e0bb9cbdd64bd210418ac09f6623156d4058 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 2010 Robert Ancell.
  * Author: Robert Ancell <robert.ancell@canonical.com>
- * 
+ *
  * This library is free software; you can redistribute it and/or modify it under
  * the terms of the GNU Lesser General Public License as published by the Free
  * Software Foundation; either version 2 or version 3 of the License.
 #include <string.h>
 #include <gio/gdesktopappinfo.h>
 
+#include "configuration.h"
 #include "lightdm/session.h"
 
 enum {
-    PROP_0,
-    PROP_KEY,
+    PROP_KEY = 1,
     PROP_NAME,
     PROP_COMMENT
 };
@@ -23,6 +23,7 @@ enum {
 typedef struct
 {
     gchar *key;
+    gchar *type;
     gchar *name;
     gchar *comment;
 } LightDMSessionPrivate;
@@ -35,7 +36,7 @@ static gboolean have_sessions = FALSE;
 static GList *local_sessions = NULL;
 static GList *remote_sessions = NULL;
 
-static gint 
+static gint
 compare_session (gconstpointer a, gconstpointer b)
 {
     LightDMSessionPrivate *priv_a = GET_PRIVATE (a);
@@ -44,13 +45,13 @@ compare_session (gconstpointer a, gconstpointer b)
 }
 
 static LightDMSession *
-load_session (GKeyFile *key_file, const gchar *key)
+load_session (GKeyFile *key_file, const gchar *key, const gchar *default_type)
 {
-    gchar *domain, *name;
+    gchar *domain, *name, *type;
     LightDMSession *session;
     LightDMSessionPrivate *priv;
     gchar *try_exec;
-  
+
     if (g_key_file_get_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY, NULL) ||
         g_key_file_get_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_HIDDEN, NULL))
         return NULL;
@@ -85,12 +86,19 @@ load_session (GKeyFile *key_file, const gchar *key)
         g_free (full_path);
     }
 
+    type = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, "X-LightDM-Session-Type", NULL);
+    if (!type)
+        type = strdup (default_type);
+
     session = g_object_new (LIGHTDM_TYPE_SESSION, NULL);
     priv = GET_PRIVATE (session);
 
     g_free (priv->key);
     priv->key = g_strdup (key);
 
+    g_free (priv->type);
+    priv->type = type;
+
     g_free (priv->name);
     priv->name = name;
 
@@ -105,13 +113,13 @@ load_session (GKeyFile *key_file, const gchar *key)
 }
 
 static GList *
-load_sessions_dir (GList *sessions, const gchar *sessions_dir)
+load_sessions_dir (GList *sessions, const gchar *sessions_dir, const gchar *default_type)
 {
     GDir *directory;
     GError *error = NULL;
 
     directory = g_dir_open (sessions_dir, 0, &error);
-    if (error)
+    if (error && !g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT))
         g_warning ("Failed to open sessions directory: %s", error->message);
     g_clear_error (&error);
     if (!directory)
@@ -145,7 +153,7 @@ load_sessions_dir (GList *sessions, const gchar *sessions_dir)
             LightDMSession *session;
 
             key = g_strndup (filename, strlen (filename) - strlen (".desktop"));
-            session = load_session (key_file, key);
+            session = load_session (key_file, key, default_type);
             if (session)
             {
                 g_debug ("Loaded session %s (%s, %s)", path, GET_PRIVATE (session)->name, GET_PRIVATE (session)->comment);
@@ -161,7 +169,7 @@ load_sessions_dir (GList *sessions, const gchar *sessions_dir)
     }
 
     g_dir_close (directory);
-  
+
     return sessions;
 }
 
@@ -173,22 +181,27 @@ load_sessions (const gchar *sessions_dir)
     int i;
 
     dirs = g_strsplit (sessions_dir, ":", -1);
-    for (i = 0; dirs[i]; i++)
-        sessions = load_sessions_dir (sessions, dirs[i]);
+    for (i = 0; dirs[i]; i++) 
+    {
+        const gchar *default_type = "x";
+
+        if (strcmp (dirs[i], WAYLAND_SESSIONS_DIR) == 0)
+            default_type = "wayland";
+
+        sessions = load_sessions_dir (sessions, dirs[i], default_type);
+    }
     g_strfreev (dirs);
-  
+
     return sessions;
 }
 
 static void
 update_sessions (void)
 {
-    GKeyFile *config_key_file = NULL;
-    gchar *config_path = NULL;
     gchar *sessions_dir;
     gchar *remote_sessions_dir;
-    gboolean result;
-    GError *error = NULL;
+    gchar *value;
 
     if (have_sessions)
         return;
@@ -197,33 +210,21 @@ update_sessions (void)
     remote_sessions_dir = g_strdup (REMOTE_SESSIONS_DIR);
 
     /* Use session directory from configuration */
-    /* FIXME: This should be sent in the greeter connection */
-    config_path = g_build_filename (CONFIG_DIR, "lightdm.conf", NULL);
-    config_key_file = g_key_file_new ();
-    result = g_key_file_load_from_file (config_key_file, config_path, G_KEY_FILE_NONE, &error);
-    if (error)
-        g_warning ("Failed to open configuration file: %s", error->message);
-    g_clear_error (&error);
-    if (result)
+    config_load_from_standard_locations (config_get_instance (), NULL, NULL);
+
+    value = config_get_string (config_get_instance (), "LightDM", "sessions-directory");
+    if (value)
     {
-        gchar *value;
-      
-        value = g_key_file_get_string (config_key_file, "LightDM", "sessions-directory", NULL);
-        if (value)
-        {
-            g_free (sessions_dir);
-            sessions_dir = value;
-        }
+        g_free (sessions_dir);
+        sessions_dir = value;
+    }
 
-        value = g_key_file_get_string (config_key_file, "LightDM", "remote-sessions-directory", NULL);
-        if (value)
-        {
-            g_free (remote_sessions_dir);
-            remote_sessions_dir = value;
-        }
+    value = config_get_string (config_get_instance (), "LightDM", "remote-sessions-directory");
+    if (value)
+    {
+        g_free (remote_sessions_dir);
+        remote_sessions_dir = value;
     }
-    g_key_file_free (config_key_file);
-    g_free (config_path);
 
     local_sessions = load_sessions (sessions_dir);
     remote_sessions = load_sessions (remote_sessions_dir);
@@ -265,9 +266,9 @@ lightdm_get_remote_sessions (void)
 /**
  * lightdm_session_get_key:
  * @session: A #LightDMSession
- * 
+ *
  * Get the key for a session
- * 
+ *
  * Return value: The session key
  **/
 const gchar *
@@ -277,12 +278,27 @@ lightdm_session_get_key (LightDMSession *session)
     return GET_PRIVATE (session)->key;
 }
 
+/**
+ * lightdm_session_get_session_type:
+ * @session: A #LightDMSession
+ *
+ * Get the type a session
+ *
+ * Return value: The session type, e.g. x or mir
+ **/
+const gchar *
+lightdm_session_get_session_type (LightDMSession *session)
+{
+    g_return_val_if_fail (LIGHTDM_IS_SESSION (session), NULL);
+    return GET_PRIVATE (session)->type;
+}
+
 /**
  * lightdm_session_get_name:
  * @session: A #LightDMSession
- * 
+ *
  * Get the name for a session
- * 
+ *
  * Return value: The session name
  **/
 const gchar *
@@ -295,9 +311,9 @@ lightdm_session_get_name (LightDMSession *session)
 /**
  * lightdm_session_get_comment:
  * @session: A #LightDMSession
- * 
+ *
  * Get the comment for a session
- * 
+ *
  * Return value: The session comment
  **/
 const gchar *
@@ -314,18 +330,18 @@ lightdm_session_init (LightDMSession *session)
 
 static void
 lightdm_session_set_property (GObject      *object,
-                          guint         prop_id,
-                          const GValue *value,
-                          GParamSpec   *pspec)
+                              guint         prop_id,
+                              const GValue *value,
+                              GParamSpec   *pspec)
 {
     G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 }
 
 static void
 lightdm_session_get_property (GObject    *object,
-                          guint       prop_id,
-                          GValue     *value,
-                          GParamSpec *pspec)
+                              guint       prop_id,
+                              GValue     *value,
+                              GParamSpec *pspec)
 {
     LightDMSession *self;
 
@@ -354,6 +370,7 @@ lightdm_session_finalize (GObject *object)
     LightDMSessionPrivate *priv = GET_PRIVATE (self);
 
     g_free (priv->key);
+    g_free (priv->type);
     g_free (priv->name);
     g_free (priv->comment);
 }
@@ -362,7 +379,7 @@ static void
 lightdm_session_class_init (LightDMSessionClass *klass)
 {
     GObjectClass *object_class = G_OBJECT_CLASS (klass);
-  
+
     g_type_class_add_private (klass, sizeof (LightDMSessionPrivate));
 
     object_class->set_property = lightdm_session_set_property;