]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Make a login1 service object (not currently required, but will be used for automatic...
authorRobert Ancell <robert.ancell@canonical.com>
Fri, 22 Aug 2014 01:41:12 +0000 (13:41 +1200)
committerRobert Ancell <robert.ancell@canonical.com>
Fri, 22 Aug 2014 01:41:12 +0000 (13:41 +1200)
28 files changed:
NEWS
configure.ac
debian/changelog
src/Makefile.am
src/display-manager.c
src/seat-surfaceflinger.c [deleted file]
src/seat-surfaceflinger.h [deleted file]
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/surfaceflinger-server.c [deleted file]
src/surfaceflinger-server.h [deleted file]
tests/Makefile.am
tests/data/sessions/mir-container.desktop [new file with mode: 0644]
tests/data/sessions/surfaceflinger.desktop [deleted file]
tests/scripts/mir-container-session.conf [new file with mode: 0644]
tests/scripts/surfaceflinger-autologin.conf [deleted file]
tests/src/unity-system-compositor.c
tests/test-mir-container-session [new file with mode: 0755]
tests/test-surfaceflinger-autologin [deleted file]

diff --git a/NEWS b/NEWS
index 1d6b68fb3eebf9caeb450912d118f42749e2a71f..d70f796ae934839dd6f696c6a3defc76a80915cf 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,15 @@
+Overview of changes in lightdm 1.11.6
+
+    * Add a seat option 'allow-user-switching' that can disable all user
+      switching for that seat
+    * Add a new session type 'mir-container' that allows the session to run
+      inside a custom system compositor
+    * Only seat0 takes VT from Plymouth
+    * Removed unused GAsyncResultIface.is_tagged as this attribute was not
+      available in earlier versions of Glib I/O.
+    * Abort autogen if yelp-tools not installed
+    * Return correct errors for D-Bus calls
+
 Overview of changes in lightdm 1.11.5
 
     * Make PAM services configurable
index 08031a5da893da1789832b891d6cbbe751afc9aa..c675fa6a2f00c7b45fe0df0031ca3e24b1633c90 100644 (file)
@@ -1,6 +1,6 @@
 dnl Process this file with autoconf to produce a configure script.
 
-AC_INIT(lightdm, 1.11.5)
+AC_INIT(lightdm, 1.11.6)
 AC_CONFIG_MACRO_DIR(m4)
 AC_CONFIG_HEADER(config.h)
 AM_INIT_AUTOMAKE([1.11 no-dist-gzip dist-xz foreign])
index daecd9853ae69476dca65ba3252831d54d96e08c..ccbcad2bd6a17de07986b86aab805233dc4e6871 100644 (file)
@@ -1,3 +1,18 @@
+lightdm (1.11.6-0ubuntu1) utopic; urgency=medium
+
+  * New upstream release:
+    * Add a seat option 'allow-user-switching' that can disable all user
+      switching for that seat
+    * Add a new session type 'mir-container' that allows the session to run
+      inside a custom system compositor (LP: #1359332)
+    * Only seat0 takes VT from Plymouth
+    * Removed unused GAsyncResultIface.is_tagged as this attribute was not
+      available in earlier versions of Glib I/O.
+    * Abort autogen if yelp-tools not installed
+    * Return correct errors for D-Bus calls
+
+ -- Robert Ancell <robert.ancell@canonical.com>  Fri, 22 Aug 2014 09:10:29 +1200
+
 lightdm (1.11.5-0ubuntu1) utopic; urgency=medium
 
   * New upstream release:
index da16d630d824db0a379b12c986331f32bb9eac68..fc6f7f25d581588a126dfd2bb4e9c63a5f3ec793 100644 (file)
@@ -27,8 +27,6 @@ lightdm_SOURCES = \
        process.h \
        seat.c \
        seat.h \
-       seat-surfaceflinger.c \
-       seat-surfaceflinger.h \
        seat-unity.c \
        seat-unity.h \
        seat-xdmcp-session.c \
@@ -47,8 +45,6 @@ lightdm_SOURCES = \
        session-config.h \
        shared-data-manager.c \
        shared-data-manager.h \
-       surfaceflinger-server.c \
-       surfaceflinger-server.h \
        unity-system-compositor.c \
        unity-system-compositor.h \
        vnc-server.c \
index 0e160b8073c1b15408f5853e481b6b405d87f367..f8c8d2dfa61679e4cfac8a3c1bc19764ddd466c7 100644 (file)
@@ -20,7 +20,6 @@
 #include "seat-xlocal.h"
 #include "seat-xremote.h"
 #include "seat-unity.h"
-#include "seat-surfaceflinger.h"
 #include "plymouth.h"
 
 enum {
@@ -150,7 +149,6 @@ display_manager_init (DisplayManager *manager)
     seat_register_module ("xlocal", SEAT_XLOCAL_TYPE);
     seat_register_module ("xremote", SEAT_XREMOTE_TYPE);
     seat_register_module ("unity", SEAT_UNITY_TYPE);
-    seat_register_module ("surfaceflinger", SEAT_SURFACEFLINGER_TYPE);
 }
 
 static void
diff --git a/src/seat-surfaceflinger.c b/src/seat-surfaceflinger.c
deleted file mode 100644 (file)
index 4bfdef1..0000000
+++ /dev/null
@@ -1,83 +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 <string.h>
-
-#include "seat-surfaceflinger.h"
-#include "surfaceflinger-server.h"
-#include "vt.h"
-
-G_DEFINE_TYPE (SeatSurfaceflinger, seat_surfaceflinger, SEAT_TYPE);
-
-static void
-seat_surfaceflinger_setup (Seat *seat)
-{
-    seat_set_supports_multi_session (seat, FALSE);
-    SEAT_CLASS (seat_surfaceflinger_parent_class)->setup (seat);
-}
-
-static DisplayServer *
-seat_surfaceflinger_create_display_server (Seat *seat, const gchar *session_type)
-{
-    /* Allow mir types too, because Mir sessions usually support surfaceflinger
-       as an alternate mode, since Mir is frequently used on phones. */
-    if (strcmp (session_type, "surfaceflinger") == 0 || strcmp (session_type, "mir") == 0)
-        return DISPLAY_SERVER (surfaceflinger_server_new ());
-    else
-    {
-        l_warning (seat, "Can't create unsupported display server '%s'", session_type);
-        return NULL;
-    }
-}
-
-static Greeter *
-seat_surfaceflinger_create_greeter_session (Seat *seat)
-{
-    Greeter *greeter_session;
-
-    greeter_session = SEAT_CLASS (seat_surfaceflinger_parent_class)->create_greeter_session (seat);
-    session_set_env (SESSION (greeter_session), "XDG_SEAT", seat_get_name (seat));
-
-    /* Fake the VT */
-    session_set_env (SESSION (greeter_session), "XDG_VTNR", vt_can_multi_seat () ? "1" : "0");
-
-    return greeter_session;
-}
-
-static Session *
-seat_surfaceflinger_create_session (Seat *seat)
-{
-    Session *session;
-
-    session = SEAT_CLASS (seat_surfaceflinger_parent_class)->create_session (seat);
-    session_set_env (session, "XDG_SEAT", seat_get_name (seat));
-
-    /* Fake the VT */
-    session_set_env (session, "XDG_VTNR", vt_can_multi_seat () ? "1" : "0");
-
-    return session;
-}
-
-static void
-seat_surfaceflinger_init (SeatSurfaceflinger *seat)
-{
-}
-
-static void
-seat_surfaceflinger_class_init (SeatSurfaceflingerClass *klass)
-{
-    SeatClass *seat_class = SEAT_CLASS (klass);
-
-    seat_class->setup = seat_surfaceflinger_setup;
-    seat_class->create_display_server = seat_surfaceflinger_create_display_server;
-    seat_class->create_greeter_session = seat_surfaceflinger_create_greeter_session;
-    seat_class->create_session = seat_surfaceflinger_create_session;
-}
diff --git a/src/seat-surfaceflinger.h b/src/seat-surfaceflinger.h
deleted file mode 100644 (file)
index c182d32..0000000
+++ /dev/null
@@ -1,40 +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 _SEAT_SURFACEFLINGER_H_
-#define _SEAT_SURFACEFLINGER_H_
-
-#include <glib-object.h>
-#include "seat.h"
-
-G_BEGIN_DECLS
-
-#define SEAT_SURFACEFLINGER_TYPE (seat_surfaceflinger_get_type())
-#define SEAT_SURFACEFLINGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SEAT_SURFACEFLINGER_TYPE, SeatSurfaceflinger))
-
-typedef struct SeatSurfaceflingerPrivate SeatSurfaceflingerPrivate;
-
-typedef struct
-{
-    Seat              parent_instance;
-    SeatSurfaceflingerPrivate *priv;
-} SeatSurfaceflinger;
-
-typedef struct
-{
-    SeatClass parent_class;
-} SeatSurfaceflingerClass;
-
-GType seat_surfaceflinger_get_type (void);
-
-G_END_DECLS
-
-#endif /* _SEAT_SURFACEFLINGER_H_ */
index 28a96f377403694a989eee313240072e68835e02..45985bb6dfee655808367ced0ae03ce56ec852bc 100644 (file)
@@ -27,6 +27,9 @@ struct SeatUnityPrivate
     /* System compositor */
     UnitySystemCompositor *compositor;
 
+    /* X server being used for XDMCP */
+    XServerLocal *xdmcp_x_server;
+
     /* Next Mir ID to use for a Mir sessions, X server and greeters */
     gint next_session_id;
     gint next_x_server_id;
@@ -39,11 +42,7 @@ struct SeatUnityPrivate
 
 G_DEFINE_TYPE (SeatUnity, seat_unity, SEAT_TYPE);
 
-static gboolean
-seat_unity_get_start_local_sessions (Seat *seat)
-{
-    return !seat_get_string_property (seat, "xdmcp-manager");
-}
+static XServerLocal *create_x_server (Seat *seat);
 
 static void
 seat_unity_setup (Seat *seat)
@@ -52,28 +51,104 @@ seat_unity_setup (Seat *seat)
     SEAT_CLASS (seat_unity_parent_class)->setup (seat);
 }
 
+static void
+check_stopped (SeatUnity *seat)
+{
+    if (!seat->priv->compositor && !seat->priv->xdmcp_x_server)
+        SEAT_CLASS (seat_unity_parent_class)->stop (SEAT (seat));
+}
+
+static void
+xdmcp_x_server_stopped_cb (DisplayServer *display_server, Seat *seat)
+{
+    l_debug (seat, "XDMCP X server stopped");
+
+    g_signal_handlers_disconnect_matched (SEAT_UNITY (seat)->priv->xdmcp_x_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat);
+    SEAT_UNITY (seat)->priv->xdmcp_x_server = NULL;
+
+    g_object_unref (display_server);
+
+    if (seat_get_is_stopping (seat))
+        check_stopped (SEAT_UNITY (seat));
+    else
+        seat_stop (seat);
+}
+
 static void
 compositor_ready_cb (UnitySystemCompositor *compositor, SeatUnity *seat)
 {
-    l_debug (seat, "Compositor ready"); 
+    const gchar *xdmcp_manager = NULL;
+
+    l_debug (seat, "Compositor ready");
+
+    /* If running as an XDMCP client then just start an X server */
+    xdmcp_manager = seat_get_string_property (SEAT (seat), "xdmcp-manager");
+    if (xdmcp_manager)
+    {
+        const gchar *key_name = NULL;
+        gint port = 0;
+
+        seat->priv->xdmcp_x_server = create_x_server (SEAT (seat));
+        x_server_local_set_xdmcp_server (seat->priv->xdmcp_x_server, xdmcp_manager);
+        port = seat_get_integer_property (SEAT (seat), "xdmcp-port");
+        if (port > 0)
+            x_server_local_set_xdmcp_port (seat->priv->xdmcp_x_server, port);
+        key_name = seat_get_string_property (SEAT (seat), "xdmcp-key");
+        if (key_name)
+        {
+            gchar *dir, *path;
+            GKeyFile *keys;
+            gboolean result;
+            GError *error = NULL;
+
+            dir = config_get_string (config_get_instance (), "LightDM", "config-directory");
+            path = g_build_filename (dir, "keys.conf", NULL);
+            g_free (dir);
+
+            keys = g_key_file_new ();
+            result = g_key_file_load_from_file (keys, path, G_KEY_FILE_NONE, &error);
+            if (error)
+                l_debug (seat, "Error getting key %s", error->message);
+            g_clear_error (&error);      
+
+            if (result)
+            {
+                gchar *key = NULL;
+
+                if (g_key_file_has_key (keys, "keyring", key_name, NULL))
+                    key = g_key_file_get_string (keys, "keyring", key_name, NULL);
+                else
+                    l_debug (seat, "Key %s not defined", key_name);
+
+                if (key)
+                    x_server_local_set_xdmcp_key (seat->priv->xdmcp_x_server, key);
+                g_free (key);
+            }
+
+            g_free (path);
+            g_key_file_free (keys);
+        }
+
+        g_signal_connect (seat->priv->xdmcp_x_server, "stopped", G_CALLBACK (xdmcp_x_server_stopped_cb), seat);
+        if (!display_server_start (DISPLAY_SERVER (seat->priv->xdmcp_x_server)))
+            seat_stop (SEAT (seat));
+    }
+
     SEAT_CLASS (seat_unity_parent_class)->start (SEAT (seat));
 }
 
 static void
 compositor_stopped_cb (UnitySystemCompositor *compositor, SeatUnity *seat)
 {
+    l_debug (seat, "Compositor stopped");
+
     g_object_unref (seat->priv->compositor);
     seat->priv->compositor = NULL;
 
     if (seat_get_is_stopping (SEAT (seat)))
-    {
-        SEAT_CLASS (seat_unity_parent_class)->stop (SEAT (seat));
-        return;
-    }
-
-    l_debug (seat, "Stopping Unity seat, compositor terminated");
-
-    seat_stop (SEAT (seat));
+        check_stopped (seat);
+    else
+        seat_stop (SEAT (seat));
 }
 
 static gboolean
@@ -104,27 +179,26 @@ seat_unity_start (Seat *seat)
         return FALSE;
     }
 
