}
void
-display_server_setup_session (DisplayServer *server, Session *session)
+display_server_connect_session (DisplayServer *server, Session *session)
{
- return DISPLAY_SERVER_GET_CLASS (server)->setup_session (server, session);
+ return DISPLAY_SERVER_GET_CLASS (server)->connect_session (server, session);
}
static void
-display_server_real_setup_session (DisplayServer *server, Session *session)
+display_server_real_connect_session (DisplayServer *server, Session *session)
+{
+}
+
+void
+display_server_disconnect_session (DisplayServer *server, Session *session)
+{
+ return DISPLAY_SERVER_GET_CLASS (server)->disconnect_session (server, session);
+}
+
+static void
+display_server_real_disconnect_session (DisplayServer *server, Session *session)
{
}
klass->get_can_share = display_server_real_get_can_share;
klass->get_vt = display_server_real_get_vt;
klass->start = display_server_real_start;
- klass->setup_session = display_server_real_setup_session;
+ klass->connect_session = display_server_real_connect_session;
+ klass->disconnect_session = display_server_real_disconnect_session;
klass->stop = display_server_real_stop;
g_type_class_add_private (klass, sizeof (DisplayServerPrivate));
gboolean (*get_can_share)(DisplayServer *server);
gint (*get_vt)(DisplayServer *server);
gboolean (*start)(DisplayServer *server);
- void (*setup_session)(DisplayServer *server, Session *session);
- // FIXME: Also need a cleanup_session in case you switch between server types
+ void (*connect_session)(DisplayServer *server, Session *session);
+ void (*disconnect_session)(DisplayServer *server, Session *session);
void (*stop)(DisplayServer *server);
} DisplayServerClass;
gboolean display_server_start (DisplayServer *server);
-void display_server_setup_session (DisplayServer *server, Session *session);
+void display_server_connect_session (DisplayServer *server, Session *session);
+
+void display_server_disconnect_session (DisplayServer *server, Session *session);
void display_server_stop (DisplayServer *server);
}
static void
-mir_server_setup_session (DisplayServer *display_server, Session *session)
+mir_server_connect_session (DisplayServer *display_server, Session *session)
{
MirServer *server;
}
}
+static void
+mir_server_disconnect_session (DisplayServer *display_server, Session *session)
+{
+ session_unset_env (session, "MIR_ID");
+ session_unset_env (session, "MIR_SERVER_FILE");
+ session_unset_env (session, "MIR_SERVER_VT");
+}
+
static void
mir_server_init (MirServer *server)
{
DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass);
display_server_class->get_vt = mir_server_local_get_vt;
- display_server_class->setup_session = mir_server_setup_session;
+ 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));
}
}
+static gboolean
+seat_unity_display_server_supports_session_type (Seat *seat, DisplayServer *display_server, const gchar *session_type)
+{
+ if (IS_X_SERVER (display_server) && strcmp (session_type, "x") == 0)
+ return TRUE;
+ if (IS_MIR_SERVER (display_server) && strcmp (session_type, "mir") == 0)
+ return TRUE;
+
+ return FALSE;
+}
+
static Greeter *
seat_unity_create_greeter_session (Seat *seat)
{
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_supports_session_type = seat_unity_display_server_supports_session_type;
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;
return DISPLAY_SERVER (x_server);
}
+static DisplayServer *
+create_mir_server (Seat *seat)
+{
+ MirServer *mir_server;
+
+ mir_server = mir_server_new ();
+ mir_server_set_vt (mir_server, vt_get_unused ());
+
+ return DISPLAY_SERVER (mir_server);
+}
+
static DisplayServer *
seat_xlocal_create_display_server (Seat *seat, const gchar *session_type)
{
if (strcmp (session_type, "x") == 0)
return create_x_server (seat);
else if (strcmp (session_type, "mir") == 0)
- return DISPLAY_SERVER (mir_server_new ());
+ return create_mir_server (seat);
else
{
g_warning ("Can't create unsupported display server '%s'", session_type);
}
}
+static gboolean
+seat_xlocal_display_server_supports_session_type (Seat *seat, DisplayServer *display_server, const gchar *session_type)
+{
+ if (IS_X_SERVER (display_server) && strcmp (session_type, "x") == 0)
+ return TRUE;
+ if (IS_MIR_SERVER (display_server) && strcmp (session_type, "mir") == 0)
+ return TRUE;
+
+ return FALSE;
+}
+
static Greeter *
seat_xlocal_create_greeter_session (Seat *seat)
{
seat_class->setup = seat_xlocal_setup;
seat_class->start = seat_xlocal_start;
seat_class->create_display_server = seat_xlocal_create_display_server;
+ seat_class->display_server_supports_session_type = seat_xlocal_display_server_supports_session_type;
seat_class->create_greeter_session = seat_xlocal_create_greeter_session;
seat_class->create_session = seat_xlocal_create_session;
seat_class->set_active_session = seat_xlocal_set_active_session;
g_object_unref (display_server);
}
+static gboolean
+can_share_display_server (Seat *seat, DisplayServer *display_server)
+{
+ return seat->priv->share_display_server && display_server_get_can_share (display_server);
+}
+
static void
switch_to_greeter_from_failed_session (Seat *seat, Session *session)
{
g_object_unref (seat->priv->session_to_activate);
seat->priv->session_to_activate = g_object_ref (greeter_session);
- if (seat->priv->share_display_server && display_server_get_can_share (session_get_display_server (session)))
+ if (can_share_display_server (seat, session_get_display_server (session)))
session_set_display_server (SESSION (greeter_session), session_get_display_server (session));
else
{
/* If this is the greeter session then re-use this display server */
if (IS_GREETER (session) &&
- seat->priv->share_display_server &&
- display_server_get_can_share (display_server) &&
+ can_share_display_server (seat, display_server) &&
greeter_get_start_session (GREETER (session)))
{
GList *link;
SessionConfig *session_config;
Session *session = NULL;
+ g_debug ("Creating user session");
+
/* Load user preferences */
user = accounts_get_user_by_name (username);
if (!user)
return NULL;
}
+static gboolean
+display_server_supports_session_type (Seat *seat, DisplayServer *display_server, const gchar *session_type)
+{
+ return SEAT_GET_CLASS (seat)->display_server_supports_session_type (seat, display_server, session_type);
+}
+
static gboolean
greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *session_name, Seat *seat)
{
User *user;
gchar *sessions_dir = NULL;
gchar **argv;
+ DisplayServer *display_server;
/* Get the session to use */
if (greeter_get_guest_authenticated (greeter))
return FALSE;
}
+ session_set_session_type (session, session_config_get_session_type (session_config));
argv = get_session_argv (session_config, seat_get_string_property (seat, "session-wrapper"));
- g_object_unref (session_config);
session_set_argv (session, argv);
g_strfreev (argv);
session_set_env (session, "DESKTOP_SESSION", session_name);
session_set_env (session, "GDM_LANG", language);
}
+ g_object_unref (session_config);
+
/* If can re-use the display server, stop the greeter first */
- if (seat->priv->share_display_server && display_server_get_can_share (session_get_display_server (SESSION (greeter))))
+ display_server = session_get_display_server (SESSION (greeter));
+ if (can_share_display_server (seat, display_server) &&
+ display_server_supports_session_type (seat, display_server, session_get_session_type (session)))
{
+ g_debug ("Stopping greeter; display server will be re-used for user session");
+
/* Run on the same display server after the greeter has stopped */
- session_set_display_server (session, session_get_display_server (SESSION (greeter)));
+ session_set_display_server (session, display_server);
- g_debug ("Stopping greeter");
+ /* Stop the greeter */
session_stop (SESSION (greeter));
return TRUE;
/* Otherwise start a new display server for this session */
else
{
- DisplayServer *display_server;
-
display_server = create_display_server (seat, session_get_session_type (session));
session_set_display_server (session, display_server);
if (!display_server_start (display_server))
gchar *greeter_user;
const gchar *greeter_wrapper;
+ g_debug ("Creating greeter session");
+
sessions_dir = config_get_string (config_get_instance (), "LightDM", "greeters-directory");
session_config = find_session_config (sessions_dir, seat_get_string_property (seat, "greeter-session"));
g_free (sessions_dir);
{
DisplayServer *display_server;
+ g_debug ("Creating display server of type %s", session_type);
+
display_server = SEAT_GET_CLASS (seat)->create_display_server (seat, session_type);
seat->priv->display_servers = g_list_append (seat->priv->display_servers, display_server);
g_signal_connect (display_server, "ready", G_CALLBACK (display_server_ready_cb), seat);
void (*setup)(Seat *seat);
gboolean (*start)(Seat *seat);
DisplayServer *(*create_display_server) (Seat *seat, const gchar *session_type);
+ 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);
void (*set_active_session)(Seat *seat, Session *session);
g_return_if_fail (session != NULL);
g_return_if_fail (display_server != NULL);
if (session->priv->display_server)
+ {
+ display_server_disconnect_session (session->priv->display_server, session);
g_object_unref (session->priv->display_server);
+ }
session->priv->display_server = g_object_ref (display_server);
}
session->priv->remote_host_name = g_strdup (remote_host_name);
}
+static GList *
+find_env_entry (Session *session, const gchar *name)
+{
+ GList *link;
+
+ for (link = session->priv->env; link; link = link->next)
+ {
+ const gchar *entry = link->data;
+
+ if (g_str_has_prefix (entry, name) && entry[strlen (name)] == '=')
+ return link;
+ }
+
+ return NULL;
+}
+
void
session_set_env (Session *session, const gchar *name, const gchar *value)
{
+ GList *link;
+ gchar *entry;
+
+ g_return_if_fail (session != NULL);
+ g_return_if_fail (value != NULL);
+
+ entry = g_strdup_printf ("%s=%s", name, value);
+
+ link = find_env_entry (session, name);
+ if (link)
+ {
+ g_free (link->data);
+ link->data = entry;
+ }
+ else
+ session->priv->env = g_list_append (session->priv->env, entry);
+}
+
+void
+session_unset_env (Session *session, const gchar *name)
+{
+ GList *link;
+
g_return_if_fail (session != NULL);
- session->priv->env = g_list_append (session->priv->env, g_strdup_printf ("%s=%s", name, value));
+
+ link = find_env_entry (session, name);
+ if (!link)
+ return;
+
+ g_free (link->data);
+ session->priv->env = g_list_remove_link (session->priv->env, link);
}
void
g_return_val_if_fail (session->priv->pid == 0, FALSE);
- display_server_setup_session (session->priv->display_server, session);
+ display_server_connect_session (session->priv->display_server, session);
/* Create pipes to talk to the child */
if (pipe (to_child_pipe) < 0 || pipe (from_child_pipe) < 0)
g_return_if_fail (session->priv->argv != NULL);
g_return_if_fail (session->priv->pid != 0);
- display_server_setup_session (session->priv->display_server, session);
+ display_server_connect_session (session->priv->display_server, session);
session->priv->command_run = TRUE;
void session_set_env (Session *session, const gchar *name, const gchar *value);
+void session_unset_env (Session *session, const gchar *name);
+
void session_set_argv (Session *session, gchar **argv);
// FIXME: Remove
}
static void
-x_server_setup_session (DisplayServer *display_server, Session *session)
+x_server_connect_session (DisplayServer *display_server, Session *session)
{
gint vt;
config_get_boolean (config_get_instance (), "LightDM", "user-authority-in-system-dir"));
}
+static void
+x_server_disconnect_session (DisplayServer *display_server, Session *session)
+{
+ session_set_tty (session, NULL);
+ session_unset_env (session, "XDG_VTNR");
+ session_unset_env (session, "DISPLAY");
+ session_set_xdisplay (session, NULL);
+ session_set_remote_host_name (session, NULL);
+ session_set_x_authority (session, NULL, FALSE);
+}
+
void
x_server_init (XServer *server)
{
DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass);
display_server_class->start = x_server_start;
- display_server_class->setup_session = x_server_setup_session;
+ display_server_class->connect_session = x_server_connect_session;
+ display_server_class->disconnect_session = x_server_disconnect_session;
object_class->finalize = x_server_finalize;
g_type_class_add_private (klass, sizeof (XServerPrivate));