]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blobdiff - src/seat.c
Merge with trunk
[sojka/lightdm.git] / src / seat.c
index 36cf7f09faf3eb21e5e834ec8a921b62b4b6654f..6362fefa1d1ff2294e45fb0bb74f8e4e5242ff48 100644 (file)
@@ -70,7 +70,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);
+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);
 
@@ -384,7 +384,7 @@ switch_to_greeter_from_failed_session (Seat *seat, Session *session)
     {
         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");
@@ -717,6 +717,7 @@ create_user_session (Seat *seat, const gchar *username)
         gchar **argv;
 
         session = create_session (seat, TRUE);
+        session_set_session_type (session, session_config_get_session_type (session_config));
         session_set_env (session, "DESKTOP_SESSION", session_name);
         session_set_env (session, "GDMSESSION", session_name);
         if (language && language[0] != '\0')
@@ -759,6 +760,7 @@ create_guest_session (Seat *seat)
     }
 
     session = create_session (seat, TRUE);
+    session_set_session_type (session, session_config_get_session_type (session_config));
     session_set_do_authenticate (session, TRUE);
     session_set_is_guest (session, TRUE);
     argv = get_session_argv (session_config, seat_get_string_property (seat, "session-wrapper"));
@@ -775,6 +777,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_display_server (session, session_get_display_server (SESSION (greeter)));
 
     return g_object_ref (session);
@@ -914,7 +917,7 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi
     {
         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;
 
@@ -950,6 +953,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));
     seat->priv->sessions = g_list_append (seat->priv->sessions, SESSION (greeter_session));
     g_signal_connect (greeter_session, "authentication-complete", G_CALLBACK (session_authentication_complete_cb), seat);
     g_signal_connect (greeter_session, "stopped", G_CALLBACK (session_stopped_cb), seat);
@@ -1039,11 +1043,11 @@ display_server_ready_cb (DisplayServer *display_server, Seat *seat)
 }
 
 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);
+    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);
@@ -1091,7 +1095,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);
+    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;
@@ -1129,7 +1133,7 @@ seat_switch_to_user (Seat *seat, const gchar *username, const gchar *session_nam
     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;
@@ -1172,13 +1176,14 @@ seat_switch_to_guest (Seat *seat, const gchar *session_name)
         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);
@@ -1210,11 +1215,14 @@ seat_lock (Seat *seat, const gchar *username)
         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);
@@ -1264,16 +1272,17 @@ seat_real_start (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 (!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");
@@ -1302,14 +1311,7 @@ seat_real_start (Seat *seat)
         /* 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;
         }
     }
@@ -1346,14 +1348,41 @@ seat_real_start (Seat *seat)
         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;
 }
 
+static Greeter *
+seat_real_create_greeter_session (Seat *seat)
+{
+    return greeter_new ();
+}
+
+static Session *
+seat_real_create_session (Seat *seat)
+{
+    return session_new ();
+}
+
 static void
 seat_real_set_active_session (Seat *seat, Session *session)
 {
@@ -1447,6 +1476,8 @@ seat_class_init (SeatClass *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;
+    klass->create_session = seat_real_create_session;
     klass->set_active_session = seat_real_set_active_session;
     klass->get_active_session = seat_real_get_active_session;
     klass->run_script = seat_real_run_script;