-    timeout = seat_get_integer_property (seat, "unity-compositor-timeout");
+    timeout = seat_get_integer_property (SEAT (seat), "unity-compositor-timeout");
     if (timeout <= 0)
         timeout = 60;
 
     SEAT_UNITY (seat)->priv->compositor = unity_system_compositor_new ();
     g_signal_connect (SEAT_UNITY (seat)->priv->compositor, "ready", G_CALLBACK (compositor_ready_cb), seat);
     g_signal_connect (SEAT_UNITY (seat)->priv->compositor, "stopped", G_CALLBACK (compositor_stopped_cb), seat);
-    unity_system_compositor_set_command (SEAT_UNITY (seat)->priv->compositor, seat_get_string_property (seat, "unity-compositor-command"));
+    unity_system_compositor_set_command (SEAT_UNITY (seat)->priv->compositor, seat_get_string_property (SEAT (seat), "unity-compositor-command"));
     unity_system_compositor_set_vt (SEAT_UNITY (seat)->priv->compositor, vt);
     unity_system_compositor_set_timeout (SEAT_UNITY (seat)->priv->compositor, timeout);
 
     return display_server_start (DISPLAY_SERVER (SEAT_UNITY (seat)->priv->compositor));
 }
 
-static DisplayServer *
+static XServerLocal *
 create_x_server (Seat *seat)
 {
     XServerLocal *x_server;
-    const gchar *command = NULL, *layout = NULL, *config_file = NULL, *xdmcp_manager = NULL, *key_name = NULL;
+    const gchar *command = NULL, *layout = NULL, *config_file = NULL;
     gboolean allow_tcp;
-    gint port = 0;
     gchar *id;
 
     l_debug (seat, "Starting X server on Unity compositor");
@@ -154,51 +228,7 @@ create_x_server (Seat *seat)
     allow_tcp = seat_get_boolean_property (seat, "xserver-allow-tcp");
     x_server_local_set_allow_tcp (x_server, allow_tcp);
 
-    xdmcp_manager = seat_get_string_property (seat, "xdmcp-manager");
-    if (xdmcp_manager)
-        x_server_local_set_xdmcp_server (x_server, xdmcp_manager);
-
-    port = seat_get_integer_property (seat, "xdmcp-port");
-    if (port > 0)
-        x_server_local_set_xdmcp_port (x_server, port);
-
-    key_name = seat_get_string_property (seat, "xdmcp-key");
-    if (key_name)
-    {
-        gchar *dir, *path;
-        GKeyFile *keys;
-        gboolean result;
-        GError *error = NULL;
-
-        dir = config_get_string (config_get_instance (), "LightDM", "config-directory");
-        path = g_build_filename (dir, "keys.conf", NULL);
-        g_free (dir);
-
-        keys = g_key_file_new ();
-        result = g_key_file_load_from_file (keys, path, G_KEY_FILE_NONE, &error);
-        if (error)
-            l_debug (seat, "Error getting key %s", error->message);
-        g_clear_error (&error);
-
-        if (result)
-        {
-            gchar *key = NULL;
-
-            if (g_key_file_has_key (keys, "keyring", key_name, NULL))
-                key = g_key_file_get_string (keys, "keyring", key_name, NULL);
-            else
-                l_debug (seat, "Key %s not defined", key_name);
-
-            if (key)
-                x_server_local_set_xdmcp_key (x_server, key);
-            g_free (key);
-        }
-
-        g_free (path);
-        g_key_file_free (keys);
-    }
-
-    return DISPLAY_SERVER (x_server);
+    return x_server;
 }
 
 static DisplayServer *
