]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Merge with trunk
authorRobert Ancell <robert.ancell@canonical.com>
Wed, 24 Jul 2013 05:58:34 +0000 (17:58 +1200)
committerRobert Ancell <robert.ancell@canonical.com>
Wed, 24 Jul 2013 05:58:34 +0000 (17:58 +1200)
45 files changed:
.bzrignore
doc/lightdm-gobject-1-sections.txt
doc/tmpl/session.sgml
liblightdm-gobject/lightdm/session.h
liblightdm-gobject/session.c
liblightdm-qt/QLightDM/sessionsmodel.h
liblightdm-qt/sessionsmodel.cpp
src/Makefile.am
src/display-server.c
src/display-server.h
src/greeter.c
src/greeter.h
src/mir-server.c [new file with mode: 0644]
src/mir-server.h [new file with mode: 0644]
src/seat-unity.c
src/seat-xdmcp-session.c
src/seat-xlocal.c
src/seat-xremote.c
src/seat-xvnc.c
src/seat.c
src/seat.h
src/session-config.c
src/session-config.h
src/session.c
src/session.h
src/x-greeter.c [deleted file]
src/x-greeter.h [deleted file]
src/x-server.c
src/x-session.c [deleted file]
src/x-session.h [deleted file]
tests/Makefile.am
tests/data/greeters/test-mir-greeter.desktop [new file with mode: 0644]
tests/data/sessions/mir.desktop [new file with mode: 0644]
tests/scripts/mir-autologin.conf [new file with mode: 0644]
tests/scripts/mir-greeter-mir-session.conf [new file with mode: 0644]
tests/scripts/mir-greeter-x-session.conf [new file with mode: 0644]
tests/scripts/mir-session-x-greeter.conf [new file with mode: 0644]
tests/scripts/unity-mir-login.conf [new file with mode: 0644]
tests/src/Makefile.am
tests/src/test-mir-greeter.c [new file with mode: 0644]
tests/test-mir-autologin [new file with mode: 0755]
tests/test-mir-greeter-mir-session [new file with mode: 0755]
tests/test-mir-greeter-x-session [new file with mode: 0755]
tests/test-mir-session-x-greeter [new file with mode: 0755]
tests/test-unity-mir-login [new file with mode: 0755]

index 359e48d503844d0d5665711fe19f9807cb321c6d..8c735385a1095032b17843dbbd38bb475de6bdd0 100644 (file)
@@ -69,6 +69,7 @@ tests/src/initctl
 tests/src/plymouth
 tests/src/test-gobject-greeter
 tests/src/test-greeter-wrapper
+tests/src/test-mir-greeter
 tests/src/test-qt4-greeter
 tests/src/test-qt5-greeter
 tests/src/test-runner
index 501587f93a1331a9f38aff6a89c77924e31f4b16..89875f49fcbf029df8f5d0613c1526724db58c14 100644 (file)
@@ -65,6 +65,7 @@ lightdm_layout_get_type
 lightdm_get_remote_sessions
 lightdm_get_sessions
 lightdm_session_get_key
+lightdm_session_get_session_type
 lightdm_session_get_name
 lightdm_session_get_comment
 <SUBSECTION Standard>
index bb75112a1c1db88036d033492466c696e60deb06..351a440435e9e66a7baecb23716c422929eae46c 100644 (file)
@@ -47,6 +47,15 @@ Object containing information about a session type. #LightDMSession objects are
 @Returns: 
 
 
+<!-- ##### FUNCTION lightdm_session_get_session_type ##### -->
+<para>
+
+</para>
+
+@session: 
+@Returns: 
+
+
 <!-- ##### FUNCTION lightdm_session_get_name ##### -->
 <para>
 
index 5732117f79ba4c25255ead4c6743bf2b632717e8..13ddcd9f877bcc8d97be6b91c5e400170906af56 100644 (file)
@@ -48,6 +48,8 @@ GList *lightdm_get_remote_sessions (void);
 
 const gchar *lightdm_session_get_key (LightDMSession *session);
 
+const gchar *lightdm_session_get_session_type (LightDMSession *session);
+
 const gchar *lightdm_session_get_name (LightDMSession *session);
 
 const gchar *lightdm_session_get_comment (LightDMSession *session);
index b6cb4d03ca6272fa6b9768d1e31124cfcf0af9b5..82fc75ab355c6c229997c4c7e21792c0a422f3f6 100644 (file)
@@ -23,6 +23,7 @@ enum {
 typedef struct
 {
     gchar *key;
+    gchar *type;
     gchar *name;
     gchar *comment;
 } LightDMSessionPrivate;
@@ -34,6 +35,7 @@ G_DEFINE_TYPE (LightDMSession, lightdm_session, G_TYPE_OBJECT);
 static gboolean have_sessions = FALSE;
 static GList *local_sessions = NULL;
 static GList *remote_sessions = NULL;
+static GList *mir_sessions = NULL;
 
 static gint 
 compare_session (gconstpointer a, gconstpointer b)
@@ -46,7 +48,7 @@ compare_session (gconstpointer a, gconstpointer b)
 static LightDMSession *
 load_session (GKeyFile *key_file, const gchar *key)
 {
-    gchar *domain, *name;
+    gchar *type, *domain, *name;
     LightDMSession *session;
     LightDMSessionPrivate *priv;
     gchar *try_exec;
@@ -55,6 +57,10 @@ load_session (GKeyFile *key_file, const gchar *key)
         g_key_file_get_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_HIDDEN, NULL))
         return NULL;
 
+    type = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, "X-LightDM-Session-Type", NULL);
+    if (!type)
+        type = "x";
+
 #ifdef G_KEY_FILE_DESKTOP_KEY_GETTEXT_DOMAIN
     domain = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_GETTEXT_DOMAIN, NULL);
 #else
@@ -91,6 +97,9 @@ load_session (GKeyFile *key_file, const gchar *key)
     g_free (priv->key);
     priv->key = g_strdup (key);
 
+    g_free (priv->type);
+    priv->type = g_strdup (type);
+
     g_free (priv->name);
     priv->name = name;
 
@@ -187,6 +196,7 @@ update_sessions (void)
     gchar *config_path = NULL;
     gchar *sessions_dir;
     gchar *remote_sessions_dir;
+    gchar *mir_sessions_dir;
     gboolean result;
     GError *error = NULL;
 
@@ -277,6 +287,21 @@ 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
@@ -354,6 +379,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);
 }
