]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Refactor local session starting inhibitor
authorRobert Ancell <robert.ancell@canonical.com>
Wed, 24 Jul 2013 02:08:00 +0000 (14:08 +1200)
committerRobert Ancell <robert.ancell@canonical.com>
Wed, 24 Jul 2013 02:08:00 +0000 (14:08 +1200)
src/display-server.c
src/display-server.h
src/seat-unity.c
src/seat-xlocal.c
src/seat.c
src/seat.h
src/session.c
src/xserver-local.c

index 1c5182c647259858b358d6aaddbc09d1f64b76ba..fd9dac4f94c5ad623ce2443d687c64c81f71fbcb 100644 (file)
@@ -25,9 +25,6 @@ struct DisplayServerPrivate
     /* Unique name for this display server */
     gchar *name;
 
-    /* TRUE if sessions should be automatically started on this display server */
-    gboolean start_local_sessions;
-
     /* TRUE when being stopped */
     gboolean stopping;
 
@@ -64,20 +61,6 @@ display_server_real_get_vt (DisplayServer *server)
     return -1;
 }
 
-void
-display_server_set_start_local_sessions (DisplayServer *server, gboolean start_local_sessions)
-{
-    g_return_if_fail (server != NULL);
-    server->priv->start_local_sessions = start_local_sessions;
-}
-
-gboolean
-display_server_get_start_local_sessions (DisplayServer *server)
-{
-    g_return_val_if_fail (server != NULL, FALSE);
-    return server->priv->start_local_sessions;
-}
-
 gboolean
 display_server_start (DisplayServer *server)
 {
@@ -132,7 +115,6 @@ static void
 display_server_init (DisplayServer *server)
 {
     server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, DISPLAY_SERVER_TYPE, DisplayServerPrivate);
-    server->priv->start_local_sessions = TRUE;
 }
 
 static void
index 7d40723a82c437fc479bf585e35c36d97be0ef4c..d8551067f97a1d0b91cfa6cae8bbbcf28faca8f5 100644 (file)
@@ -54,10 +54,6 @@ const gchar *display_server_get_name (DisplayServer *server);
 
 gint display_server_get_vt (DisplayServer *server);
 
-void display_server_set_start_local_sessions (DisplayServer *server, gboolean start_local_sessions);
-
-gboolean display_server_get_start_local_sessions (DisplayServer *server);
-
 gboolean display_server_start (DisplayServer *server);
 
 void display_server_setup_session (DisplayServer *server, Session *session);
index 51434581c36c60f7453640c6c41042638b5023b0..360ce2b4d0a799f9a8b27d801e6034a2aae71e20 100644 (file)
@@ -78,6 +78,12 @@ struct SeatUnityPrivate
 
 G_DEFINE_TYPE (SeatUnity, seat_unity, SEAT_TYPE);
 
+static gboolean
+seat_unity_get_start_local_sessions (Seat *seat)
+{
+    return !seat_get_string_property (seat, "xdmcp-manager");
+}
+
 static void
 seat_unity_setup (Seat *seat)
 {
@@ -633,6 +639,7 @@ seat_unity_class_init (SeatUnityClass *klass)
     SeatClass *seat_class = SEAT_CLASS (klass);
 
     object_class->finalize = seat_unity_finalize;
+    seat_class->get_start_local_sessions = seat_unity_get_start_local_sessions;
     seat_class->setup = seat_unity_setup;
     seat_class->start = seat_unity_start;
     seat_class->create_display_server = seat_unity_create_display_server;
index bf63d658262583e9216fe45ce8d6e89204b370bf..d658f51a3ac29b6ab30a6a4dd64be3730b259dfc 100644 (file)
 
 G_DEFINE_TYPE (SeatXLocal, seat_xlocal, SEAT_TYPE);
 
+static gboolean
+seat_xlocal_get_start_local_sessions (Seat *seat)
+{
+    return !seat_get_string_property (seat, "xdmcp-manager");
+}
+
 static void
 seat_xlocal_setup (Seat *seat)
 {
@@ -195,6 +201,7 @@ seat_xlocal_class_init (SeatXLocalClass *klass)
 {
     SeatClass *seat_class = SEAT_CLASS (klass);
 
+    seat_class->get_start_local_sessions = seat_xlocal_get_start_local_sessions;
     seat_class->setup = seat_xlocal_setup;
     seat_class->create_display_server = seat_xlocal_create_display_server;
     seat_class->create_greeter_session = seat_xlocal_create_greeter_session;
index f82ed6f2d0522e512bcdfc19a346bbe8e71d1f50..a94a114dc6670997042bb5a9293a65b75396180c 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);
 
@@ -301,6 +301,12 @@ check_stopped (Seat *seat)
     }
 }
 
+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)
 {
@@ -344,7 +350,7 @@ 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);
@@ -378,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");
@@ -909,7 +915,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;
 
@@ -1005,7 +1011,7 @@ display_server_ready_cb (DisplayServer *display_server, Seat *seat)
     }
 
     /* 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");
@@ -1033,11 +1039,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, "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);
@@ -1085,7 +1091,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;
@@ -1123,7 +1129,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;
@@ -1166,13 +1172,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);
@@ -1204,11 +1211,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);
@@ -1240,6 +1250,12 @@ seat_get_is_stopping (Seat *seat)
     return seat->priv->stopping;
 }
 
+static gboolean
+seat_real_get_start_local_sessions (Seat *seat)
+{
+    return TRUE;
+}
+
 static void
 seat_real_setup (Seat *seat)
 {
@@ -1252,16 +1268,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 (!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");
@@ -1290,14 +1307,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;
         }
     }
@@ -1334,11 +1344,26 @@ 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;
 }
 
@@ -1444,6 +1469,7 @@ seat_class_init (SeatClass *klass)
 {
     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;
index fca74297bdc534783287ff96b2b0a56fccbc4f28..e3c7f9e603e405c43c88030a8c057d32c051c07e 100644 (file)
@@ -37,6 +37,7 @@ typedef struct
 {
     GObjectClass parent_class;
 
+    gboolean (*get_start_local_sessions) (Seat *seat);
     void (*setup)(Seat *seat);
     gboolean (*start)(Seat *seat);
     DisplayServer *(*create_display_server) (Seat *seat, const gchar *session_type);
index 4c86bf854348ea11d47a6f0974bf49a0ce0b96c7..b2d591022e410a5dd32af077161f24f97257ae22 100644 (file)
@@ -134,7 +134,7 @@ const gchar *
 session_get_session_type (Session *session)
 {
     g_return_val_if_fail (session != NULL, NULL);
-    return NULL;
+    return "x";
 }
 
 void
index 3762b05df55d3b9ecaf5840935cade367360af63..4af55ff0eb614bc1c685b8a1c6941c2b4c623f1c 100644 (file)
@@ -227,7 +227,6 @@ xserver_local_set_xdmcp_server (XServerLocal *server, const gchar *hostname)
     g_return_if_fail (server != NULL);
     g_free (server->priv->xdmcp_server);
     server->priv->xdmcp_server = g_strdup (hostname);
-    display_server_set_start_local_sessions (DISPLAY_SERVER (server), hostname == NULL);
 }
 
 const gchar *