@@ -213,10 +243,13 @@ create_mir_server (Seat *seat)
 }
 
 static DisplayServer *
-seat_unity_create_display_server (Seat *seat, const gchar *session_type)
+seat_unity_create_display_server (Seat *seat, Session *session)
 {  
+    const gchar *session_type;
+  
+    session_type = session_get_session_type (session);
     if (strcmp (session_type, "x") == 0)
-        return create_x_server (seat);
+        return DISPLAY_SERVER (create_x_server (seat));
     else if (strcmp (session_type, "mir") == 0)
         return create_mir_server (seat);
     else
@@ -365,12 +398,13 @@ seat_unity_stop (Seat *seat)
 {
     /* Stop the compositor first */
     if (SEAT_UNITY (seat)->priv->compositor)
-    {
         display_server_stop (DISPLAY_SERVER (SEAT_UNITY (seat)->priv->compositor));
-        return;
-    }
 
-    SEAT_CLASS (seat_unity_parent_class)->stop (seat);
+    /* Stop the XDMCP X server first */
+    if (SEAT_UNITY (seat)->priv->xdmcp_x_server)
+        display_server_stop (DISPLAY_SERVER (SEAT_UNITY (seat)->priv->xdmcp_x_server));
+
+    check_stopped (SEAT_UNITY (seat));
 }
 
 static void
@@ -386,6 +420,11 @@ seat_unity_finalize (GObject *object)
 
     if (seat->priv->compositor)
         g_object_unref (seat->priv->compositor);
+    if (seat->priv->xdmcp_x_server)
+    {
+        g_signal_handlers_disconnect_matched (seat->priv->xdmcp_x_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat);
+        g_object_unref (seat->priv->xdmcp_x_server);
+    }
     if (seat->priv->active_session)
         g_object_unref (seat->priv->active_session);
     if (seat->priv->active_display_server)
@@ -401,7 +440,6 @@ seat_unity_class_init (SeatUnityClass *klass)
     SeatClass *seat_class = SEAT_CLASS (klass);
 
     object_class->finalize = seat_unity_finalize;
-    seat_class->get_start_local_sessions = seat_unity_get_start_local_sessions;
     seat_class->setup = seat_unity_setup;
     seat_class->start = seat_unity_start;
     seat_class->create_display_server = seat_unity_create_display_server;
index 62a21f460159e330e0c0d50ee71c0f695fcbc045..5aebef9a2871edebff79209622c86e27a173fa71 100644 (file)
@@ -34,13 +34,13 @@ seat_xdmcp_session_new (XDMCPSession *session)
 }
 
 static DisplayServer *
-seat_xdmcp_session_create_display_server (Seat *seat, const gchar *session_type)
+seat_xdmcp_session_create_display_server (Seat *seat, Session *session)
 {
     XAuthority *authority;
     gchar *host;
     XServerRemote *x_server;
 
-    if (strcmp (session_type, "x") != 0)
+    if (strcmp (session_get_session_type (session), "x") != 0)
         return NULL;
 
     authority = xdmcp_session_get_authority (SEAT_XDMCP_SESSION (seat)->priv->session);
index c9dd8cf4950437053649c138baa9fe564aa7ecdc..b6e8d0e69e7486d36db71e29eef4cf115dfc3198 100644 (file)
 #include "plymouth.h"
 #include "vt.h"
 
+struct SeatXLocalPrivate
+{
+    /* X server being used for XDMCP */
+    XServerLocal *xdmcp_x_server;
+};
+
 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 XServerLocal *create_x_server (Seat *seat);
 
 static void
 seat_xlocal_setup (Seat *seat)
@@ -34,9 +36,86 @@ seat_xlocal_setup (Seat *seat)
     SEAT_CLASS (seat_xlocal_parent_class)->setup (seat);
 }
 