index 77c81fb215995f3cc9396f72395205867bc858f6..dd200990c88c305d8cd936b5535552c4a335350e 100644 (file)
@@ -27,7 +27,8 @@ namespace QLightDM {
             //name is exposed as Qt::DisplayRole
             //comment is exposed as Qt::TooltipRole
             KeyRole = Qt::UserRole,
-            IdRole = KeyRole /** Deprecated */
+            IdRole = KeyRole, /** Deprecated */
+            TypeRole
         };
 
         enum SessionType {
index 9ad335f96f439195256cc6926fd84bde59fd6b95..8771c799a643b1a7ecae94af1c2c8d5758cece37 100644 (file)
@@ -21,6 +21,7 @@ class SessionItem
 {
 public:
     QString key;
+    QString type;
     QString name;
     QString comment;
 };
@@ -71,6 +72,7 @@ void SessionsModelPrivate::loadSessions(SessionsModel::SessionType sessionType)
 
        SessionItem session;
        session.key = QString::fromUtf8(lightdm_session_get_key(ldmSession));
+       session.type = QString::fromUtf8(lightdm_session_get_session_type(ldmSession));
        session.name = QString::fromUtf8(lightdm_session_get_name(ldmSession));
        session.comment = QString::fromUtf8(lightdm_session_get_comment(ldmSession));
 
@@ -137,6 +139,8 @@ QVariant SessionsModel::data(const QModelIndex &index, int role) const
     switch (role) {
     case SessionsModel::KeyRole:
         return d->items[row].key;
+    case SessionsModel::TypeRole:
+        return d->items[row].type;
     case Qt::DisplayRole:
         return d->items[row].name;
     case Qt::ToolTipRole:
index 9548058f7785551340c1448d627227d48a0796de..1be9a5d7177df5db2e54ef0a7b636005a4b04f00 100644 (file)
@@ -20,6 +20,8 @@ lightdm_SOURCES = \
        lightdm.c \
        login1.c \
        login1.h \
+       mir-server.c \
+       mir-server.h \
        plymouth.c \
        plymouth.h \
        privileges.c \
@@ -50,8 +52,6 @@ lightdm_SOURCES = \
        vt.h \
        x-authority.c \
        x-authority.h \
-       x-greeter.c \
-       x-greeter.h \
        x-server-local.c \
        x-server-local.h \
        x-server-remote.c \
@@ -60,8 +60,6 @@ lightdm_SOURCES = \
        x-server-xvnc.h \
        x-server.c \
        x-server.h \
-       x-session.c \
-       x-session.h \
        xdmcp-protocol.c \
        xdmcp-protocol.h \
        xdmcp-server.c \
index 8afc973de63b229f76932781b0532b8db2e4cdee..fd9dac4f94c5ad623ce2443d687c64c81f71fbcb 100644 (file)
@@ -75,6 +75,17 @@ display_server_real_start (DisplayServer *server)
     return TRUE;
 }
 
+void
+display_server_setup_session (DisplayServer *server, Session *session)
+{
+    return DISPLAY_SERVER_GET_CLASS (server)->setup_session (server, session);
+}
+
+static void
+display_server_real_setup_session (DisplayServer *server, Session *session)
+{
+}
+
 void
 display_server_stop (DisplayServer *server)
 {
@@ -111,6 +122,7 @@ display_server_class_init (DisplayServerClass *klass)
 {
     klass->get_vt = display_server_real_get_vt;
     klass->start = display_server_real_start;
+    klass->setup_session = display_server_real_setup_session;
     klass->stop = display_server_real_stop;
 
     g_type_class_add_private (klass, sizeof (DisplayServerPrivate));
index dbd8a67be0a3bfc2d810251e7ea93befd0288e1b..d8551067f97a1d0b91cfa6cae8bbbcf28faca8f5 100644 (file)
 
 #include <glib-object.h>
 
+typedef struct DisplayServer DisplayServer;
+
+#include "session.h"
+
 G_BEGIN_DECLS
 
 #define DISPLAY_SERVER_TYPE (display_server_get_type())
@@ -23,11 +27,11 @@ G_BEGIN_DECLS
 
 typedef struct DisplayServerPrivate DisplayServerPrivate;
 
-typedef struct
+struct DisplayServer
 {
     GObject               parent_instance;
     DisplayServerPrivate *priv;
-} DisplayServer;
+};
 
 typedef struct
 {
@@ -38,6 +42,7 @@ typedef struct
 
     gint (*get_vt)(DisplayServer *server);
     gboolean (*start)(DisplayServer *server);
+    void (*setup_session)(DisplayServer *server, Session *session);
     void (*stop)(DisplayServer *server);
 } DisplayServerClass;
 
@@ -51,6 +56,8 @@ gint display_server_get_vt (DisplayServer *server);
 
 gboolean display_server_start (DisplayServer *server);
 
+void display_server_setup_session (DisplayServer *server, Session *session);
+
 void display_server_stop (DisplayServer *server);
 
 gboolean display_server_get_is_stopping (DisplayServer *server);
index 6a796b70280d698a65441ef7d98ef01c3ceb1251..52bf5987e16f7e9242f4716540a9634b1317d611 100644 (file)
@@ -94,6 +94,12 @@ typedef enum
 
 static gboolean read_cb (GIOChannel *source, GIOCondition condition, gpointer data);
 
+Greeter *
+greeter_new (void)
+{
+    return g_object_new (GREETER_TYPE, NULL);
+}
+
 void
 greeter_set_pam_services (Greeter *greeter, const gchar *pam_service, const gchar *autologin_pam_service)
 {
index aa9fbc8ea1dafa0309d9969d812c49bc185729b6..db60e3c24a29098f6e92c4868b4187897e87c6d2 100644 (file)
@@ -40,6 +40,8 @@ typedef struct
 
 GType greeter_get_type (void);
 
+Greeter *greeter_new (void);
+
 void greeter_set_pam_services (Greeter *greeter, const gchar *pam_service, const gchar *autologin_pam_service);
 
 void greeter_set_allow_guest (Greeter *greeter, gboolean allow_guest);
diff --git a/src/mir-server.c b/src/mir-server.c
new file mode 100644 (file)
index 0000000..9a2973d
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2010-2011 Robert Ancell.
+ * Author: Robert Ancell <robert.ancell@canonical.com>
+ * 
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
+ * license.
+ */
+
+#include <string.h>
+
+#include "mir-server.h"
+
+struct MirServerPrivate
+{
+    /* VT to run on */
+    gint vt;
+};
+
+G_DEFINE_TYPE (MirServer, mir_server, DISPLAY_SERVER_TYPE);
+
+MirServer *mir_server_new (void)
+{
+    return g_object_new (MIR_SERVER_TYPE, NULL);  
+}
+
+static gint
+mir_server_local_get_vt (DisplayServer *server)
+{
+    g_return_val_if_fail (server != NULL, 0);
+    return MIR_SERVER (server)->priv->vt;
+}
+
+static gboolean
+mir_server_start (DisplayServer *display_server)
+{
+    return DISPLAY_SERVER_CLASS (mir_server_parent_class)->start (display_server);
+}
+
+static void
+mir_server_setup_session (DisplayServer *display_server, Session *session)
+{
+}
+
+static void
+mir_server_init (MirServer *server)
+{
+    server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, MIR_SERVER_TYPE, MirServerPrivate);
+    server->priv->vt = -1;
+}
+
+static void
+mir_server_finalize (GObject *object)
+{
+    G_OBJECT_CLASS (mir_server_parent_class)->finalize (object);
+}
+
+static void
+mir_server_class_init (MirServerClass *klass)
+{
+    GObjectClass *object_class = G_OBJECT_CLASS (klass);
+    DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass);
+
+    display_server_class->get_vt = mir_server_local_get_vt;
+    display_server_class->start = mir_server_start;
+    display_server_class->setup_session = mir_server_setup_session;
+    object_class->finalize = mir_server_finalize;
+
+    g_type_class_add_private (klass, sizeof (MirServerPrivate));
+}
diff --git a/src/mir-server.h b/src/mir-server.h
new file mode 100644 (file)
index 0000000..bf90d97
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2010-2011 Robert Ancell.
+ * Author: Robert Ancell <robert.ancell@canonical.com>
+ * 
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
+ * license.
+ */
+
+#ifndef MIR_SERVER_H_
+#define MIR_SERVER_H_
+
+#include <glib-object.h>
+#include "display-server.h"
+
+G_BEGIN_DECLS
+
+#define MIR_SERVER_TYPE (mir_server_get_type())
+#define MIR_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MIR_SERVER_TYPE, MirServer))
+#define MIR_SERVER_CLASS(klass)   (G_TYPE_CHECK_CLASS_CAST ((klass), MIR_SERVER_TYPE, MirServerClass))
+#define MIR_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MIR_SERVER_TYPE, MirServerClass))
+#define IS_MIR_SERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MIR_SERVER_TYPE))
+
+typedef struct MirServerPrivate MirServerPrivate;
+
+typedef struct
+{
+    DisplayServer     parent_instance;
+    MirServerPrivate *priv;
+} MirServer;
+
+typedef struct
+{
+    DisplayServerClass parent_class;
+} MirServerClass;
+
+GType mir_server_get_type (void);
+
+MirServer *mir_server_new (void);
+
+G_END_DECLS
+
+#endif /* MIR_SERVER_H_ */
index 3e18735f2fb79bb236bcf617cb5811246482d3ca..766faceef8393a11e6f9bf3714a42df3c65206d2 100644 (file)
@@ -17,8 +17,7 @@
 #include "seat-unity.h"
 #include "configuration.h"
 #include "x-server-local.h"
-#include "x-greeter.h"
-#include "x-session.h"
+#include "mir-server.h"
 #include "vt.h"
 #include "plymouth.h"
 
@@ -396,7 +395,7 @@ seat_unity_start (Seat *seat)
 }
 
 static DisplayServer *
-seat_unity_create_display_server (Seat *seat)
+create_x_server (Seat *seat)
 {
     XServerLocal *x_server;
     const gchar *command = NULL, *layout = NULL, *config_file = NULL, *xdmcp_manager = NULL, *key_name = NULL;
@@ -479,26 +478,40 @@ seat_unity_create_display_server (Seat *seat)
     return DISPLAY_SERVER (x_server);
 }
 
+static DisplayServer *
+seat_unity_create_display_server (Seat *seat, const gchar *session_type)
+{  
+    if (strcmp (session_type, "x") == 0)
+        return create_x_server (seat);
+    else if (strcmp (session_type, "mir") == 0)
+        return DISPLAY_SERVER (mir_server_new ());
+    else
+    {
+        g_warning ("Can't create unsupported display server '%s'", session_type);
+        return NULL;
+    }
+}
+
 static Greeter *
 seat_unity_create_greeter_session (Seat *seat)
 {
-    XGreeter *greeter_session;
+    Greeter *greeter_session;
 
-    greeter_session = x_greeter_new ();
+    greeter_session = greeter_new ();
     session_set_env (SESSION (greeter_session), "XDG_SEAT", "seat0");
 
-    return GREETER (greeter_session);
+    return greeter_session;
 }
 
 static Session *
 seat_unity_create_session (Seat *seat)
 {
-    XSession *session;
+    Session *session;
 
-    session = x_session_new ();
-    session_set_env (SESSION (session), "XDG_SEAT", "seat0");
+    session = session_new ();
+    session_set_env (session, "XDG_SEAT", "seat0");
 
-    return SESSION (session);
+    return session;
 }
 
 static void
index 479aad6f3bd4b7ff6b266e50c12fd2069a991a0a..b4b268555c7cc8c5e92cc0c8be0239ba6fcbe507 100644 (file)
@@ -13,8 +13,6 @@
 
 #include "seat-xdmcp-session.h"
 #include "x-server-remote.h"
