summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2014-09-12 12:04:28 +1200
committerRobert Ancell <robert.ancell@canonical.com>2014-09-12 12:04:28 +1200
commit612a2621160f22153c99e76a12be90586eacff11 (patch)
tree6ccc609837f24743c41ebe004a350d0c4c435725
parentac3b5e59c3f35e325be39a32fe34bfebabd974aa (diff)
downloadlightdm-git-612a2621160f22153c99e76a12be90586eacff11.tar.gz
Add a new session type 'mir-container' that allows the session to run inside a custom system compositor
-rw-r--r--src/seat-surfaceflinger.c6
-rw-r--r--src/seat-unity.c11
-rw-r--r--src/seat-xdmcp-session.c4
-rw-r--r--src/seat-xlocal.c32
-rw-r--r--src/seat-xremote.c4
-rw-r--r--src/seat-xvnc.c4
-rw-r--r--src/seat.c34
-rw-r--r--src/seat.h2
-rw-r--r--src/session-config.c12
-rw-r--r--src/session-config.h2
-rw-r--r--src/session.c24
-rw-r--r--src/session.h5
-rw-r--r--tests/Makefile.am3
-rw-r--r--tests/data/sessions/mir-container.desktop6
-rw-r--r--tests/scripts/mir-autologin.conf3
-rw-r--r--tests/scripts/mir-container-session.conf54
-rw-r--r--tests/scripts/mir-greeter.conf3
-rw-r--r--tests/scripts/mir-session-compositor-crash.conf3
-rw-r--r--tests/scripts/mir-session-crash.conf3
-rw-r--r--tests/scripts/mir-session.conf3
-rw-r--r--tests/src/unity-system-compositor.c6
-rwxr-xr-xtests/test-mir-container-session2
22 files changed, 182 insertions, 44 deletions
diff --git a/src/seat-surfaceflinger.c b/src/seat-surfaceflinger.c
index 4bfdef15..3d7b6437 100644
--- a/src/seat-surfaceflinger.c
+++ b/src/seat-surfaceflinger.c
@@ -25,8 +25,12 @@ seat_surfaceflinger_setup (Seat *seat)
}
static DisplayServer *
-seat_surfaceflinger_create_display_server (Seat *seat, const gchar *session_type)
+seat_surfaceflinger_create_display_server (Seat *seat, Session *session)
{
+ const gchar *session_type;
+
+ session_type = session_get_session_type (session);
+
/* 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)
diff --git a/src/seat-unity.c b/src/seat-unity.c
index ec0678a1..98a0fa33 100644
--- a/src/seat-unity.c
+++ b/src/seat-unity.c
@@ -96,14 +96,12 @@ compositor_ready_cb (UnitySystemCompositor *compositor, SeatUnity *seat)
key_name = seat_get_string_property (SEAT (seat), "xdmcp-key");
if (key_name)
{
- gchar *dir, *path;
+ gchar *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);
+ path = g_build_filename (config_get_directory (config_get_instance ()), "keys.conf", NULL);
keys = g_key_file_new ();
result = g_key_file_load_from_file (keys, path, G_KEY_FILE_NONE, &error);
@@ -243,8 +241,11 @@ 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 DISPLAY_SERVER (create_x_server (seat));
else if (strcmp (session_type, "mir") == 0)
diff --git a/src/seat-xdmcp-session.c b/src/seat-xdmcp-session.c
index 62a21f46..5aebef9a 100644
--- a/src/seat-xdmcp-session.c
+++ b/src/seat-xdmcp-session.c
@@ -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);
diff --git a/src/seat-xlocal.c b/src/seat-xlocal.c
index b29801f6..1f58ea0a 100644
--- a/src/seat-xlocal.c
+++ b/src/seat-xlocal.c
@@ -79,14 +79,12 @@ seat_xlocal_start (Seat *seat)
key_name = seat_get_string_property (seat, "xdmcp-key");
if (key_name)
{
- gchar *dir, *path;
+ gchar *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);
+ path = g_build_filename (config_get_directory (config_get_instance ()), "keys.conf", NULL);
keys = g_key_file_new ();
result = g_key_file_load_from_file (keys, path, G_KEY_FILE_NONE, &error);
@@ -249,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 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);
@@ -287,10 +300,17 @@ seat_xlocal_create_session (Seat *seat)
static void
seat_xlocal_set_active_session (Seat *seat, Session *session)
{
- gint vt = display_server_get_vt (session_get_display_server (session));
+ DisplayServer *display_server;
+
+ display_server = session_get_display_server (session);
+
+ gint vt = display_server_get_vt (display_server);
if (vt >= 0)
vt_set_active (vt);
+ if (IS_UNITY_SYSTEM_COMPOSITOR (display_server))
+ unity_system_compositor_set_active_session (UNITY_SYSTEM_COMPOSITOR (display_server), IS_GREETER (session) ? "greeter-0" : "session-0");
+
SEAT_CLASS (seat_xlocal_parent_class)->set_active_session (seat, session);
}
diff --git a/src/seat-xremote.c b/src/seat-xremote.c
index 44cafc49..d7af16aa 100644
--- a/src/seat-xremote.c
+++ b/src/seat-xremote.c
@@ -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);
diff --git a/src/seat-xvnc.c b/src/seat-xvnc.c
index ecabc9b2..fa7737ec 100644
--- a/src/seat-xvnc.c
+++ b/src/seat-xvnc.c
@@ -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 ();
diff --git a/src/seat.c b/src/seat.c
index 090e1e35..0450a298 100644
--- a/src/seat.c
+++ b/src/seat.c
@@ -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);
@@ -441,7 +441,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))
{
@@ -850,7 +850,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, "DESKTOP_SESSION", session_name);
session_set_env (session, "GDMSESSION", session_name);
desktop_name = session_config_get_desktop_name (config);
@@ -975,7 +975,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);
@@ -1081,7 +1081,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))
{
@@ -1120,7 +1120,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);
@@ -1219,13 +1219,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;
@@ -1279,7 +1279,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);
if (!display_server_start (display_server))
return FALSE;
@@ -1312,7 +1312,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);
}
@@ -1333,7 +1333,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);
}
@@ -1403,7 +1403,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);
@@ -1440,7 +1440,7 @@ seat_lock (Seat *seat, const gchar *username)
if (!greeter_session)
return FALSE;
- 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);
@@ -1521,7 +1521,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))
{
@@ -1565,7 +1565,7 @@ seat_real_start (Seat *seat)
greeter_set_hint (greeter_session, "autologin-guest", "true");
}
- 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))
{
@@ -1589,7 +1589,7 @@ 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");
diff --git a/src/seat.h b/src/seat.h
index 1b861098..faa4a0a4 100644
--- a/src/seat.h
+++ b/src/seat.h
@@ -40,7 +40,7 @@ typedef struct
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);
diff --git a/src/session-config.c b/src/session-config.c
index d8436055..b74373a2 100644
--- a/src/session-config.c
+++ b/src/session-config.c
@@ -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);
@@ -51,6 +54,7 @@ session_config_new_from_file (const gchar *filename, GError **error)
if (!config->priv->session_type)
config->priv->session_type = g_strdup ("x");
config->priv->desktop_name = g_key_file_get_string (desktop_file, G_KEY_FILE_DESKTOP_GROUP, "X-LightDM-DesktopName", NULL);
+ 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);
@@ -78,6 +82,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)
{
@@ -92,6 +103,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);
}
diff --git a/src/session-config.h b/src/session-config.h
index 2fd0efec..25e8002b 100644
--- a/src/session-config.h
+++ b/src/session-config.h
@@ -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_ */
diff --git a/src/session.c b/src/session.c
index f79104de..5169bbda 100644
--- a/src/session.c
+++ b/src/session.c
@@ -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
@@ -902,7 +911,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)
diff --git a/src/session.h b/src/session.h
index 06182967..e820e137 100644
--- a/src/session.h
+++ b/src/session.h
@@ -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/tests/Makefile.am b/tests/Makefile.am
index 4469c6ff..1e9b2dc3 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -184,6 +184,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 \
@@ -332,6 +333,7 @@ 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 \
@@ -432,6 +434,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 \
diff --git a/tests/data/sessions/mir-container.desktop b/tests/data/sessions/mir-container.desktop
new file mode 100644
index 00000000..72639b3a
--- /dev/null
+++ b/tests/data/sessions/mir-container.desktop
@@ -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/scripts/mir-autologin.conf b/tests/scripts/mir-autologin.conf
index 110a01f4..3d419320 100644
--- a/tests/scripts/mir-autologin.conf
+++ b/tests/scripts/mir-autologin.conf
@@ -17,6 +17,9 @@ user-session=mir
#?SESSION-MIR-session-0 START XDG_SEAT=seat0 XDG_VTNR=7 XDG_GREETER_DATA_DIR=.*/have-password1 DESKTOP_SESSION=mir USER=have-password1
#?LOGIN1 ACTIVATE-SESSION SESSION=c0
+# Session shown
+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=session-0
+
# Cleanup
#?*STOP-DAEMON
#?SESSION-MIR-session-0 TERMINATE SIGNAL=15
diff --git a/tests/scripts/mir-container-session.conf b/tests/scripts/mir-container-session.conf
new file mode 100644
index 00000000..1ab8cd2a
--- /dev/null
+++ b/tests/scripts/mir-container-session.conf
@@ -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=/tmp/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 DESKTOP_SESSION=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/mir-greeter.conf b/tests/scripts/mir-greeter.conf
index 3149936a..f616c58a 100644
--- a/tests/scripts/mir-greeter.conf
+++ b/tests/scripts/mir-greeter.conf
@@ -15,6 +15,9 @@
#?GREETER-MIR-greeter-0 CONNECT-TO-DAEMON
#?GREETER-MIR-greeter-0 CONNECTED-TO-DAEMON
+# Greeter shown
+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=greeter-0
+
# Cleanup
#?*STOP-DAEMON
#?GREETER-MIR-greeter-0 TERMINATE SIGNAL=15
diff --git a/tests/scripts/mir-session-compositor-crash.conf b/tests/scripts/mir-session-compositor-crash.conf
index 40004482..ef8383a8 100644
--- a/tests/scripts/mir-session-compositor-crash.conf
+++ b/tests/scripts/mir-session-compositor-crash.conf
@@ -17,6 +17,9 @@ user-session=mir
#?SESSION-MIR-session-0 START XDG_SEAT=seat0 XDG_VTNR=7 XDG_GREETER_DATA_DIR=.*/have-password1 DESKTOP_SESSION=mir USER=have-password1
#?LOGIN1 ACTIVATE-SESSION SESSION=c0
+# Session shown
+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=session-0
+
# Crash system compositor
#?*UNITY-SYSTEM-COMPOSITOR CRASH
diff --git a/tests/scripts/mir-session-crash.conf b/tests/scripts/mir-session-crash.conf
index 867604d4..2ad8979d 100644
--- a/tests/scripts/mir-session-crash.conf
+++ b/tests/scripts/mir-session-crash.conf
@@ -17,6 +17,9 @@ user-session=mir
#?SESSION-MIR-session-0 START XDG_SEAT=seat0 XDG_VTNR=7 XDG_GREETER_DATA_DIR=.*/have-password1 DESKTOP_SESSION=mir USER=have-password1
#?LOGIN1 ACTIVATE-SESSION SESSION=c0
+# Session shown
+#?UNITY-SYSTEM-COMPOSITOR SET-ACTIVE-SESSION ID=session-0
+
# Crash session
#?*SESSION-MIR-session-0 CRASH
diff --git a/tests/scripts/mir-session.conf b/tests/scripts/mir-session.conf
index 2391f5a2..2eaec7a3 100644
--- a/tests/scripts/mir-session.conf
+++ b/tests/scripts/mir-session.conf
@@ -44,6 +44,9 @@ user-session=mir
#?SESSION-MIR-session-0 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_GREETER_DATA_DIR=.*/no-password1 DESKTOP_SESSION=mir 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
diff --git a/tests/src/unity-system-compositor.c b/tests/src/unity-system-compositor.c
index 7b75bc38..cdb70114 100644
--- a/tests/src/unity-system-compositor.c
+++ b/tests/src/unity-system-compositor.c
@@ -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 (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
index 00000000..4af57059
--- /dev/null
+++ b/tests/test-mir-container-session
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner mir-container-session test-gobject-greeter