+static void
+check_stopped (SeatXLocal *seat)
+{
+    if (!seat->priv->xdmcp_x_server)
+        SEAT_CLASS (seat_xlocal_parent_class)->stop (SEAT (seat));
+}
+
+static void
+xdmcp_x_server_stopped_cb (DisplayServer *display_server, Seat *seat)
+{
+    l_debug (seat, "XDMCP X server stopped");
+
+    g_signal_handlers_disconnect_matched (SEAT_XLOCAL (seat)->priv->xdmcp_x_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat);
+    SEAT_XLOCAL (seat)->priv->xdmcp_x_server = NULL;
+    g_object_unref (display_server);
+    
+    if (seat_get_is_stopping (seat))
+        check_stopped (SEAT_XLOCAL (seat));
+    else
+        seat_stop (seat);
+}
+
 static gboolean
 seat_xlocal_start (Seat *seat)
 {
+    const gchar *xdmcp_manager = NULL;
+
+    /* If running as an XDMCP client then just start an X server */
+    xdmcp_manager = seat_get_string_property (seat, "xdmcp-manager");
+    if (xdmcp_manager)
+    {
+        SeatXLocal *s = SEAT_XLOCAL (seat);
+        const gchar *key_name = NULL;
+        gint port = 0;
+
+        s->priv->xdmcp_x_server = create_x_server (seat);
+        x_server_local_set_xdmcp_server (s->priv->xdmcp_x_server, xdmcp_manager);
+        port = seat_get_integer_property (seat, "xdmcp-port");
+        if (port > 0)
+            x_server_local_set_xdmcp_port (s->priv->xdmcp_x_server, port);
+        key_name = seat_get_string_property (seat, "xdmcp-key");
+        if (key_name)
+        {
+            gchar *dir, *path;
+            GKeyFile *keys;
+            gboolean result;
+            GError *error = NULL;
+
+            dir = config_get_string (config_get_instance (), "LightDM", "config-directory");
+            path = g_build_filename (dir, "keys.conf", NULL);
+            g_free (dir);
+
+            keys = g_key_file_new ();
+            result = g_key_file_load_from_file (keys, path, G_KEY_FILE_NONE, &error);
+            if (error)
+                l_debug (seat, "Error getting key %s", error->message);
+            g_clear_error (&error);      
+
+            if (result)
+            {
+                gchar *key = NULL;
+
+                if (g_key_file_has_key (keys, "keyring", key_name, NULL))
+                    key = g_key_file_get_string (keys, "keyring", key_name, NULL);
+                else
+                    l_debug (seat, "Key %s not defined", key_name);
+
+                if (key)
+                    x_server_local_set_xdmcp_key (s->priv->xdmcp_x_server, key);
+                g_free (key);
+            }
+
+            g_free (path);
+            g_key_file_free (keys);
+        }
+
+        g_signal_connect (s->priv->xdmcp_x_server, "stopped", G_CALLBACK (xdmcp_x_server_stopped_cb), seat);
+        return display_server_start (DISPLAY_SERVER (s->priv->xdmcp_x_server));
+    }
+
     return SEAT_CLASS (seat_xlocal_parent_class)->start (seat);
 }
 
@@ -87,13 +166,13 @@ get_vt (Seat *seat, DisplayServer *display_server)
     return vt;
 }
 
-static DisplayServer *
+static XServerLocal *
 create_x_server (Seat *seat)
 {
     XServerLocal *x_server;
-    const gchar *command = NULL, *layout = NULL, *config_file = NULL, *xdmcp_manager = NULL, *key_name = NULL;
+    const gchar *command = NULL, *layout = NULL, *config_file = NULL;
     gboolean allow_tcp;
-    gint vt, port = 0;
+    gint vt;
 
     x_server = x_server_local_new ();
 
@@ -127,51 +206,7 @@ create_x_server (Seat *seat)
     allow_tcp = seat_get_boolean_property (seat, "xserver-allow-tcp");
     x_server_local_set_allow_tcp (x_server, allow_tcp);    
 
-    xdmcp_manager = seat_get_string_property (seat, "xdmcp-manager");
-    if (xdmcp_manager)
-        x_server_local_set_xdmcp_server (x_server, xdmcp_manager);
-
-    port = seat_get_integer_property (seat, "xdmcp-port");
-    if (port > 0)
-        x_server_local_set_xdmcp_port (x_server, port);
-
-    key_name = seat_get_string_property (seat, "xdmcp-key");
-    if (key_name)
-    {
-        gchar *dir, *path;
-        GKeyFile *keys;
-        gboolean result;
-        GError *error = NULL;
-
-        dir = config_get_string (config_get_instance (), "LightDM", "config-directory");
-        path = g_build_filename (dir, "keys.conf", NULL);
-        g_free (dir);
-
-        keys = g_key_file_new ();
-        result = g_key_file_load_from_file (keys, path, G_KEY_FILE_NONE, &error);
-        if (error)
-            l_debug (seat, "Error getting key %s", error->message);
-        g_clear_error (&error);      
-
-        if (result)
-        {
-            gchar *key = NULL;
-
-            if (g_key_file_has_key (keys, "keyring", key_name, NULL))
-                key = g_key_file_get_string (keys, "keyring", key_name, NULL);
-            else
-                l_debug (seat, "Key %s not defined", key_name);
-
-            if (key)
-                x_server_local_set_xdmcp_key (x_server, key);
-            g_free (key);
-        }
-
-        g_free (path);
-        g_key_file_free (keys);
-    }
-
-    return DISPLAY_SERVER (x_server);
+    return x_server;
 }
 
 static DisplayServer *
@@ -212,12 +247,27 @@ create_unity_system_compositor (Seat *seat)
 }
 
 static DisplayServer *