-#include "x-greeter.h"
-#include "x-session.h"
 
 struct SeatXDMCPSessionPrivate
 {
@@ -36,12 +34,18 @@ seat_xdmcp_session_new (XDMCPSession *session)
 }
 
 static DisplayServer *
-seat_xdmcp_session_create_display_server (Seat *seat)
+seat_xdmcp_session_create_display_server (Seat *seat, const gchar *session_type)
 {
     XAuthority *authority;
     gchar *host;
     XServerRemote *x_server;
 
+    if (strcmp (session_type, "x") != 0)
+    {
+        g_warning ("XDMCP seat only supports X display servers, not '%s'", session_type);
+        return NULL;
+    }
+
     authority = xdmcp_session_get_authority (SEAT_XDMCP_SESSION (seat)->priv->session);
     host = g_inet_address_to_string (xdmcp_session_get_address (SEAT_XDMCP_SESSION (seat)->priv->session));
     x_server = x_server_remote_new (host, xdmcp_session_get_display_number (SEAT_XDMCP_SESSION (seat)->priv->session), authority);
@@ -50,18 +54,6 @@ seat_xdmcp_session_create_display_server (Seat *seat)
     return DISPLAY_SERVER (x_server);
 }
 
-static Greeter *
-seat_xdmcp_session_create_greeter_session (Seat *seat)
-{
-    return GREETER (x_greeter_new ());
-}
-
-static Session *
-seat_xdmcp_session_create_session (Seat *seat)
-{
-    return SESSION (x_session_new ());
-}
-
 static void
 seat_xdmcp_session_init (SeatXDMCPSession *seat)
 {
@@ -87,8 +79,6 @@ seat_xdmcp_session_class_init (SeatXDMCPSessionClass *klass)
     GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
     seat_class->create_display_server = seat_xdmcp_session_create_display_server;
-    seat_class->create_greeter_session = seat_xdmcp_session_create_greeter_session;
-    seat_class->create_session = seat_xdmcp_session_create_session;
     object_class->finalize = seat_xdmcp_session_finalize;
 
     g_type_class_add_private (klass, sizeof (SeatXDMCPSessionPrivate));
index f33607c20f8e3391bf42c64dd68e3ebaa2ec5489..3599c53d736b463f63a49daf9837e0eaea78d3a4 100644 (file)
 #include "seat-xlocal.h"
 #include "configuration.h"
 #include "x-server-local.h"
-#include "x-greeter.h"
-#include "x-session.h"
+#include "mir-server.h"
 #include "vt.h"
 
 G_DEFINE_TYPE (SeatXLocal, seat_xlocal, SEAT_TYPE);
 
+static gboolean
+seat_xlocal_get_start_local_sessions (Seat *seat)
+{
+    return !seat_get_string_property (seat, "xdmcp-manager");
+}
+
 static void
 seat_xlocal_setup (Seat *seat)
 {
@@ -29,7 +34,7 @@ seat_xlocal_setup (Seat *seat)
 }
 
 static DisplayServer *
-seat_xlocal_create_display_server (Seat *seat)
+create_x_server (Seat *seat)
 {
     XServerLocal *x_server;
     const gchar *command = NULL, *layout = NULL, *config_file = NULL, *xdmcp_manager = NULL, *key_name = NULL;
@@ -106,26 +111,40 @@ seat_xlocal_create_display_server (Seat *seat)
     return DISPLAY_SERVER (x_server);
 }
 
+static DisplayServer *
+seat_xlocal_create_display_server (Seat *seat, const gchar *session_type)
+{  
+    if (strcmp (session_type, "x") == 0)
+        return create_x_server (seat);
+    else if (strcmp (session_type, "mir") == 0)
+        return DISPLAY_SERVER (mir_server_new ());
+    else
+    {
+        g_warning ("Can't create unsupported display server '%s'", session_type);
+        return NULL;
+    }
+}
+
 static Greeter *
 seat_xlocal_create_greeter_session (Seat *seat)
 {
-    XGreeter *greeter_session;
+    Greeter *greeter_session;
 
-    greeter_session = x_greeter_new ();
+    greeter_session = SEAT_CLASS (seat_xlocal_parent_class)->create_greeter_session (seat);
     session_set_env (SESSION (greeter_session), "XDG_SEAT", "seat0");
 
-    return GREETER (greeter_session);
+    return greeter_session;
 }
 
 static Session *
 seat_xlocal_create_session (Seat *seat)
 {
-    XSession *session;
+    Session *session;
 
-    session = x_session_new ();
+    session = SEAT_CLASS (seat_xlocal_parent_class)->create_session (seat);
     session_set_env (SESSION (session), "XDG_SEAT", "seat0");
 
-    return SESSION (session);
+    return session;
 }
 
 static void
@@ -182,6 +201,7 @@ seat_xlocal_class_init (SeatXLocalClass *klass)
 {
     SeatClass *seat_class = SEAT_CLASS (klass);
 
+    seat_class->get_start_local_sessions = seat_xlocal_get_start_local_sessions;
     seat_class->setup = seat_xlocal_setup;
     seat_class->create_display_server = seat_xlocal_create_display_server;
     seat_class->create_greeter_session = seat_xlocal_create_greeter_session;
index dcc356822bf985585cca2ce39d5ea95fb75125e5..0e60717fa7686cc61e4f5f08632bbe3ea80d618b 100644 (file)
@@ -14,8 +14,6 @@
 #include "seat-xremote.h"
 #include "configuration.h"
 #include "x-server-remote.h"
-#include "x-greeter.h"
-#include "x-session.h"
 
 G_DEFINE_TYPE (SeatXRemote, seat_xremote, SEAT_TYPE);
 
@@ -27,12 +25,18 @@ seat_xremote_setup (Seat *seat)
 }
 
 static DisplayServer *
-seat_xremote_create_display_server (Seat *seat)
+seat_xremote_create_display_server (Seat *seat, const gchar *session_type)
 {
     XServerRemote *x_server;
     const gchar *hostname;
     gint number;
 
+    if (strcmp (session_type, "x") != 0)
+    {
+        g_warning ("X remote seat only supports X display servers, not '%s'", session_type);
+        return NULL;
+    }
+
     hostname = seat_get_string_property (seat, "xserver-hostname");
     if (!hostname)
         hostname = "localhost";
@@ -48,18 +52,23 @@ seat_xremote_create_display_server (Seat *seat)
 static Greeter *
 seat_xremote_create_greeter_session (Seat *seat)
 {
-    XGreeter *greeter_session;
+    Greeter *greeter_session;
 
-    greeter_session = x_greeter_new ();
+    greeter_session = SEAT_CLASS (seat_xremote_parent_class)->create_greeter_session (seat);
     session_set_env (SESSION (greeter_session), "XDG_SEAT", "seat0");
 
-    return GREETER (greeter_session);
+    return greeter_session;
 }
 
 static Session *
 seat_xremote_create_session (Seat *seat)
 {
-    return SESSION (x_session_new ());
+    Session *session;
+
+    session = SEAT_CLASS (seat_xremote_parent_class)->create_session (seat);
+    session_set_env (SESSION (session), "XDG_SEAT", "seat0");
+
+    return session;
 }
 
 static void
index f96b43556f88c76e0a954a6fea2b7854006151cd..2f4ecf7500fd4042e558dfbfe13723971a695664 100644 (file)
@@ -9,10 +9,10 @@
  * license.
  */
 
+#include <string.h>
+
 #include "seat-xvnc.h"
 #include "x-server-xvnc.h"
-#include "x-greeter.h"
-#include "x-session.h"
 #include "configuration.h"
 
 G_DEFINE_TYPE (SeatXVNC, seat_xvnc, SEAT_TYPE);
@@ -34,11 +34,17 @@ SeatXVNC *seat_xvnc_new (GSocket *connection)
 }
 
 static DisplayServer *
-seat_xvnc_create_display_server (Seat *seat)
+seat_xvnc_create_display_server (Seat *seat, const gchar *session_type)
 {
     XServerXVNC *x_server;
     const gchar *command = NULL;
 
+    if (strcmp (session_type, "x") != 0)
+    {
+        g_warning ("XVNC seat only supports X display servers, not '%s'", session_type);
+        return NULL;
+    }
+  
     x_server = x_server_xvnc_new ();
     x_server_xvnc_set_socket (x_server, g_socket_get_fd (SEAT_XVNC (seat)->priv->connection));
 
@@ -66,18 +72,6 @@ seat_xvnc_create_display_server (Seat *seat)
     return DISPLAY_SERVER (x_server);
 }
 
-static Greeter *
-seat_xvnc_create_greeter_session (Seat *seat)
-{
-    return GREETER (x_greeter_new ());
-}
-
-static Session *
-seat_xvnc_create_session (Seat *seat)
-{
-    return SESSION (x_session_new ());
-}
-
 static void
 seat_xvnc_run_script (Seat *seat, DisplayServer *display_server, Process *script)
 {
@@ -126,8 +120,6 @@ seat_xvnc_class_init (SeatXVNCClass *klass)
     GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
     seat_class->create_display_server = seat_xvnc_create_display_server;
-    seat_class->create_greeter_session = seat_xvnc_create_greeter_session;
-    seat_class->create_session = seat_xvnc_create_session;
     seat_class->run_script = seat_xvnc_run_script;
     object_class->finalize = seat_xdmcp_session_finalize;
 
index 36cf7f09faf3eb21e5e834ec8a921b62b4b6654f..6362fefa1d1ff2294e45fb0bb74f8e4e5242ff48 100644 (file)
@@ -70,7 +70,7 @@ typedef struct
 static GHashTable *seat_modules = NULL;
 
 // FIXME: Make a get_display_server() that re-uses display servers if supported
-static DisplayServer *create_display_server (Seat *seat);
+static DisplayServer *create_display_server (Seat *seat, const gchar *session_type);
 static Greeter *create_greeter_session (Seat *seat);
 static void start_session (Seat *seat, Session *session);
 
@@ -384,7 +384,7 @@ switch_to_greeter_from_failed_session (Seat *seat, Session *session)
     {
         DisplayServer *display_server;
 
-        display_server = create_display_server (seat);
+        display_server = create_display_server (seat, session_get_session_type (session));
         if (!display_server_start (display_server))
         {
             g_debug ("Failed to start display server for greeter");
@@ -717,6 +717,7 @@ create_user_session (Seat *seat, const gchar *username)
         gchar **argv;
 
         session = create_session (seat, TRUE);
+        session_set_session_type (session, session_config_get_session_type (session_config));
         session_set_env (session, "DESKTOP_SESSION", session_name);
         session_set_env (session, "GDMSESSION", session_name);
         if (language && language[0] != '\0')
@@ -759,6 +760,7 @@ create_guest_session (Seat *seat)
     }
 
     session = create_session (seat, TRUE);
+    session_set_session_type (session, session_config_get_session_type (session_config));
     session_set_do_authenticate (session, TRUE);
     session_set_is_guest (session, TRUE);
     argv = get_session_argv (session_config, seat_get_string_property (seat, "session-wrapper"));
@@ -775,6 +777,7 @@ greeter_create_session_cb (Greeter *greeter, Seat *seat)
     Session *session;
 
     session = create_session (seat, FALSE);
+    session_set_session_type (session, session_get_session_type (SESSION (greeter)));
     session_set_display_server (session, session_get_display_server (SESSION (greeter)));
 
     return g_object_ref (session);
@@ -914,7 +917,7 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi
     {
         DisplayServer *display_server;
 
-        display_server = create_display_server (seat);
+        display_server = create_display_server (seat, session_get_session_type (session));
         if (!display_server_start (display_server))
             return FALSE;
 
@@ -950,6 +953,7 @@ create_greeter_session (Seat *seat)
     }
 
     greeter_session = SEAT_GET_CLASS (seat)->create_greeter_session (seat);
+    session_set_session_type (SESSION (greeter_session), session_config_get_session_type (session_config));
     seat->priv->sessions = g_list_append (seat->priv->sessions, SESSION (greeter_session));
     g_signal_connect (greeter_session, "authentication-complete", G_CALLBACK (session_authentication_complete_cb), seat);
     g_signal_connect (greeter_session, "stopped", G_CALLBACK (session_stopped_cb), seat);
@@ -1039,11 +1043,11 @@ display_server_ready_cb (DisplayServer *display_server, Seat *seat)
 }
 
 static DisplayServer *
-create_display_server (Seat *seat)
+create_display_server (Seat *seat, const gchar *session_type)
 {
     DisplayServer *display_server;
 
-    display_server = SEAT_GET_CLASS (seat)->create_display_server (seat);
+    display_server = SEAT_GET_CLASS (seat)->create_display_server (seat, session_type);
     seat->priv->display_servers = g_list_append (seat->priv->display_servers, display_server);
     g_signal_connect (display_server, "ready", G_CALLBACK (display_server_ready_cb), seat);
     g_signal_connect (display_server, "stopped", G_CALLBACK (display_server_stopped_cb), seat);
@@ -1091,7 +1095,7 @@ seat_switch_to_greeter (Seat *seat)
         g_object_unref (seat->priv->session_to_activate);
     seat->priv->session_to_activate = g_object_ref (greeter_session);
 
-    display_server = create_display_server (seat);
+    display_server = create_display_server (seat, session_get_session_type (SESSION (greeter_session)));
     session_set_display_server (SESSION (greeter_session), display_server);
     if (!display_server_start (display_server))
         return FALSE;
@@ -1129,7 +1133,7 @@ seat_switch_to_user (Seat *seat, const gchar *username, const gchar *session_nam
     seat->priv->session_to_activate = g_object_ref (session);
     session_set_pam_service (session, USER_SERVICE);
 
-    display_server = create_display_server (seat);
+    display_server = create_display_server (seat, session_get_session_type (session));
     session_set_display_server (session, display_server);
     if (!display_server_start (display_server))
         return FALSE;
@@ -1172,13 +1176,14 @@ seat_switch_to_guest (Seat *seat, const gchar *session_name)
         return TRUE;
     }
 
-    display_server = create_display_server (seat);
-    if (!display_server_start (display_server))
-        return FALSE;
-
     session = create_guest_session (seat);
     if (!session)
         return FALSE;
+
+    display_server = create_display_server (seat, session_get_session_type (session));
+    if (!display_server_start (display_server))
+        return FALSE;
+
     if (seat->priv->session_to_activate)
         g_object_unref (seat->priv->session_to_activate);
     seat->priv->session_to_activate = g_object_ref (session);
@@ -1210,11 +1215,14 @@ seat_lock (Seat *seat, const gchar *username)
         return TRUE;
     }
 
-    display_server = create_display_server (seat);
+    greeter_session = create_greeter_session (seat);
+    if (!greeter_session)
+        return FALSE;
+
+    display_server = create_display_server (seat, session_get_session_type (SESSION (greeter_session)));
     if (!display_server_start (display_server))
         return FALSE;
 
-    greeter_session = create_greeter_session (seat);
     if (seat->priv->session_to_activate)
         g_object_unref (seat->priv->session_to_activate);
     seat->priv->session_to_activate = g_object_ref (greeter_session);
@@ -1264,16 +1272,17 @@ seat_real_start (Seat *seat)
     int autologin_timeout;
     gboolean autologin_guest;
     gboolean autologin_in_background;
-    Session *session = NULL;
+    Session *session = NULL, *background_session = NULL;
     DisplayServer *display_server;
 
     g_debug ("Starting seat");
 
-    display_server = create_display_server (seat);
-
     /* If this display server doesn't have a session running on it, just start it */
     if (!get_start_local_sessions (seat))
+    {
+        display_server = create_display_server (seat, "x"); // FIXME: Not necessarily an X seat, but not sure what to put here
         return display_server_start (display_server);
+    }
 
     /* Get autologin settings */
     autologin_username = seat_get_string_property (seat, "autologin-user");
@@ -1302,14 +1311,7 @@ seat_real_start (Seat *seat)
         /* Load in background if required */
         if (autologin_in_background && session)
         {
-            DisplayServer *background_display_server;
-
-            background_display_server = create_display_server (seat);
-            session_set_display_server (session, background_display_server);
-            if (!display_server_start (background_display_server))
-                return FALSE;
-
-            /* Start a greeter as well */
+            background_session = session;
             session = NULL;
         }
     }
@@ -1346,14 +1348,41 @@ seat_real_start (Seat *seat)
         return FALSE;
     }
 
