login1.h \
log-file.c \
log-file.h \
- mir-server.c \
- mir-server.h \
plymouth.c \
plymouth.h \
process.c \
return DISPLAY_SERVER_GET_CLASS (server)->get_session_type (server);
}
+DisplayServer *
+display_server_get_parent (DisplayServer *server)
+{
+ return DISPLAY_SERVER_GET_CLASS (server)->get_parent (server);
+}
+
+static DisplayServer *
+display_server_real_get_parent (DisplayServer *server)
+{
+ return NULL;
+}
+
gboolean
display_server_get_can_share (DisplayServer *server)
{
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ klass->get_parent = display_server_real_get_parent;
klass->get_can_share = display_server_real_get_can_share;
klass->get_vt = display_server_real_get_vt;
klass->start = display_server_real_start;
void (*ready)(DisplayServer *server);
void (*stopped)(DisplayServer *server);
+ DisplayServer *(*get_parent)(DisplayServer *server);
const gchar *(*get_session_type)(DisplayServer *server);
gboolean (*get_can_share)(DisplayServer *server);
gint (*get_vt)(DisplayServer *server);
const gchar *display_server_get_session_type (DisplayServer *server);
+DisplayServer *display_server_get_parent (DisplayServer *server);
+
gboolean display_server_get_can_share (DisplayServer *server);
gint display_server_get_vt (DisplayServer *server);
+++ /dev/null
-/*
- * 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"
-#include "configuration.h"
-#include "vt.h"
-
-struct MirServerPrivate
-{
- /* VT to run on */
- gint vt;
-
- /* Mir socket for this server to talk to parent */
- gchar *parent_socket;
-};
-
-G_DEFINE_TYPE (MirServer, mir_server, DISPLAY_SERVER_TYPE);
-
-MirServer *mir_server_new (void)
-{
- return g_object_new (MIR_SERVER_TYPE, NULL);
-}
-
-void
-mir_server_set_vt (MirServer *server, gint vt)
-{
- g_return_if_fail (server != NULL);
- if (server->priv->vt > 0)
- vt_unref (server->priv->vt);
- server->priv->vt = vt;
- if (vt > 0)
- vt_ref (vt);
-}
-
-void
-mir_server_set_parent_socket (MirServer *server, const gchar *parent_socket)
-{
- g_return_if_fail (server != NULL);
- g_free (server->priv->parent_socket);
- server->priv->parent_socket = g_strdup (parent_socket);
-}
-
-static const gchar *
-mir_server_get_session_type (DisplayServer *server)
-{
- return "mir";
-}
-
-static gint
-mir_server_get_vt (DisplayServer *server)
-{
- return MIR_SERVER (server)->priv->vt;
-}
-
-static void
-mir_server_connect_session (DisplayServer *display_server, Session *session)
-{
- MirServer *server;
-
- session_set_env (session, "XDG_SESSION_TYPE", "mir");
-
- server = MIR_SERVER (display_server);
- if (server->priv->parent_socket)
- session_set_env (session, "MIR_SERVER_HOST_SOCKET", server->priv->parent_socket);
- if (server->priv->vt > 0)
- {
- gchar *value = g_strdup_printf ("%d", server->priv->vt);
- session_set_env (session, "XDG_VTNR", value);
- g_free (value);
- }
-}
-
-static void
-mir_server_disconnect_session (DisplayServer *display_server, Session *session)
-{
- session_unset_env (session, "XDG_SESSION_TYPE");
- session_unset_env (session, "MIR_SERVER_HOST_SOCKET");
- session_unset_env (session, "XDG_VTNR");
-}
-
-static void
-mir_server_init (MirServer *server)
-{
- server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, MIR_SERVER_TYPE, MirServerPrivate);
- server->priv->vt = -1;
- display_server_set_name (DISPLAY_SERVER (server), "mir");
-}
-
-static void
-mir_server_finalize (GObject *object)
-{
- MirServer *self = MIR_SERVER (object);
-
- if (self->priv->vt > 0)
- vt_unref (self->priv->vt);
- g_free (self->priv->parent_socket);
-
- 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_session_type = mir_server_get_session_type;
- display_server_class->get_vt = mir_server_get_vt;
- display_server_class->connect_session = mir_server_connect_session;
- display_server_class->disconnect_session = mir_server_disconnect_session;
- object_class->finalize = mir_server_finalize;
-
- g_type_class_add_private (klass, sizeof (MirServerPrivate));
-}
+++ /dev/null
-/*
- * 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);
-
-void mir_server_set_vt (MirServer *server, gint vt);
-
-void mir_server_set_parent_socket (MirServer *server, const gchar *parent_socket);
-
-G_END_DECLS
-
-#endif /* MIR_SERVER_H_ */
#include "configuration.h"
#include "unity-system-compositor.h"
#include "x-server-xmir.h"
-#include "mir-server.h"
#include "vt.h"
#include "plymouth.h"
/* X server being used for XDMCP */
XServerXmir *xdmcp_x_server;
- /* Next Mir ID to use for a Mir sessions, X server and greeters */
- gint next_session_id;
+ /* Next Mir ID to use for a Xmir servers */
gint next_x_server_id;
- gint next_greeter_id;
/* The currently visible session */
Session *active_session;
return x_server;
}
-static DisplayServer *
-create_mir_server (Seat *seat)
-{
- MirServer *mir_server;
-
- mir_server = mir_server_new ();
- mir_server_set_parent_socket (mir_server, unity_system_compositor_get_socket (SEAT_UNITY (seat)->priv->compositor));
- mir_server_set_vt (mir_server, display_server_get_vt (DISPLAY_SERVER (SEAT_UNITY (seat)->priv->compositor)));
-
- return DISPLAY_SERVER (mir_server);
-}
-
static DisplayServer *
seat_unity_create_display_server (Seat *seat, Session *session)
{
if (strcmp (session_type, "x") == 0)
return DISPLAY_SERVER (create_x_server (seat));
else if (strcmp (session_type, "mir") == 0)
- return create_mir_server (seat);
+ return g_object_ref (SEAT_UNITY (seat)->priv->compositor);
else
{
l_warning (seat, "Can't create unsupported display server '%s'", session_type);
}
}
+static gboolean
+seat_unity_display_server_is_used (Seat *seat, DisplayServer *display_server)
+{
+ if (display_server == DISPLAY_SERVER (SEAT_UNITY (seat)->priv->compositor))
+ return TRUE;
+
+ return SEAT_CLASS (seat_unity_parent_class)->display_server_is_used (seat, display_server);
+}
+
static GreeterSession *
seat_unity_create_greeter_session (Seat *seat)
{
GreeterSession *greeter_session;
- gchar *id;
gint vt;
greeter_session = SEAT_CLASS (seat_unity_parent_class)->create_greeter_session (seat);
session_set_env (SESSION (greeter_session), "XDG_SEAT", seat_get_name (seat));
- id = g_strdup_printf ("greeter-%d", SEAT_UNITY (seat)->priv->next_greeter_id);
- SEAT_UNITY (seat)->priv->next_greeter_id++;
- session_set_env (SESSION (greeter_session), "MIR_SERVER_NAME", id);
- g_free (id);
-
vt = display_server_get_vt (DISPLAY_SERVER (SEAT_UNITY (seat)->priv->compositor));
if (vt >= 0)
{
seat_unity_create_session (Seat *seat)
{
Session *session;
- gchar *id;
gint vt;
session = SEAT_CLASS (seat_unity_parent_class)->create_session (seat);
session_set_env (session, "XDG_SEAT", seat_get_name (seat));
- id = g_strdup_printf ("session-%d", SEAT_UNITY (seat)->priv->next_session_id);
- SEAT_UNITY (seat)->priv->next_session_id++;
- session_set_env (session, "MIR_SERVER_NAME", id);
- g_free (id);
-
vt = display_server_get_vt (DISPLAY_SERVER (SEAT_UNITY (seat)->priv->compositor));
if (vt >= 0)
{
return session;
}
-static void
-seat_unity_set_active_session (Seat *seat, Session *session)
+static const gchar *
+get_mir_id (Session *session)
{
DisplayServer *display_server;
- if (session == SEAT_UNITY (seat)->priv->active_session)
- return;
- SEAT_UNITY (seat)->priv->active_session = g_object_ref (session);
+ if (!session)
+ return NULL;
- display_server = session_get_display_server (session);
- if (SEAT_UNITY (seat)->priv->active_display_server != display_server)
- {
- const gchar *id = NULL;
+ display_server = session_get_display_server (session);
+ if (IS_UNITY_SYSTEM_COMPOSITOR (display_server))
+ return session_get_env (session, "MIR_SERVER_NAME");
+ if (IS_X_SERVER_XMIR (display_server))
+ return x_server_xmir_get_mir_id (X_SERVER_XMIR (display_server));
- SEAT_UNITY (seat)->priv->active_display_server = g_object_ref (display_server);
+ return NULL;
+}
- if (IS_X_SERVER_LOCAL (display_server))
- id = x_server_xmir_get_mir_id (X_SERVER_XMIR (display_server));
- else
- id = session_get_env (session, "MIR_SERVER_NAME");
+static void
+seat_unity_set_active_session (Seat *s, Session *session)
+{
+ SeatUnity *seat = SEAT_UNITY (s);
+ const gchar *old_id, *new_id;
- if (id)
- {
- l_debug (seat, "Switching to Mir session %s", id);
- unity_system_compositor_set_active_session (SEAT_UNITY (seat)->priv->compositor, id);
- }
- else
- l_warning (seat, "Failed to work out session ID");
- }
+ old_id = get_mir_id (seat->priv->active_session);
+ new_id = get_mir_id (session);
+
+ g_clear_object (&seat->priv->active_session);
+ seat->priv->active_session = g_object_ref (session);
+
+ if (g_strcmp0 (old_id, new_id) != 0)
+ unity_system_compositor_set_active_session (seat->priv->compositor, new_id);
- SEAT_CLASS (seat_unity_parent_class)->set_active_session (seat, session);
+ SEAT_CLASS (seat_unity_parent_class)->set_active_session (s, session);
}
static Session *
seat_class->setup = seat_unity_setup;
seat_class->start = seat_unity_start;
seat_class->create_display_server = seat_unity_create_display_server;
+ seat_class->display_server_is_used = seat_unity_display_server_is_used;
seat_class->create_greeter_session = seat_unity_create_greeter_session;
seat_class->create_session = seat_unity_create_session;
seat_class->set_active_session = seat_unity_set_active_session;
// FIXME: Make a get_display_server() that re-uses display servers if supported
static DisplayServer *create_display_server (Seat *seat, Session *session);
+static gboolean start_display_server (Seat *seat, DisplayServer *display_server);
static GreeterSession *create_greeter_session (Seat *seat);
static void start_session (Seat *seat, Session *session);
display_server = create_display_server (seat, session);
session_set_display_server (session, display_server);
- if (!display_server_start (display_server))
+ if (!start_display_server (seat, display_server))
{
l_debug (seat, "Failed to start display server for greeter");
seat_stop (seat);
}
/* Stop the display server if no-longer required */
- if (display_server && !display_server_get_is_stopping (display_server))
+ if (display_server && !display_server_get_is_stopping (display_server) &&
+ !SEAT_GET_CLASS (seat)->display_server_is_used (seat, display_server))
{
- GList *link;
- int n_sessions = 0;
-
- for (link = seat->priv->sessions; link; link = link->next)
- {
- Session *s = link->data;
- if (s == session)
- continue;
- if (session_get_display_server (s) == display_server)
- n_sessions++;
- }
- if (n_sessions == 0)
- {
- l_debug (seat, "Stopping display server, no sessions require it");
- display_server_stop (display_server);
- }
+ l_debug (seat, "Stopping display server, no sessions require it");
+ display_server_stop (display_server);
}
g_signal_emit (seat, signals[SESSION_REMOVED], 0, session);
{
display_server = create_display_server (seat, session);
session_set_display_server (session, display_server);
- if (!display_server_start (display_server))
+ if (!start_display_server (seat, display_server))
{
l_debug (seat, "Failed to start display server for new session");
return FALSE;
for (link = seat->priv->sessions; link; link = link->next)
{
Session *session = link->data;
- if (session_get_display_server (session) == display_server && !session_get_is_stopping (session))
+
+ if (session_get_display_server (session) == display_server &&
+ !session_get_is_stopping (session) &&
+ !session_get_is_run (session))
return session;
}
if (!display_server)
return NULL;
- seat->priv->display_servers = g_list_append (seat->priv->display_servers, display_server);
- g_signal_connect (display_server, DISPLAY_SERVER_SIGNAL_READY, G_CALLBACK (display_server_ready_cb), seat);
- g_signal_connect (display_server, DISPLAY_SERVER_SIGNAL_STOPPED, G_CALLBACK (display_server_stopped_cb), seat);
+ /* Remember this display server */
+ if (!g_list_find (seat->priv->display_servers, display_server))
+ {
+ seat->priv->display_servers = g_list_append (seat->priv->display_servers, display_server);
+ g_signal_connect (display_server, DISPLAY_SERVER_SIGNAL_READY, G_CALLBACK (display_server_ready_cb), seat);
+ g_signal_connect (display_server, DISPLAY_SERVER_SIGNAL_STOPPED, G_CALLBACK (display_server_stopped_cb), seat);
+ }
return display_server;
}
+static gboolean
+start_display_server (Seat *seat, DisplayServer *display_server)
+{
+ if (display_server_get_is_ready (display_server))
+ {
+ display_server_ready_cb (display_server, seat);
+ return TRUE;
+ }
+ else
+ return display_server_start (display_server);
+}
+
gboolean
seat_switch_to_greeter (Seat *seat)
{
display_server = create_display_server (seat, SESSION (greeter_session));
session_set_display_server (SESSION (greeter_session), display_server);
- return display_server_start (display_server);
+ return start_display_server (seat, display_server);
}
static void
seat->priv->session_to_activate = g_object_ref (session);
display_server = create_display_server (seat, session);
session_set_display_server (session, display_server);
- display_server_start (display_server);
+ start_display_server (seat, display_server);
}
return;
display_server = create_display_server (seat, SESSION (greeter_session));
session_set_display_server (SESSION (greeter_session), display_server);
- display_server_start (display_server);
+ start_display_server (seat, display_server);
}
}
session_set_pam_service (session, seat_get_string_property (seat, "pam-autologin-service"));
session_set_display_server (session, display_server);
- return display_server_start (display_server);
+ return start_display_server (seat, display_server);
}
gboolean
return TRUE;
}
else
- return display_server_start (display_server);
+ return start_display_server (seat, display_server);
}
}
display_server = create_display_server (seat, session);
session_set_display_server (session, display_server);
- if (!display_server || !display_server_start (display_server))
+ if (!display_server || !start_display_server (seat, display_server))
{
l_debug (seat, "Can't create display server for automatic login");
session_stop (session);
display_server = create_display_server (seat, session);
session_set_display_server (session, display_server);
- if (!display_server || !display_server_start (display_server))
+ if (!display_server || !start_display_server (seat, display_server))
{
l_debug (seat, "Can't create display server for greeter");
session_stop (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))
+ if (!start_display_server (seat, background_display_server))
l_warning (seat, "Failed to start display server for background session");
}
return TRUE;
}
+static DisplayServer *
+seat_real_create_display_server (Seat *seat, Session *session)
+{
+ return NULL;
+}
+
+static gboolean
+seat_real_display_server_is_used (Seat *seat, DisplayServer *display_server)
+{
+ GList *link;
+
+ for (link = seat->priv->sessions; link; link = link->next)
+ {
+ Session *session = link->data;
+ DisplayServer *d;
+
+ d = session_get_display_server (session);
+ if (d == display_server || display_server_get_parent (d) == display_server)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
static GreeterSession *
seat_real_create_greeter_session (Seat *seat)
{
klass->setup = seat_real_setup;
klass->start = seat_real_start;
+ klass->create_display_server = seat_real_create_display_server;
+ klass->display_server_is_used = seat_real_display_server_is_used;
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;
void (*setup)(Seat *seat);
gboolean (*start)(Seat *seat);
DisplayServer *(*create_display_server) (Seat *seat, Session *session);
- gboolean (*display_server_supports_session_type) (Seat *seat, DisplayServer *display_server, const gchar *session_type);
+ gboolean (*display_server_is_used) (Seat *seat, DisplayServer *display_server);
GreeterSession *(*create_greeter_session) (Seat *seat);
Session *(*create_session) (Seat *seat);
void (*set_active_session)(Seat *seat, Session *session);
void
session_run (Session *session)
{
+ g_return_if_fail (session != NULL);
g_return_if_fail (session->priv->display_server != NULL);
return SESSION_GET_CLASS (session)->run (session);
}
+gboolean
+session_get_is_run (Session *session)
+{
+ g_return_val_if_fail (session != NULL, FALSE);
+ return session->priv->command_run;
+}
+
static void
session_real_run (Session *session)
{
write_data (session, &argc, sizeof (argc));
for (link = session->priv->env; link; link = link->next)
write_string (session, (gchar *) link->data);
-
argc = g_strv_length (session->priv->argv);
write_data (session, &argc, sizeof (argc));
for (i = 0; i < argc; i++)
void session_run (Session *session);
+gboolean session_get_is_run (Session *session);
+
void session_lock (Session *session);
void session_unlock (Session *session);
/* TRUE when received ready signal */
gboolean is_ready;
+
+ /* Counters for Mir IDs to use */
+ int next_session_id;
+ int next_greeter_id;
};
G_DEFINE_TYPE (UnitySystemCompositor, unity_system_compositor, DISPLAY_SERVER_TYPE);
unity_system_compositor_connect_session (DisplayServer *display_server, Session *session)
{
UnitySystemCompositor *compositor = UNITY_SYSTEM_COMPOSITOR (display_server);
- const gchar *name;
session_set_env (session, "XDG_SESSION_TYPE", "mir");
if (compositor->priv->socket)
session_set_env (session, "MIR_SERVER_HOST_SOCKET", compositor->priv->socket);
- if (IS_GREETER_SESSION (session))
- name = "greeter-0";
- else
- name = "session-0";
- session_set_env (session, "MIR_SERVER_NAME", name);
+
+ if (!session_get_env (session, "MIR_SERVER_NAME"))
+ {
+ gchar *name;
+ if (IS_GREETER_SESSION (session))
+ {
+ name = g_strdup_printf ("greeter-%d", compositor->priv->next_greeter_id);
+ compositor->priv->next_greeter_id++;
+ }
+ else
+ {
+ name = g_strdup_printf ("session-%d", compositor->priv->next_session_id);
+ compositor->priv->next_session_id++;
+ }
+ session_set_env (session, "MIR_SERVER_NAME", name);
+ g_free (name);
+ }
if (compositor->priv->vt >= 0)
{
g_string_append_printf (command, " -mirSocket %s", server->priv->mir_socket);
}
+static DisplayServer *
+x_server_xmir_get_parent (DisplayServer *server)
+{
+ return DISPLAY_SERVER (X_SERVER_XMIR (server)->priv->compositor);
+}
+
static gint
x_server_xmir_get_vt (DisplayServer *server)
{
XServerLocalClass *x_server_local_class = X_SERVER_LOCAL_CLASS (klass);
x_server_local_class->add_args = x_server_xmir_add_args;
+ display_server_class->get_parent = x_server_xmir_get_parent;
display_server_class->get_vt = x_server_xmir_get_vt;
display_server_class->start = x_server_xmir_start;
object_class->finalize = x_server_xmir_finalize;
# Script hooks runs
#?SCRIPT-HOOK SESSION-CLEANUP USER=have-password1
-# FIXME: order wrong here?
#?SCRIPT-HOOK DISPLAY-SETUP
-#?SCRIPT-HOOK DISPLAY-STOPPED
#?SCRIPT-HOOK GREETER-SETUP USER=.*
# Greeter starts