-seat_xlocal_create_display_server (Seat *seat, const gchar *session_type)
+seat_xlocal_create_display_server (Seat *seat, Session *session)
 {
+    const gchar *session_type;
+
+    session_type = session_get_session_type (session);
     if (strcmp (session_type, "x") == 0)
-        return create_x_server (seat);
+        return DISPLAY_SERVER (create_x_server (seat));
     else if (strcmp (session_type, "mir") == 0)
         return create_unity_system_compositor (seat);
+    else if (strcmp (session_type, "mir-container") == 0)
+    {
+        DisplayServer *compositor;
+        const gchar *compositor_command;
+
+        compositor = create_unity_system_compositor (seat);
+        compositor_command = session_config_get_compositor_command (session_get_config (session));
+        if (compositor_command)
+            unity_system_compositor_set_command (UNITY_SYSTEM_COMPOSITOR (compositor), compositor_command);
+      
+        return compositor;
+    }
     else
     {
         l_warning (seat, "Can't create unsupported display server '%s'", session_type);
@@ -301,17 +351,44 @@ seat_xlocal_run_script (Seat *seat, DisplayServer *display_server, Process *scri
     SEAT_CLASS (seat_xlocal_parent_class)->run_script (seat, display_server, script);
 }
 
+static void
+seat_xlocal_stop (Seat *seat)
+{
+    /* Stop the XDMCP X server first */
+    if (SEAT_XLOCAL (seat)->priv->xdmcp_x_server)
+        display_server_stop (DISPLAY_SERVER (SEAT_XLOCAL (seat)->priv->xdmcp_x_server));
+
+    check_stopped (SEAT_XLOCAL (seat));
+}
+
 static void
 seat_xlocal_init (SeatXLocal *seat)
 {
+    seat->priv = G_TYPE_INSTANCE_GET_PRIVATE (seat, SEAT_XLOCAL_TYPE, SeatXLocalPrivate);
+}
+
+static void
+seat_xlocal_finalize (GObject *object)
+{
+    SeatXLocal *seat = SEAT_XLOCAL (object);
+
+    if (seat->priv->xdmcp_x_server)
+    {
+        g_signal_handlers_disconnect_matched (seat->priv->xdmcp_x_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat);
+        g_object_unref (seat->priv->xdmcp_x_server);
+    }
+
+    G_OBJECT_CLASS (seat_xlocal_parent_class)->finalize (object);
 }
 
 static void
 seat_xlocal_class_init (SeatXLocalClass *klass)
 {
+    GObjectClass *object_class = G_OBJECT_CLASS (klass);
     SeatClass *seat_class = SEAT_CLASS (klass);
 
-    seat_class->get_start_local_sessions = seat_xlocal_get_start_local_sessions;
+    object_class->finalize = seat_xlocal_finalize;
+
     seat_class->setup = seat_xlocal_setup;
     seat_class->start = seat_xlocal_start;
     seat_class->create_display_server = seat_xlocal_create_display_server;
@@ -320,4 +397,7 @@ seat_xlocal_class_init (SeatXLocalClass *klass)
     seat_class->set_active_session = seat_xlocal_set_active_session;
     seat_class->get_active_session = seat_xlocal_get_active_session;
     seat_class->run_script = seat_xlocal_run_script;
+    seat_class->stop = seat_xlocal_stop;
+
+    g_type_class_add_private (klass, sizeof (SeatXLocalPrivate));
 }
index 44cafc49fea70f75e8e932ed97c33eeb42078f77..d7af16aaa021cb846ca93a47c60edbb3b85c8844 100644 (file)
@@ -25,12 +25,14 @@ seat_xremote_setup (Seat *seat)
 }
 
 static DisplayServer *
-seat_xremote_create_display_server (Seat *seat, const gchar *session_type)
+seat_xremote_create_display_server (Seat *seat, Session *session)
 {
+    const gchar *session_type;
     XServerRemote *x_server;
     const gchar *hostname;
     gint number;
 
+    session_type = session_get_session_type (session);
     if (strcmp (session_type, "x") != 0)
     {
         l_warning (seat, "X remote seat only supports X display servers, not '%s'", session_type);
index ecabc9b21ff4b0153b9797af55e4c67a34b353af..fa7737ecd53dd377e08814bb922fc34de4764190 100644 (file)
@@ -34,12 +34,12 @@ SeatXVNC *seat_xvnc_new (GSocket *connection)
 }
 
 static DisplayServer *
-seat_xvnc_create_display_server (Seat *seat, const gchar *session_type)
+seat_xvnc_create_display_server (Seat *seat, Session *session)
 {
     XServerXVNC *x_server;
     const gchar *command = NULL;
 
-    if (strcmp (session_type, "x") != 0)
+    if (strcmp (session_get_session_type (session), "x") != 0)
         return NULL;
   
     x_server = x_server_xvnc_new ();
index 619dbac9456c797c057a15c83938e34428b7f005..cca8e6f2549ef72e50065a4667bdf625e1b404ef 100644 (file)
@@ -78,7 +78,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, const gchar *session_type);
+static DisplayServer *create_display_server (Seat *seat, Session *session);
 static Greeter *create_greeter_session (Seat *seat);
 static void start_session (Seat *seat, Session *session);
 
@@ -182,9 +182,13 @@ gboolean
 seat_start (Seat *seat)
 {
     g_return_val_if_fail (seat != NULL, FALSE);
-  
+
+    l_debug (seat, "Starting");
+
     SEAT_GET_CLASS (seat)->setup (seat);
-    return SEAT_GET_CLASS (seat)->start (seat);
+    seat->priv->started = SEAT_GET_CLASS (seat)->start (seat);
+
+    return seat->priv->started;
 }
 
 GList *
@@ -367,12 +371,6 @@ check_stopped (Seat *seat)
     }
 }
 
-static gboolean
-get_start_local_sessions (Seat *seat)
-{
-    return SEAT_GET_CLASS (seat)->get_start_local_sessions (seat);
-}
-
 static void
 display_server_stopped_cb (DisplayServer *display_server, Seat *seat)
 {
@@ -422,7 +420,7 @@ display_server_stopped_cb (DisplayServer *display_server, Seat *seat)
     }
     g_list_free_full (list, g_object_unref);
 