+    display_server = create_display_server (seat, session_get_session_type (session));
+    if (!display_server)
+        return FALSE;
+
     /* Start display server to show session on */
     session_set_display_server (session, display_server);
     if (!display_server_start (display_server))
         return FALSE;
 
+    /* Start background session */
+    if (background_session)
+    {
+        DisplayServer *background_display_server;
+
+        background_display_server = create_display_server (seat, session_get_session_type (background_session));
+        session_set_display_server (background_session, background_display_server);
+        if (!display_server_start (background_display_server))
+            g_warning ("Failed to start display server for background session");
+    }
+
     return TRUE;
 }
 
+static Greeter *
+seat_real_create_greeter_session (Seat *seat)
+{
+    return greeter_new ();
+}
+
+static Session *
+seat_real_create_session (Seat *seat)
+{
+    return session_new ();
+}
+
 static void
 seat_real_set_active_session (Seat *seat, Session *session)
 {
@@ -1447,6 +1476,8 @@ seat_class_init (SeatClass *klass)
     klass->get_start_local_sessions = seat_real_get_start_local_sessions;
     klass->setup = seat_real_setup;
     klass->start = seat_real_start;
+    klass->create_greeter_session = seat_real_create_greeter_session;
+    klass->create_session = seat_real_create_session;
     klass->set_active_session = seat_real_set_active_session;
     klass->get_active_session = seat_real_get_active_session;
     klass->run_script = seat_real_run_script;
index 1e53abcf09232dcaa0aa72a532361c7d4565f537..e3c7f9e603e405c43c88030a8c057d32c051c07e 100644 (file)
@@ -40,7 +40,7 @@ typedef struct
     gboolean (*get_start_local_sessions) (Seat *seat);
     void (*setup)(Seat *seat);
     gboolean (*start)(Seat *seat);
-    DisplayServer *(*create_display_server) (Seat *seat);
+    DisplayServer *(*create_display_server) (Seat *seat, const gchar *session_type);
     Greeter *(*create_greeter_session) (Seat *seat);
     Session *(*create_session) (Seat *seat);
     void (*set_active_session)(Seat *seat, Session *session);
index 58d36678bd93a0b646ffe902b046450bb476b2b9..5ad780fc8f1e20e3573cc396dfb40868c1a66415 100644 (file)
@@ -13,6 +13,9 @@
 
 struct SessionConfigPrivate
 {
+    /* Session type */
+    gchar *session_type;
+
     /* Command to run */
     gchar *command;
 };
@@ -41,6 +44,9 @@ session_config_new_from_file (const gchar *filename, GError **error)
 
     config = g_object_new (SESSION_CONFIG_TYPE, NULL);
     config->priv->command = command;
+    config->priv->session_type = g_key_file_get_string (desktop_file, G_KEY_FILE_DESKTOP_GROUP, "X-LightDM-Session-Type", NULL);
+    if (!config->priv->session_type)
+        config->priv->session_type = g_strdup ("x");
 
     g_key_file_free (desktop_file);
 
@@ -54,6 +60,12 @@ session_config_get_command (SessionConfig *config)
     return config->priv->command;
 }
 
