static GHashTable *seat_modules = NULL;
// FIXME: Make a get_display_server() that re-uses display servers if supported
-static DisplayServer *create_display_server (Seat *seat);
+static DisplayServer *create_display_server (Seat *seat, const gchar *session_type);
static Greeter *create_greeter_session (Seat *seat);
static void start_session (Seat *seat, Session *session);
}
}
+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)
{
}
g_list_free_full (list, g_object_unref);
- if (!seat->priv->stopping && display_server_get_start_local_sessions (display_server))
+ if (!seat->priv->stopping && get_start_local_sessions (seat))
{
/* If we were the active session, switch to a greeter */
active_session = seat_get_active_session (seat);
{
DisplayServer *display_server;
- display_server = create_display_server (seat);
+ display_server = create_display_server (seat, session_get_session_type (session));
if (!display_server_start (display_server))
{
g_debug ("Failed to start display server for greeter");
{
DisplayServer *display_server;
- display_server = create_display_server (seat);
+ display_server = create_display_server (seat, session_get_session_type (session));
if (!display_server_start (display_server))
return FALSE;
}
/* Stop if don't need to run a session */
- if (!display_server_get_start_local_sessions (display_server))
+ if (!get_start_local_sessions (seat))
return;
emit_upstart_signal ("login-session-start");
}
static DisplayServer *
-create_display_server (Seat *seat)
+create_display_server (Seat *seat, const gchar *session_type)
{
DisplayServer *display_server;
- display_server = SEAT_GET_CLASS (seat)->create_display_server (seat, "x");
+ display_server = SEAT_GET_CLASS (seat)->create_display_server (seat, session_type);
seat->priv->display_servers = g_list_append (seat->priv->display_servers, display_server);
g_signal_connect (display_server, "ready", G_CALLBACK (display_server_ready_cb), seat);
g_signal_connect (display_server, "stopped", G_CALLBACK (display_server_stopped_cb), seat);
g_object_unref (seat->priv->session_to_activate);
seat->priv->session_to_activate = g_object_ref (greeter_session);
- display_server = create_display_server (seat);
+ display_server = create_display_server (seat, session_get_session_type (SESSION (greeter_session)));
session_set_display_server (SESSION (greeter_session), display_server);
if (!display_server_start (display_server))
return FALSE;
seat->priv->session_to_activate = g_object_ref (session);
session_set_pam_service (session, USER_SERVICE);
- display_server = create_display_server (seat);
+ display_server = create_display_server (seat, session_get_session_type (session));
session_set_display_server (session, display_server);
if (!display_server_start (display_server))
return FALSE;
return TRUE;
}
- display_server = create_display_server (seat);
- if (!display_server_start (display_server))
- return FALSE;
-
session = create_guest_session (seat);
if (!session)
return FALSE;
+
+ display_server = create_display_server (seat, session_get_session_type (session));
+ if (!display_server_start (display_server))
+ return FALSE;
+
if (seat->priv->session_to_activate)
g_object_unref (seat->priv->session_to_activate);
seat->priv->session_to_activate = g_object_ref (session);
return TRUE;
}
- display_server = create_display_server (seat);
+ greeter_session = create_greeter_session (seat);
+ if (!greeter_session)
+ return FALSE;
+
+ display_server = create_display_server (seat, session_get_session_type (SESSION (greeter_session)));
if (!display_server_start (display_server))
return FALSE;
- greeter_session = create_greeter_session (seat);
if (seat->priv->session_to_activate)
g_object_unref (seat->priv->session_to_activate);
seat->priv->session_to_activate = g_object_ref (greeter_session);
return seat->priv->stopping;
}
+static gboolean
+seat_real_get_start_local_sessions (Seat *seat)
+{
+ return TRUE;
+}
+
static void
seat_real_setup (Seat *seat)
{
int autologin_timeout;
gboolean autologin_guest;
gboolean autologin_in_background;
- Session *session = NULL;
+ Session *session = NULL, *background_session = NULL;
DisplayServer *display_server;
g_debug ("Starting seat");
- display_server = create_display_server (seat);
-
/* If this display server doesn't have a session running on it, just start it */
- if (!display_server_get_start_local_sessions (display_server))
+ if (!get_start_local_sessions (seat))
+ {
+ display_server = create_display_server (seat, "x"); // FIXME: Not necessarily an X seat, but not sure what to put here
return display_server_start (display_server);
+ }
/* Get autologin settings */
autologin_username = seat_get_string_property (seat, "autologin-user");
/* Load in background if required */
if (autologin_in_background && session)
{
- DisplayServer *background_display_server;
-
- background_display_server = create_display_server (seat);
- session_set_display_server (session, background_display_server);
- if (!display_server_start (background_display_server))
- return FALSE;
-
- /* Start a greeter as well */
+ background_session = session;
session = NULL;
}
}
return FALSE;
}
+ display_server = create_display_server (seat, session_get_session_type (session));
+ if (!display_server)
+ return FALSE;
+
/* Start display server to show session on */
session_set_display_server (session, display_server);
if (!display_server_start (display_server))
return FALSE;
+ /* Start background session */
+ if (background_session)
+ {
+ DisplayServer *background_display_server;
+
+ background_display_server = create_display_server (seat, session_get_session_type (background_session));
+ session_set_display_server (background_session, background_display_server);
+ if (!display_server_start (background_display_server))
+ g_warning ("Failed to start display server for background session");
+ }
+
return TRUE;
}
{
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;