-    if (!seat->priv->stopping && get_start_local_sessions (seat))
+    if (!seat->priv->stopping)
     {
         /* If we were the active session, switch to a greeter */
         active_session = seat_get_active_session (seat);
@@ -529,7 +527,7 @@ switch_to_greeter_from_failed_session (Seat *seat, Session *session)
         {
             DisplayServer *display_server;
 
-            display_server = create_display_server (seat, session_get_session_type (session));
+            display_server = create_display_server (seat, session);
             session_set_display_server (session, display_server);
             if (!display_server_start (display_server))
             {
@@ -939,7 +937,7 @@ configure_session (Session *session, SessionConfig *config, const gchar *session
 {
     const gchar *desktop_name;
 
-    session_set_session_type (session, session_config_get_session_type (config));
+    session_set_config (session, config);
     session_set_env (session, "XDG_SESSION_DESKTOP", session_name);
     session_set_env (session, "DESKTOP_SESSION", session_name);
     session_set_env (session, "GDMSESSION", session_name);
@@ -1065,7 +1063,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_config (session, session_get_config (SESSION (greeter)));
     session_set_display_server (session, session_get_display_server (SESSION (greeter)));
 
     return g_object_ref (session);
@@ -1172,7 +1170,7 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi
     /* Otherwise start a new display server for this session */
     else
     {
-        display_server = create_display_server (seat, session_get_session_type (session));
+        display_server = create_display_server (seat, session);
         session_set_display_server (session, display_server);
         if (!display_server_start (display_server))
         {
@@ -1214,7 +1212,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));
+    session_set_config (SESSION (greeter_session), session_config);
     seat->priv->sessions = g_list_append (seat->priv->sessions, SESSION (greeter_session));
     g_signal_connect (greeter_session, "notify::active-username", G_CALLBACK (greeter_active_username_changed_cb), seat);
     g_signal_connect (greeter_session, "authentication-complete", G_CALLBACK (session_authentication_complete_cb), seat);
@@ -1303,10 +1301,6 @@ display_server_ready_cb (DisplayServer *display_server, Seat *seat)
         return;
     }
 
-    /* Stop if don't need to run a session */
-    if (!get_start_local_sessions (seat))
-        return;
-
     emit_upstart_signal ("login-session-start");
 
     /* Start the session waiting for this display server */
@@ -1332,13 +1326,13 @@ display_server_ready_cb (DisplayServer *display_server, Seat *seat)
 }
 
 static DisplayServer *
-create_display_server (Seat *seat, const gchar *session_type)
+create_display_server (Seat *seat, Session *session)
 {
     DisplayServer *display_server;
 
-    l_debug (seat, "Creating display server of type %s", session_type);
+    l_debug (seat, "Creating display server of type %s", session_get_session_type (session));
 
-    display_server = SEAT_GET_CLASS (seat)->create_display_server (seat, session_type);
+    display_server = SEAT_GET_CLASS (seat)->create_display_server (seat, session);
     if (!display_server)
         return NULL;
 
@@ -1377,7 +1371,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, session_get_session_type (SESSION (greeter_session)));
+    display_server = create_display_server (seat, SESSION (greeter_session));
     session_set_display_server (SESSION (greeter_session), display_server);
 
     return display_server_start (display_server);
@@ -1409,7 +1403,7 @@ switch_authentication_complete_cb (Session *session, Seat *seat)
             if (seat->priv->session_to_activate)
                 g_object_unref (seat->priv->session_to_activate);
             seat->priv->session_to_activate = g_object_ref (session);
-            display_server = create_display_server (seat, session_get_session_type (session));
+            display_server = create_display_server (seat, session);
             session_set_display_server (session, display_server);
             display_server_start (display_server);
         }
@@ -1449,7 +1443,7 @@ switch_authentication_complete_cb (Session *session, 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, session_get_session_type (SESSION (greeter_session)));
+        display_server = create_display_server (seat, SESSION (greeter_session));
         session_set_display_server (SESSION (greeter_session), display_server);
         display_server_start (display_server);
     }
@@ -1520,7 +1514,7 @@ seat_switch_to_guest (Seat *seat, const gchar *session_name)
     if (!session)
         return FALSE;
 
-    display_server = create_display_server (seat, session_get_session_type (session));
+    display_server = create_display_server (seat, session);
 
     if (seat->priv->session_to_activate)
         g_object_unref (seat->priv->session_to_activate);
@@ -1572,7 +1566,7 @@ seat_lock (Seat *seat, const gchar *username)
     }
     else
     {
-        display_server = create_display_server (seat, session_get_session_type (SESSION (greeter_session)));
+        display_server = create_display_server (seat, SESSION (greeter_session));
 
         if (seat->priv->session_to_activate)
             g_object_unref (seat->priv->session_to_activate);
@@ -1603,12 +1597,6 @@ seat_get_is_stopping (Seat *seat)
     return seat->priv->stopping;
 }
 