+const gchar *
+session_config_get_session_type (SessionConfig *config)
+{
+    g_return_val_if_fail (config != NULL, NULL);
+    return config->priv->session_type;
+}
 
 static void
 session_config_init (SessionConfig *config)
@@ -66,6 +78,7 @@ session_config_finalize (GObject *object)
 {
     SessionConfig *self = SESSION_CONFIG (object);
 
+    g_free (self->priv->session_type);
     g_free (self->priv->command);
 
     G_OBJECT_CLASS (session_config_parent_class)->finalize (object);
index ceb7429e4dd56d5311f1056ccae0c2929fd4bac3..c9387306868274f0e0806badda9449b162907db3 100644 (file)
@@ -40,6 +40,7 @@ SessionConfig *session_config_new_from_file (const gchar *filename, GError **err
 
 const gchar *session_config_get_command (SessionConfig *config);
 
+const gchar *session_config_get_session_type (SessionConfig *config);
 
 G_END_DECLS
 
index 1f481e88e775378e13246699dac8a5270db6fb96..03340dab19fe17101941c6b568bda5e8e32a981d 100644 (file)
@@ -37,6 +37,9 @@ static guint signals[LAST_SIGNAL] = { 0 };
 
 struct SessionPrivate
 {
+    /* Session type */
+    gchar *session_type;
+
     /* Display server running on */
     DisplayServer *display_server;
 
@@ -119,6 +122,27 @@ struct SessionPrivate
 
 G_DEFINE_TYPE (Session, session, G_TYPE_OBJECT);
 
+Session *
+session_new (void)
+{
+    return g_object_new (SESSION_TYPE, NULL);
+}
+
+void
+session_set_session_type (Session *session, const gchar *session_type)
+{
+    g_return_if_fail (session != NULL);
+    g_free (session->priv->session_type);
+    session->priv->session_type = g_strdup (session_type);
+}
+
+const gchar *
+session_get_session_type (Session *session)
+{
+    g_return_val_if_fail (session != NULL, NULL);
+    return session->priv->session_type;
+}
+
 void
 session_set_pam_service (Session *session, const gchar *pam_service)
 {
@@ -469,6 +493,8 @@ session_real_start (Session *session)
 
     g_return_val_if_fail (session->priv->pid == 0, FALSE);
 
+    display_server_setup_session (session->priv->display_server, session);
+
     /* Create pipes to talk to the child */
     if (pipe (to_child_pipe) < 0 || pipe (from_child_pipe) < 0)
     {
@@ -648,6 +674,8 @@ session_real_run (Session *session)
     g_return_if_fail (session->priv->argv != NULL);
     g_return_if_fail (session->priv->pid != 0);
 
+    display_server_setup_session (session->priv->display_server, session);
+
     session->priv->command_run = TRUE;
 
     command = g_strjoinv (" ", session->priv->argv);
@@ -762,6 +790,7 @@ static void
 session_init (Session *session)
 {
     session->priv = G_TYPE_INSTANCE_GET_PRIVATE (session, SESSION_TYPE, SessionPrivate);
+    session->priv->log_filename = g_strdup (".xsession-errors");
 }
 
 static void
@@ -770,6 +799,7 @@ session_finalize (GObject *object)
     Session *self = SESSION (object);
     int i;
 
+    g_free (self->priv->session_type);
     if (self->priv->display_server)
         g_object_unref (self->priv->display_server);
     if (self->priv->pid)
index f1cefb0899b9cc4b0d998ca4362e168016ec6541..0ac44c8b82a408fd42c761eb088a651fed388a20 100644 (file)
@@ -16,6 +16,8 @@
 
 #include <security/pam_appl.h>
 
+typedef struct Session Session;
+
 #include "display-server.h"
 #include "accounts.h"
 #include "x-authority.h"
@@ -29,11 +31,11 @@ G_BEGIN_DECLS
 
 typedef struct SessionPrivate SessionPrivate;
 
-typedef struct
+struct Session
 {
     GObject         parent_instance;
     SessionPrivate *priv;
-} Session;
+};
 
 typedef struct
 {
@@ -60,6 +62,12 @@ typedef enum
 
 GType session_get_type (void);
 
+Session *session_new (void);
+
+void session_set_session_type (Session *session, const gchar *session_type);
+
+const gchar *session_get_session_type (Session *session);
+
 void session_set_pam_service (Session *session, const gchar *pam_service);
 
 void session_set_username (Session *session, const gchar *username);
diff --git a/src/x-greeter.c b/src/x-greeter.c
deleted file mode 100644 (file)
index 3144529..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2013 Robert Ancell.
- * Author: Robert Ancell <robert.ancell@canonical.com>
- * 
- * This program is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation, either version 3 of the License, or (at your option) any later
- * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
- * license.
- */
-
-#include <errno.h>
-#include <string.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-
-#include "x-greeter.h"
-#include "x-server.h"
-#include "configuration.h"
-
-G_DEFINE_TYPE (XGreeter, x_greeter, GREETER_TYPE);
-
-XGreeter *
-x_greeter_new (void)
-{
-    return g_object_new (XGREETER_TYPE, NULL);
-}
-
-static void
-setup_env (XGreeter *greeter)
-{
-    DisplayServer *display_server;
-    gint vt;
-
-    display_server = session_get_display_server (SESSION (greeter));
-
-    vt = display_server_get_vt (display_server);
-    if (vt > 0)
-    {
-        gchar *t;
-
-        t = g_strdup_printf ("/dev/tty%d", vt);
-        session_set_tty (SESSION (greeter), t);
-        g_free (t);
-
-        t = g_strdup_printf ("%d", vt);
-        session_set_env (SESSION (greeter), "XDG_VTNR", t);
-        g_free (t);
-    }
-
-    session_set_env (SESSION (greeter), "DISPLAY", x_server_get_address (X_SERVER (display_server)));
-    session_set_tty (SESSION (greeter), x_server_get_address (X_SERVER (display_server)));
-    session_set_xdisplay (SESSION (greeter), x_server_get_address (X_SERVER (display_server)));
-    session_set_remote_host_name (SESSION (greeter), x_server_get_hostname (X_SERVER (display_server)));
-    session_set_x_authority (SESSION (greeter),
-                             x_server_get_authority (X_SERVER (display_server)),
-                             config_get_boolean (config_get_instance (), "LightDM", "user-authority-in-system-dir"));
-}
-
-static gboolean
-x_greeter_start (Session *session)
-{
-    setup_env (XGREETER (session));
-    return SESSION_CLASS (x_greeter_parent_class)->start (session);
-}
-
-static void
-x_greeter_run (Session *session)
-{
-    setup_env (XGREETER (session));
-    SESSION_CLASS (x_greeter_parent_class)->run (session);
-}
-
-static void
-x_greeter_init (XGreeter *session)
-{
-}
-
-static void
-x_greeter_class_init (XGreeterClass *klass)
-{
-    SessionClass *session_class = SESSION_CLASS (klass);
-
-    session_class->start = x_greeter_start;
-    session_class->run = x_greeter_run;
-}
diff --git a/src/x-greeter.h b/src/x-greeter.h
deleted file mode 100644 (file)
index c724b6c..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2013 Robert Ancell.
- * Author: Robert Ancell <robert.ancell@canonical.com>
- * 
- * This program is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation, either version 3 of the License, or (at your option) any later
- * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
- * license.
- */
-
-#ifndef XGREETER_H_
-#define XGREETER_H_
-
-#include "greeter.h"
-
-G_BEGIN_DECLS
-
-#define XGREETER_TYPE (x_greeter_get_type())
-#define XGREETER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), XGREETER_TYPE, XGreeter))
-
-typedef struct XGreeterPrivate XGreeterPrivate;
-
-typedef struct
-{
-    Greeter          parent_instance;
-    XGreeterPrivate *priv;
-} XGreeter;
-
-typedef struct
-{
-    GreeterClass parent_class;
-} XGreeterClass;
-
-GType x_greeter_get_type (void);
-
-XGreeter *x_greeter_new (void);
-
-G_END_DECLS
-
-#endif /* XGREETER_H_ */
index 7a5d6da6389b6a38871a124df3e301f4975d0eeb..8bc14dc4868ad125d82acbfb7a9d25f46bcd2eac 100644 (file)
@@ -14,7 +14,7 @@
 #include <xcb/xcb.h>
 
 #include "x-server.h"
-#include "x-session.h"
+#include "configuration.h"
 
 struct XServerPrivate
 {  
@@ -133,6 +133,36 @@ x_server_start (DisplayServer *display_server)
 }
 
 static void
+x_server_setup_session (DisplayServer *display_server, Session *session)
+{
+    gint vt;
+
+    display_server = session_get_display_server (session);
+
+    vt = display_server_get_vt (display_server);
+    if (vt > 0)
+    {
+        gchar *t;
+
+        t = g_strdup_printf ("/dev/tty%d", vt);
+        session_set_tty (session, t);
+        g_free (t);
+
+        t = g_strdup_printf ("%d", vt);
+        session_set_env (session, "XDG_VTNR", t);
+        g_free (t);
+    }
+
+    session_set_env (session, "DISPLAY", x_server_get_address (X_SERVER (display_server)));
+    session_set_tty (session, x_server_get_address (X_SERVER (display_server)));
+    session_set_xdisplay (session, x_server_get_address (X_SERVER (display_server)));
+    session_set_remote_host_name (session, x_server_get_hostname (X_SERVER (display_server)));
+    session_set_x_authority (session,
+                             x_server_get_authority (X_SERVER (display_server)),
+                             config_get_boolean (config_get_instance (), "LightDM", "user-authority-in-system-dir"));
+}
+
+void
 x_server_init (XServer *server)
 {
     server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, X_SERVER_TYPE, XServerPrivate);
@@ -162,6 +192,7 @@ x_server_class_init (XServerClass *klass)
     DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass);
 
     display_server_class->start = x_server_start;
+    display_server_class->setup_session = x_server_setup_session;
     object_class->finalize = x_server_finalize;
 
     g_type_class_add_private (klass, sizeof (XServerPrivate));
diff --git a/src/x-session.c b/src/x-session.c
deleted file mode 100644 (file)
index 27cbcb1..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2010-2011 Robert Ancell.
- * Author: Robert Ancell <robert.ancell@canonical.com>
- * 
- * This program is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation, either version 3 of the License, or (at your option) any later
- * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
- * license.
- */
-
-#include <errno.h>
-#include <string.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-
-#include "x-session.h"
-#include "x-server.h"
-#include "configuration.h"
-
-G_DEFINE_TYPE (XSession, x_session, SESSION_TYPE);
-
-XSession *
-x_session_new (void)
-{
-    XSession *session;
-
-    session = g_object_new (XSESSION_TYPE, NULL);
-    session_set_log_file (SESSION (session), ".xsession-errors");
-
-    return session;
-}
-
-static void
-setup_env (XSession *session)
-{
-    DisplayServer *display_server;
-    gint vt;
-
-    display_server = session_get_display_server (SESSION (session));
-
-    vt = display_server_get_vt (display_server);
-    if (vt > 0)
-    {
-        gchar *t;
-
-        t = g_strdup_printf ("/dev/tty%d", vt);
-        session_set_tty (SESSION (session), t);
-        g_free (t);
-
-        t = g_strdup_printf ("%d", vt);
-        session_set_env (SESSION (session), "XDG_VTNR", t);
-        g_free (t);
-    }
-
-    session_set_env (SESSION (session), "DISPLAY", x_server_get_address (X_SERVER (display_server)));
-    session_set_tty (SESSION (session), x_server_get_address (X_SERVER (display_server)));
-    session_set_xdisplay (SESSION (session), x_server_get_address (X_SERVER (display_server)));
-    session_set_remote_host_name (SESSION (session), x_server_get_hostname (X_SERVER (display_server)));
-    session_set_x_authority (SESSION (session),
-                             x_server_get_authority (X_SERVER (display_server)),
-                             config_get_boolean (config_get_instance (), "LightDM", "user-authority-in-system-dir"));
-}
-
-static gboolean
-x_session_start (Session *session)
-{
-    setup_env (XSESSION (session));
-    return SESSION_CLASS (x_session_parent_class)->start (session);
-}
-
-static void
-x_session_run (Session *session)
-{
-    setup_env (XSESSION (session));
-    SESSION_CLASS (x_session_parent_class)->run (session);
-}
-
-static void
-x_session_init (XSession *session)
-{
-}
-
-static void
-x_session_class_init (XSessionClass *klass)
-{
-    SessionClass *session_class = SESSION_CLASS (klass);
-
-    session_class->start = x_session_start;
-    session_class->run = x_session_run;
-}
diff --git a/src/x-session.h b/src/x-session.h
deleted file mode 100644 (file)
index 012f7db..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2010-2011 Robert Ancell.
- * Author: Robert Ancell <robert.ancell@canonical.com>
- * 
- * This program is free software: you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation, either version 3 of the License, or (at your option) any later
- * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
- * license.
- */
-
-#ifndef XSESSION_H_
-#define XSESSION_H_
-
-#include "session.h"
-
-G_BEGIN_DECLS
-
-#define XSESSION_TYPE (x_session_get_type())
-#define XSESSION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), XSESSION_TYPE, XSession))
-
-typedef struct XSessionPrivate XSessionPrivate;
-
-typedef struct
-{
-    Session          parent_instance;
-    XSessionPrivate *priv;
-} XSession;
-
-typedef struct
-{
-    SessionClass parent_class;
-} XSessionClass;
-
-GType x_session_get_type (void);
-
-XSession *x_session_new (void);
-
-G_END_DECLS
-
-#endif /* XSESSION_H_ */
index ec7383377a9bdf44827cacf55d6fb3b520476302..d99355fe2a24662e38828fef2a8bbfa1f5c2b584 100644 (file)
@@ -27,12 +27,9 @@ TESTS = \
        test-autologin-new-authtok \
        test-autologin-gobject-timeout \
        test-autologin-gobject-guest-timeout \
-       test-autologin-python-timeout \
-       test-autologin-python-guest-timeout \
        test-change-authentication \
        test-restart-authentication \
        test-gobject-cancel-authentication \
-       test-python-cancel-authentication \
        test-pam \
        test-login-pam \
        test-denied \
@@ -59,7 +56,6 @@ TESTS = \
        test-user-renamed \
        test-user-renamed-invalid \
        test-users-gobject \
-       test-users-python \
        test-keyboard-layout \
        test-no-keyboard-layout \
        test-language \
@@ -90,29 +86,6 @@ TESTS = \
        test-login-gobject-guest-fail-setup-script \
        test-login-gobject-guest-logout \
        test-login-gobject-remote-session \
-       test-login-python \
-       test-login-python-manual \
-       test-login-python-manual-previous-session \
-       test-login-python-no-password \
-       test-login-python-long-username \
-       test-login-python-long-password \
-       test-login-python-two-factor \
-       test-login-python-new-authtok \
-       test-login-python-info-prompt \
-       test-login-python-multi-info-prompt \
-       test-login-python-previous-session \
-       test-login-python-wrong-password \
-       test-login-python-invalid-user \
-       test-login-python-invalid-session \
-       test-login-python-logout \
-       test-login-python-pick-session \
-       test-login-python-remember-session \
-       test-login-python-guest \
-       test-login-python-guest-disabled \
-       test-login-python-guest-no-setup-script \
-       test-login-python-guest-fail-setup-script \
-       test-login-python-guest-logout \
-       test-login-python-remote-session \
        test-login-session-crash \
        test-login-xserver-crash \
        test-xserver-no-share \
@@ -159,19 +132,20 @@ TESTS = \
        test-gobject-power-no-console-kit \
        test-gobject-power-no-login1 \
        test-gobject-power-no-services \
-       test-python-power \
-       test-python-power-no-console-kit \
-       test-python-power-no-login1 \
-       test-python-power-no-services \
        test-open-file-descriptors \
        test-xdmcp-server-open-file-descriptors \
+       test-mir-autologin \
+       test-mir-greeter-x-session \
+       test-mir-greeter-mir-session \
+       test-mir-session-x-greeter \
        test-unity-compositor-command \
        test-unity-compositor-fail-start \
        test-unity-compositor-fail-ready \
        test-unity-autologin \
        test-unity-login \
        test-unity-switch \
-       test-unity-plymouth
+       test-unity-plymouth \
+       test-unity-mir-login
 
 #      test-session-exit-error
 #      test-greeter-no-exit
@@ -179,6 +153,39 @@ TESTS = \
 #   test-qt-change-password
 #   test-autologin-create-directory
 
+TESTS += \
+       test-python-cancel-authentication \
+       test-users-python \
+       test-login-python \
+       test-login-python-manual \
+       test-login-python-manual-previous-session \
+       test-login-python-no-password \
+       test-login-python-long-username \
+       test-login-python-long-password \
+       test-login-python-two-factor \
+       test-login-python-new-authtok \
+       test-login-python-info-prompt \
+       test-login-python-multi-info-prompt \
+       test-login-python-previous-session \
+       test-login-python-wrong-password \
+       test-login-python-invalid-user \
+       test-login-python-invalid-session \
+       test-login-python-logout \
+       test-login-python-pick-session \
+       test-login-python-remember-session \
+       test-login-python-guest \
+       test-login-python-guest-disabled \
+       test-login-python-guest-no-setup-script \
+       test-login-python-guest-fail-setup-script \
+       test-login-python-guest-logout \
+       test-login-python-remote-session \
+       test-autologin-python-timeout \
+       test-autologin-python-guest-timeout \
+       test-python-power \
+       test-python-power-no-console-kit \
+       test-python-power-no-login1 \
+       test-python-power-no-services
+
 if COMPILE_LIBLIGHTDM_QT4
 TESTS += \
        test-autologin-qt4-timeout \
@@ -260,6 +267,7 @@ EXTRA_DIST = \
        data/greeters/test-qt5-greeter.desktop \
        data/sessions/alternative.desktop \
        data/sessions/default.desktop \
+       data/sessions/mir.desktop \
        scripts/0-additional.conf \
        scripts/1-additional.conf \
        scripts/additional-config.conf \
@@ -342,6 +350,10 @@ EXTRA_DIST = \
        scripts/login-two-factor.conf \
        scripts/login-wrong-password.conf \
        scripts/login-xserver-crash.conf \
+       scripts/mir-autologin.conf \
+       scripts/mir-greeter-x-session.conf \
+       scripts/mir-greeter-mir-session.conf \
+       scripts/mir-session-x-greeter.conf \
        scripts/no-accounts-service.conf \
        scripts/no-config.conf \
        scripts/no-console-kit.conf \
@@ -386,6 +398,7 @@ EXTRA_DIST = \
        scripts/unity-compositor-fail-ready.conf \
        scripts/unity-compositor-fail-start.conf \
        scripts/unity-login.conf \
+       scripts/unity-mir-login.conf \
        scripts/unity-plymouth.conf \
        scripts/unity-switch.conf \
        scripts/users.conf \
diff --git a/tests/data/greeters/test-mir-greeter.desktop b/tests/data/greeters/test-mir-greeter.desktop
new file mode 100644 (file)
index 0000000..d1ca7d5
--- /dev/null
@@ -0,0 +1,5 @@
+[Desktop Entry]
+Name=Test GObject Greeter
+Comment=LightDM test GObject greeter
+Exec=test-gobject-greeter
+X-LightDM-Session-Type=mir
diff --git a/tests/data/sessions/mir.desktop b/tests/data/sessions/mir.desktop
new file mode 100644 (file)
index 0000000..afa9d59
--- /dev/null
@@ -0,0 +1,5 @@
+[Desktop Entry]
+Name=Test Session
+Comment=LightDM test Mir session
+Exec=test-session
+X-LightDM-Session-Type=mir
diff --git a/tests/scripts/mir-autologin.conf b/tests/scripts/mir-autologin.conf
new file mode 100644 (file)
index 0000000..f2a122c
--- /dev/null
@@ -0,0 +1,17 @@
+#
+# Check can run automatically log into a Mir session
+#
+
+[SeatDefaults]
+autologin-user=have-password1
+user-session=mir
+
+#?RUNNER DAEMON-START
+
+# Session starts
+#?SESSION-MIR START VT=7 USER=have-password1
+
+# Cleanup
+#?*STOP-DAEMON
+#?SESSION-MIR TERMINATE SIGNAL=15
+#?RUNNER DAEMON-EXIT STATUS=0
diff --git a/tests/scripts/mir-greeter-mir-session.conf b/tests/scripts/mir-greeter-mir-session.conf
new file mode 100644 (file)
index 0000000..2d7a9bd
--- /dev/null
@@ -0,0 +1,30 @@
+#
+# Check can run a Mir greeter and log into a Mir session
+#
+
+[SeatDefaults]
+user-session=mir
+
+#?RUNNER DAEMON-START
+
+# Greeter starts
+#?GREETER-MIR START VT=7
+#?XSERVER-0 ACCEPT-CONNECT
+#?GREETER-MIR CONNECT-TO-DAEMON
+#?GREETER-MIR CONNECTED-TO-DAEMON
+
+# Log into account
+#?*GREETER-MIR AUTHENTICATE USERNAME=no-password1
+#?GREETER-MIR AUTHENTICATION-COMPLETE USERNAME=no-password1 AUTHENTICATED=TRUE
+#?*GREETER-MIR START-SESSION
+
+# Session starts
+#?SESSION-MIR START VT=8 USER=have-password1
+
+# Greeter quits once session ready
+#?GREETER-MIR TERMINATE SIGNAL=15
+
+# Cleanup
+#?*STOP-DAEMON
+#?SESSION-MIR TERMINATE SIGNAL=15
+#?RUNNER DAEMON-EXIT STATUS=0
diff --git a/tests/scripts/mir-greeter-x-session.conf b/tests/scripts/mir-greeter-x-session.conf
new file mode 100644 (file)
index 0000000..457d50b
--- /dev/null
@@ -0,0 +1,39 @@
+#
+# Check can run a Mir greeter and log into an X session
+#
+
+[SeatDefaults]
+user-session=default
+
+#?RUNNER DAEMON-START
+
+# Greeter starts
+#?GREETER-MIR START VT=7
+#?XSERVER-0 ACCEPT-CONNECT
+#?GREETER-MIR CONNECT-TO-DAEMON
+#?GREETER-MIR CONNECTED-TO-DAEMON
+
+# Log into account
+#?*GREETER-MIR AUTHENTICATE USERNAME=no-password1
+#?GREETER-MIR AUTHENTICATION-COMPLETE USERNAME=no-password1 AUTHENTICATED=TRUE
+#?*GREETER-MIR START-SESSION
+#?GREETER-MIR TERMINATE SIGNAL=15
+
+# X server starts for session
+#?XSERVER-0 START VT=8
+
+# Daemon connects when X server is ready
+#?*XSERVER-0 INDICATE-READY
+#?XSERVER-0 INDICATE-READY
+#?XSERVER-0 ACCEPT-CONNECT
+
+# Session starts
+#?SESSION-X-0 START USER=have-password1
+#?XSERVER-0 ACCEPT-CONNECT
+#?SESSION-X-0 CONNECT-XSERVER
+
+# Cleanup
+#?*STOP-DAEMON
+#?SESSION-X-0 TERMINATE SIGNAL=15
+#?XSERVER-0 TERMINATE SIGNAL=15
+#?RUNNER DAEMON-EXIT STATUS=0
diff --git a/tests/scripts/mir-session-x-greeter.conf b/tests/scripts/mir-session-x-greeter.conf
new file mode 100644 (file)
index 0000000..c59cd48
--- /dev/null
@@ -0,0 +1,40 @@
+#
+# Check can login to a Mir session from an X greeter
+#
+
+[SeatDefaults]
+user-session=mir
+
+#?RUNNER DAEMON-START
+
+# X server starts
+#?XSERVER-0 START VT=7
+
+# Daemon connects when X server is ready
+#?*XSERVER-0 INDICATE-READY
+#?XSERVER-0 INDICATE-READY
+#?XSERVER-0 ACCEPT-CONNECT
+
+# Greeter starts
+#?GREETER-X-0 START
+#?XSERVER-0 ACCEPT-CONNECT
+#?GREETER-X-0 CONNECT-XSERVER
+#?GREETER-X-0 CONNECT-TO-DAEMON
+#?GREETER-X-0 CONNECTED-TO-DAEMON
+
+# Log into account
+#?*GREETER-X-0 AUTHENTICATE USERNAME=no-password1
+#?GREETER-X-0 AUTHENTICATION-COMPLETE USERNAME=no-password1 AUTHENTICATED=TRUE
+#?*GREETER-X-0 START-SESSION
+
+# Session starts
+#?SESSION-MIR START VT=8 USER=have-password1
+
+# Greeter quits once session ready
+#?GREETER-X-0 TERMINATE SIGNAL=15
+#?XSERVER-0 TERMINATE SIGNAL=15
+
+# Cleanup
+#?*STOP-DAEMON
+#?SESSION-MIR TERMINATE SIGNAL=15
+#?RUNNER DAEMON-EXIT STATUS=0
diff --git a/tests/scripts/unity-mir-login.conf b/tests/scripts/unity-mir-login.conf
new file mode 100644 (file)
index 0000000..d440c78
--- /dev/null
@@ -0,0 +1,43 @@
+#
+# Check can log into a Mir session from a Mir greeter
+#
+
+[SeatDefaults]
+type=unity
+user-session=default
+
+#?RUNNER DAEMON-START
+
+# System compositor starts
+#?UNITY-SYSTEM-COMPOSITOR START
+#?*UNITY-SYSTEM-COMPOSITOR READY
+
+# Greeter starts
+#?GREETER-MIR-0 START
+#?GREETER-MIR-0 CONNECT-TO-DAEMON
+#?GREETER-MIR-0 CONNECTED-TO-DAEMON
+
+# System compositor switches to greeter
+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=0
+
+# Log into account with a password
+#?*GREETER-MIR-0 AUTHENTICATE USERNAME=have-password1
+#?GREETER-MIR-0 SHOW-PROMPT TEXT="Password:"
+#?*GREETER-MIR-0 RESPOND TEXT="password"
+#?GREETER-MIR-0 AUTHENTICATION-COMPLETE USERNAME=have-password1 AUTHENTICATED=TRUE
+#?*GREETER-MIR-0 START-SESSION
+
+# Session starts
+#?SESSION-MIR-1 START USER=have-password1
+
+# System compositor switches to session
+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=1
+
+# Greeter stops
+#?GREETER-MIR-0 TERMINATE SIGNAL=15
+
+# Cleanup
+#?*STOP-DAEMON
+#?SESSION-MIR-1 TERMINATE SIGNAL=15
+#?UNITY-SYSTEM-COMPOSITOR TERMINATE SIGNAL=15
+#?RUNNER DAEMON-EXIT STATUS=0
index 9c1b4911c67166341f1581aef8759789a32b48f3..733e6b6f9735a7228c73f782adb752b63314e14a 100644 (file)
@@ -3,6 +3,7 @@ noinst_PROGRAMS = dbus-env \
                   plymouth \
                   test-gobject-greeter \
                   test-greeter-wrapper \
+                  test-mir-greeter \
                   test-runner \
                   test-script-hook \
                   test-session \
@@ -107,7 +108,19 @@ test_gobject_greeter_LDADD = \
        -llightdm-gobject-1 \
        $(GLIB_LIBS) \
        $(GIO_UNIX_LIBS) \
-       $(XCB_LIBS)    
+       $(XCB_LIBS)
+
+test_mir_greeter_SOURCES = test-mir-greeter.c status.c status.h
+test_mir_greeter_CFLAGS = \
+       -I$(top_srcdir)/liblightdm-gobject \
+       $(WARN_CFLAGS) \
+       $(GLIB_CFLAGS) \
+       $(GIO_UNIX_CFLAGS)
+test_mir_greeter_LDADD = \
+       -L$(top_builddir)/liblightdm-gobject \
+       -llightdm-gobject-1 \
+       $(GLIB_LIBS) \
+       $(GIO_UNIX_LIBS)
 
 guest_account_SOURCES = guest-account.c status.c status.h
 guest_account_CFLAGS = \
diff --git a/tests/src/test-mir-greeter.c b/tests/src/test-mir-greeter.c
new file mode 100644 (file)
index 0000000..83935fc
--- /dev/null
@@ -0,0 +1,146 @@
+/* -*- Mode: C; indent-tabs-mode: nil; tab-width: 4 -*- */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <lightdm.h>
+
+#include "status.h"
+
+static gchar *greeter_id;
+static GMainLoop *loop;
+static LightDMGreeter *greeter;
+static GKeyFile *config;
+
+static void
+show_message_cb (LightDMGreeter *greeter, const gchar *text, LightDMMessageType type)
+{
+    status_notify ("%s SHOW-MESSAGE TEXT=\"%s\"", greeter_id, text);
+}
+
+static void
+show_prompt_cb (LightDMGreeter *greeter, const gchar *text, LightDMPromptType type)
+{
+    status_notify ("%s SHOW-PROMPT TEXT=\"%s\"", greeter_id, text);
+}
+
+static void
+authentication_complete_cb (LightDMGreeter *greeter)
+{
+    if (lightdm_greeter_get_authentication_user (greeter))
+        status_notify ("%s AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s",
+                       greeter_id,
+                       lightdm_greeter_get_authentication_user (greeter),
+                       lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
+    else
+        status_notify ("%s AUTHENTICATION-COMPLETE AUTHENTICATED=%s",
+                       greeter_id,
+                       lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
+}
+
+static void
+signal_cb (int signum)
+{
+    status_notify ("%s TERMINATE SIGNAL=%d", greeter_id, signum);
+    exit (EXIT_SUCCESS);
+}
+
+static void
+request_cb (const gchar *request)
+{
+    gchar *r;
+
+    if (!request)
+    {
+        g_main_loop_quit (loop);
+        return;
+    }
+  
+    r = g_strdup_printf ("%s AUTHENTICATE", greeter_id);
+    if (strcmp (request, r) == 0)
+        lightdm_greeter_authenticate (greeter, NULL);
+    g_free (r);
+
+    r = g_strdup_printf ("%s AUTHENTICATE USERNAME=", greeter_id);
+    if (g_str_has_prefix (request, r))
+        lightdm_greeter_authenticate (greeter, request + strlen (r));
+    g_free (r);
+
+    r = g_strdup_printf ("%s RESPOND TEXT=\"", greeter_id);
+    if (g_str_has_prefix (request, r))
+    {
+        gchar *text = g_strdup (request + strlen (r));
+        text[strlen (text) - 1] = '\0';
+        lightdm_greeter_respond (greeter, text);
+        g_free (text);
+    }
+    g_free (r);
+
+    r = g_strdup_printf ("%s CANCEL-AUTHENTICATION", greeter_id);
+    if (strcmp (request, r) == 0)
+        lightdm_greeter_cancel_authentication (greeter);
+    g_free (r);
+
+    r = g_strdup_printf ("%s START-SESSION", greeter_id);
+    if (strcmp (request, r) == 0)
+    {
+        if (!lightdm_greeter_start_session_sync (greeter, NULL, NULL))
+            status_notify ("%s SESSION-FAILED", greeter_id); 
+    }
+    g_free (r);
+
+    r = g_strdup_printf ("%s START-SESSION SESSION=", greeter_id);
+    if (g_str_has_prefix (request, r))
+    {
+        if (!lightdm_greeter_start_session_sync (greeter, request + strlen (r), NULL))
+            status_notify ("%s SESSION-FAILED", greeter_id); 
+    }
+    g_free (r);
+}
+
+int
+main (int argc, char **argv)
+{
+    signal (SIGINT, signal_cb);
+    signal (SIGTERM, signal_cb);
+
+#if !defined(GLIB_VERSION_2_36)
+    g_type_init ();
+#endif
+
+    greeter_id = g_strdup ("GREETER-MIR");
+
+    loop = g_main_loop_new (NULL, FALSE);
+
+    status_connect (request_cb);
+
+    status_notify ("%s START", greeter_id);
+
+    config = g_key_file_new ();
+    g_key_file_load_from_file (config, g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "script", NULL), G_KEY_FILE_NONE, NULL);
+
+    if (g_key_file_has_key (config, "test-greeter-config", "return-value", NULL))
+    {
+        int return_value = g_key_file_get_integer (config, "test-greeter-config", "return-value", NULL);
+        status_notify ("%s EXIT CODE=%d", greeter_id, return_value);
+        return return_value;
+    }
+
+    greeter = lightdm_greeter_new ();
+    g_signal_connect (greeter, "show-message", G_CALLBACK (show_message_cb), NULL);
+    g_signal_connect (greeter, "show-prompt", G_CALLBACK (show_prompt_cb), NULL);
+    g_signal_connect (greeter, "authentication-complete", G_CALLBACK (authentication_complete_cb), NULL);
+
+    status_notify ("%s CONNECT-TO-DAEMON", greeter_id);
+    if (!lightdm_greeter_connect_sync (greeter, NULL))
+    {
+        status_notify ("%s FAIL-CONNECT-DAEMON", greeter_id);
+        return EXIT_FAILURE;
+    }
+
+    status_notify ("%s CONNECTED-TO-DAEMON", greeter_id);
+
+    g_main_loop_run (loop);
+
+    return EXIT_SUCCESS;
+}
diff --git a/tests/test-mir-autologin b/tests/test-mir-autologin
new file mode 100755 (executable)
index 0000000..1a1e016
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner mir-autologin test-mir-greeter
diff --git a/tests/test-mir-greeter-mir-session b/tests/test-mir-greeter-mir-session
new file mode 100755 (executable)
index 0000000..1837e85
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner mir-greeter-mir-session test-mir-greeter
diff --git a/tests/test-mir-greeter-x-session b/tests/test-mir-greeter-x-session
new file mode 100755 (executable)
index 0000000..3c54281
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner mir-greeter-x-session test-mir-greeter
diff --git a/tests/test-mir-session-x-greeter b/tests/test-mir-session-x-greeter
new file mode 100755 (executable)
index 0000000..20a0e97
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner mir-session-x-greeter test-mir-greeter
diff --git a/tests/test-unity-mir-login b/tests/test-unity-mir-login
new file mode 100755 (executable)
index 0000000..1f8c2c3
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner unity-mir-login test-mir-greeter