-static gboolean
-seat_real_get_start_local_sessions (Seat *seat)
-{
-    return TRUE;
-}
-
 static void
 seat_real_setup (Seat *seat)
 {
@@ -1623,16 +1611,6 @@ seat_real_start (Seat *seat)
     gboolean autologin_in_background;
     Session *session = NULL, *background_session = NULL;
 
-    l_debug (seat, "Starting");
-
-    /* If this display server doesn't have a session running on it, just start it */
-    if (!get_start_local_sessions (seat))
-    {
-        DisplayServer *display_server;
-        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");
     if (g_strcmp0 (autologin_username, "") == 0)
@@ -1667,7 +1645,7 @@ seat_real_start (Seat *seat)
                 g_object_unref (seat->priv->session_to_activate);
             seat->priv->session_to_activate = g_object_ref (session);
 
-            display_server = create_display_server (seat, session_get_session_type (session));
+            display_server = create_display_server (seat, session);
             session_set_display_server (session, display_server);
             if (!display_server || !display_server_start (display_server))
             {
@@ -1698,7 +1676,7 @@ seat_real_start (Seat *seat)
         seat->priv->session_to_activate = g_object_ref (greeter_session);
         session = SESSION (greeter_session);
 
-        display_server = create_display_server (seat, session_get_session_type (session));
+        display_server = create_display_server (seat, session);
         session_set_display_server (session, display_server);
         if (!display_server || !display_server_start (display_server))
         {
@@ -1722,13 +1700,12 @@ seat_real_start (Seat *seat)
     {
         DisplayServer *background_display_server;
 
-        background_display_server = create_display_server (seat, session_get_session_type (background_session));
+        background_display_server = create_display_server (seat, background_session);
         session_set_display_server (background_session, background_display_server);
         if (!display_server_start (background_display_server))
             l_warning (seat, "Failed to start display server for background session");
     }
 
-    seat->priv->started = TRUE;
     return TRUE;
 }
 
@@ -1843,7 +1820,6 @@ seat_class_init (SeatClass *klass)
 {
     GObjectClass *object_class = G_OBJECT_CLASS (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;
index 093f26eb89bfe4be410ecb73f0d84e61ab6cb370..faa4a0a4254203f68c78436d1e7c7846fa4907fd 100644 (file)
@@ -30,7 +30,7 @@ typedef struct SeatPrivate SeatPrivate;
 
 typedef struct
 {
-    GObject         parent_instance;
+    GObject      parent_instance;
     SeatPrivate *priv;
 } Seat;
 
@@ -38,10 +38,9 @@ typedef struct
 {
     GObjectClass parent_class;
 
-    gboolean (*get_start_local_sessions) (Seat *seat);
     void (*setup)(Seat *seat);
     gboolean (*start)(Seat *seat);
-    DisplayServer *(*create_display_server) (Seat *seat, const gchar *session_type);
+    DisplayServer *(*create_display_server) (Seat *seat, Session *session);
     gboolean (*display_server_supports_session_type) (Seat *seat, DisplayServer *display_server, const gchar *session_type);
     Greeter *(*create_greeter_session) (Seat *seat);
     Session *(*create_session) (Seat *seat);
index c62aef399043a1f7f0ab10dc9a4fd8f1f3da3d6e..85081b284b064a449a239a8ce8c2ef55e8b2f2b9 100644 (file)
@@ -21,6 +21,9 @@ struct SessionConfigPrivate
 
     /* Command to run */
     gchar *command;
+
+    /* Compositor command to run (for type mir-container) */
+    gchar *compositor_command;
 };
 
 G_DEFINE_TYPE (SessionConfig, session_config, G_TYPE_OBJECT);
@@ -54,6 +57,8 @@ session_config_new_from_file (const gchar *filename, GError **error)
     config->priv->desktop_name = g_key_file_get_string (desktop_file, G_KEY_FILE_DESKTOP_GROUP, "DesktopNames", NULL);
     if (!config->priv->desktop_name)
         config->priv->desktop_name = g_key_file_get_string (desktop_file, G_KEY_FILE_DESKTOP_GROUP, "X-LightDM-DesktopName", NULL);
+    if (!config->priv->compositor_command)
+        config->priv->compositor_command = g_key_file_get_string (desktop_file, G_KEY_FILE_DESKTOP_GROUP, "X-LightDM-System-Compositor-Command", NULL);
 
     g_key_file_free (desktop_file);
 
@@ -81,6 +86,13 @@ session_config_get_desktop_name (SessionConfig *config)
     return config->priv->desktop_name;
 }
 
+const gchar *
+session_config_get_compositor_command (SessionConfig *config)
+{
+    g_return_val_if_fail (config != NULL, NULL);
+    return config->priv->compositor_command;
+}
+
 static void
 session_config_init (SessionConfig *config)
 {
@@ -95,6 +107,7 @@ session_config_finalize (GObject *object)
     g_free (self->priv->session_type);
     g_free (self->priv->desktop_name);
     g_free (self->priv->command);
+    g_free (self->priv->compositor_command);
 
     G_OBJECT_CLASS (session_config_parent_class)->finalize (object);
 }
index 2fd0efec7081aa4b831392f0320ccf2ef81e4941..25e8002b2a87bc2805afe1aa9e1fcc26a9b1f37e 100644 (file)
@@ -44,6 +44,8 @@ const gchar *session_config_get_session_type (SessionConfig *config);
 
 const gchar *session_config_get_desktop_name (SessionConfig *config);
 
+const gchar *session_config_get_compositor_command (SessionConfig *config);
+
 G_END_DECLS
 
 #endif /* SESSION_CONFIG_H_ */
index bc26870dd502628767e26f0d1612163d9ca5fd3c..4e5060bf601ee7cf4f7b9c40feef932371b6fbbe 100644 (file)
@@ -38,8 +38,8 @@ static guint signals[LAST_SIGNAL] = { 0 };
 
 struct SessionPrivate
 {
-    /* Session type */
-    gchar *session_type;
+    /* Configuration for this session */
+    SessionConfig *config;
 
     /* Display server running on */
     DisplayServer *display_server;
@@ -131,18 +131,27 @@ session_new (void)
 }
 
 void
-session_set_session_type (Session *session, const gchar *session_type)
+session_set_config (Session *session, SessionConfig *config)
 {
     g_return_if_fail (session != NULL);
-    g_free (session->priv->session_type);
-    session->priv->session_type = g_strdup (session_type);
+
+    if (session->priv->config)
+        g_object_unref (session->priv->config);
+    session->priv->config = g_object_ref (config);
+}
+
+SessionConfig *
+session_get_config (Session *session)
+{
+    g_return_val_if_fail (session != NULL, NULL);
+    return session->priv->config;
 }
 
 const gchar *
 session_get_session_type (Session *session)
 {
     g_return_val_if_fail (session != NULL, NULL);
-    return session->priv->session_type;
+    return session_config_get_session_type (session_get_config (session));
 }
 
 void
@@ -904,7 +913,8 @@ session_finalize (GObject *object)
     Session *self = SESSION (object);
     int i;
 
-    g_free (self->priv->session_type);
+    if (self->priv->config)
+        g_object_unref (self->priv->config);
     if (self->priv->display_server)
         g_object_unref (self->priv->display_server);
     if (self->priv->pid)
index 0618296788d707c79d754f0beb8caa0c48f237f3..e820e137e07d051d35431aa3260c3cb49563c54d 100644 (file)
@@ -18,6 +18,7 @@
 
 typedef struct Session Session;
 
+#include "session-config.h"
 #include "display-server.h"
 #include "accounts.h"
 #include "x-authority.h"
@@ -61,7 +62,9 @@ GType session_get_type (void);
 
 Session *session_new (void);
 
-void session_set_session_type (Session *session, const gchar *session_type);
+void session_set_config (Session *session, SessionConfig *config);
+
+SessionConfig *session_get_config (Session *session);
 
 const gchar *session_get_session_type (Session *session);
 
diff --git a/src/surfaceflinger-server.c b/src/surfaceflinger-server.c
deleted file mode 100644 (file)
index 4efe44b..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.
- */
-
-#include <string.h>
-
-#include "surfaceflinger-server.h"
-
-G_DEFINE_TYPE (SurfaceflingerServer, surfaceflinger_server, DISPLAY_SERVER_TYPE);
-
-SurfaceflingerServer *surfaceflinger_server_new (void)
-{
-    return g_object_new (SURFACEFLINGER_SERVER_TYPE, NULL);  
-}
-
-static const gchar *
-surfaceflinger_server_get_session_type (DisplayServer *server)
-{
-    return "surfaceflinger";
-}
-
-static void
-surfaceflinger_server_init (SurfaceflingerServer *server)
-{
-    display_server_set_name (DISPLAY_SERVER (server), "sf");
-}
-
-static void
-surfaceflinger_server_class_init (SurfaceflingerServerClass *klass)
-{
-    DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass);
-
-    display_server_class->get_session_type = surfaceflinger_server_get_session_type;
-}
diff --git a/src/surfaceflinger-server.h b/src/surfaceflinger-server.h
deleted file mode 100644 (file)
index c68d2bf..0000000
+++ /dev/null
@@ -1,47 +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 SURFACEFLINGER_SERVER_H_
-#define SURFACEFLINGER_SERVER_H_
-
-#include <glib-object.h>
-#include "display-server.h"
-
-G_BEGIN_DECLS
-
-#define SURFACEFLINGER_SERVER_TYPE (surfaceflinger_server_get_type())
-#define SURFACEFLINGER_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SURFACEFLINGER_SERVER_TYPE, SurfaceflingerServer))
-#define SURFACEFLINGER_SERVER_CLASS(klass)   (G_TYPE_CHECK_CLASS_CAST ((klass), SURFACEFLINGER_SERVER_TYPE, SurfaceflingerServerClass))
-#define SURFACEFLINGER_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SURFACEFLINGER_SERVER_TYPE, SurfaceflingerServerClass))
-#define IS_SURFACEFLINGER_SERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SURFACEFLINGER_SERVER_TYPE))
-
-typedef struct SurfaceflingerServerPrivate SurfaceflingerServerPrivate;
-
-typedef struct
-{
-    DisplayServer     parent_instance;
-    SurfaceflingerServerPrivate *priv;
-} SurfaceflingerServer;
-
-typedef struct
-{
-    DisplayServerClass parent_class;
-} SurfaceflingerServerClass;
-
-GType surfaceflinger_server_get_type (void);
-
-SurfaceflingerServer *surfaceflinger_server_new (void);
-
-const gchar *surfaceflinger_server_get_id (SurfaceflingerServer *server);
-
-G_END_DECLS
-
-#endif /* SURFACEFLINGER_SERVER_H_ */
index 172d31f30d1a9af386b040941c6b3d77c12c4b55..b6bf516003c67743bfa01839b45c998eff49c9dc 100644 (file)
@@ -187,6 +187,7 @@ TESTS = \
        test-mir-session \
        test-mir-session-crash \
        test-mir-session-compositor-crash \
+       test-mir-container-session \
        test-unity-compositor-command \
        test-unity-compositor-not-found \
        test-unity-compositor-fail-start \
@@ -206,8 +207,7 @@ TESTS = \
        test-unity-mir-session-x-greeter \
        test-unity-mir-switch \
        test-unity-mir-switch-to-user-resettable \
-       test-unity-xdg-seat \
-       test-surfaceflinger-autologin
+       test-unity-xdg-seat
 
 #      test-session-exit-error
 #      test-greeter-no-exit
@@ -337,8 +337,8 @@ EXTRA_DIST = \
        data/sessions/alternative.desktop \
        data/sessions/default.desktop \
        data/sessions/mir.desktop \
+       data/sessions/mir-container.desktop \
        data/sessions/named.desktop \
-       data/sessions/surfaceflinger.desktop \
        scripts/0-additional.conf \
        scripts/1-additional.conf \
        scripts/additional-config.conf \
@@ -440,6 +440,7 @@ EXTRA_DIST = \
        scripts/login-wrong-password.conf \
        scripts/login-xserver-crash.conf \
        scripts/mir-autologin.conf \
+       scripts/mir-container-session.conf \
        scripts/mir-greeter.conf \
        scripts/mir-session.conf \
        scripts/mir-session-compositor-crash.conf \
@@ -474,7 +475,6 @@ EXTRA_DIST = \
        scripts/session-stderr.conf \
        scripts/session-stderr-multi-write.conf \
        scripts/session-stderr-backup.conf \
-       scripts/surfaceflinger-autologin.conf \
        scripts/switch-to-greeter.conf \
        scripts/switch-to-greeter-disabled.conf \
        scripts/switch-to-greeter-new-session.conf \
diff --git a/tests/data/sessions/mir-container.desktop b/tests/data/sessions/mir-container.desktop
new file mode 100644 (file)
index 0000000..72639b3
--- /dev/null
@@ -0,0 +1,6 @@
+[Desktop Entry]
+Name=Test Session
+Comment=LightDM test Mir session
+Exec=test-session
+X-LightDM-Session-Type=mir-container
+X-LightDM-System-Compositor-Command=unity-system-compositor --container
diff --git a/tests/data/sessions/surfaceflinger.desktop b/tests/data/sessions/surfaceflinger.desktop
deleted file mode 100644 (file)
index f9984ce..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-[Desktop Entry]
-Name=Test Session
-Comment=LightDM test Surfaceflinger session
-Exec=test-session
-X-LightDM-Session-Type=surfaceflinger
diff --git a/tests/scripts/mir-container-session.conf b/tests/scripts/mir-container-session.conf
new file mode 100644 (file)
index 0000000..cb259ac
--- /dev/null
@@ -0,0 +1,54 @@
+#
+# Check can login into a containerised Mir session on a VT based seat
+#
+
+[SeatDefaults]
+user-session=mir-container
+
+#?*START-DAEMON
+#?RUNNER DAEMON-START
+
+# X server starts
+#?XSERVER-0 START VT=7 SEAT=seat0
+
+# 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 XDG_SEAT=seat0 XDG_VTNR=7 XDG_SESSION_CLASS=greeter
+#?LOGIN1 ACTIVATE-SESSION SESSION=c0
+#?XSERVER-0 ACCEPT-CONNECT
+#?GREETER-X-0 CONNECT-XSERVER
+#?GREETER-X-0 CONNECT-TO-DAEMON
+#?GREETER-X-0 CONNECTED-TO-DAEMON
+
+# Attempt to 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
+
+# System compositor starts
+#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/lightdm-mir-0 VT=8 ENABLE-HARDWARE-CURSOR=TRUE XDG_VTNR=8 CONTAINER=TRUE
+#?*UNITY-SYSTEM-COMPOSITOR READY
+
+# Switch to system compositor
+#?VT ACTIVATE VT=8
+
+# Greeter terminates
+#?GREETER-X-0 TERMINATE SIGNAL=15
+#?XSERVER-0 TERMINATE SIGNAL=15
+
+# Session starts
+#?SESSION-MIR-session-0 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_GREETER_DATA_DIR=.*/no-password1 XDG_SESSION_TYPE=mir XDG_SESSION_DESKTOP=mir-container USER=no-password1
+#?LOGIN1 ACTIVATE-SESSION SESSION=c1
+
+# Session shown
+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=session-0
+
+# Cleanup
+#?*STOP-DAEMON
+#?SESSION-MIR-session-0 TERMINATE SIGNAL=15
+#?UNITY-SYSTEM-COMPOSITOR TERMINATE SIGNAL=15
+#?RUNNER DAEMON-EXIT STATUS=0
diff --git a/tests/scripts/surfaceflinger-autologin.conf b/tests/scripts/surfaceflinger-autologin.conf
deleted file mode 100644 (file)
index fad7e3b..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-#
-# Check can automatically log into a Surfaceflinger session
-#
-
-[SeatDefaults]
-type=surfaceflinger
-autologin-user=have-password1
-user-session=surfaceflinger
-
-#?*START-DAEMON
-#?RUNNER DAEMON-START
-
-# Session starts (test session doesn't know it's in surfaceflinger)
-#?SESSION-UNKNOWN START XDG_SEAT=seat0 XDG_VTNR=1 XDG_GREETER_DATA_DIR=.*/have-password1 XDG_SESSION_DESKTOP=surfaceflinger USER=have-password1
-#?LOGIN1 ACTIVATE-SESSION SESSION=c0
-
-# Cleanup
-#?*STOP-DAEMON
-#?SESSION-UNKNOWN TERMINATE SIGNAL=15
-#?RUNNER DAEMON-EXIT STATUS=0
index 6efc1baaecbc7380e7844253d98ca1822e1158dc..ab6ea1141eca512ef28c42856612d3e4f7339382 100644 (file)
@@ -144,7 +144,7 @@ main (int argc, char **argv)
 {
     int i;
     GString *status_text;
-    gboolean test = FALSE;
+    gboolean test = FALSE, container = FALSE;
     int vt_number = -1;
     gboolean enable_hardware_cursor = FALSE;
     const gchar *file = NULL;
@@ -188,6 +188,8 @@ main (int argc, char **argv)
         }
         else if (strcmp (arg, "--test") == 0)
             test = TRUE;
+        else if (strcmp (arg, "--container") == 0)
+            container = TRUE;
         else
             return EXIT_FAILURE;
     }
@@ -205,6 +207,8 @@ main (int argc, char **argv)
         g_string_append_printf (status_text, " XDG_VTNR=%s", g_getenv ("XDG_VTNR"));
     if (test)
         g_string_append (status_text, " TEST=TRUE");
+    if (container)
+        g_string_append (status_text, " CONTAINER=TRUE");
     status_notify ("%s", status_text->str);
     g_string_free (status_text, TRUE);
 
diff --git a/tests/test-mir-container-session b/tests/test-mir-container-session
new file mode 100755 (executable)
index 0000000..4af5705
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner mir-container-session test-gobject-greeter
diff --git a/tests/test-surfaceflinger-autologin b/tests/test-surfaceflinger-autologin
deleted file mode 100755 (executable)
index d668d02..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/sh
-./src/dbus-env ./src/test-runner surfaceflinger-autologin test-gobject-greeter