]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Keep a connection open the the X server. Start a new X server on exit
authorRobert Ancell <robert.ancell@canonical.com>
Sat, 23 Jul 2011 05:00:44 +0000 (15:00 +1000)
committerRobert Ancell <robert.ancell@canonical.com>
Sat, 23 Jul 2011 05:00:44 +0000 (15:00 +1000)
38 files changed:
configure.ac
src/display-server.c
src/display-server.h
src/display.c
src/seat-xdmcp-session.c
src/seat-xlocal.c
src/seat-xlocal.h
src/seat.c
src/xserver-local.c
src/xserver-remote.c
src/xserver.c
tests/scripts/autologin-guest.script
tests/scripts/autologin-logout.script
tests/scripts/autologin-xserver-crash.script
tests/scripts/autologin.script
tests/scripts/greeter-xserver-crash.script
tests/scripts/login-guest-disabled.script
tests/scripts/login-guest-fail-setup-script.script
tests/scripts/login-guest-no-setup-script.script
tests/scripts/login-guest.script
tests/scripts/login-invalid-user.script
tests/scripts/login-logout.script
tests/scripts/login-manual.script
tests/scripts/login-no-password.script
tests/scripts/login-session-crash.script
tests/scripts/login-wrong-password.script
tests/scripts/login-xserver-crash.script
tests/scripts/login.script
tests/scripts/no-config.script
tests/scripts/plymouth-active-vt.script
tests/scripts/plymouth-inactive-vt.script
tests/scripts/plymouth-xserver-fail-start.script
tests/scripts/switch-to-greeter.script
tests/scripts/switch-to-guest.script
tests/scripts/switch-to-user.script
tests/scripts/xdmcp-login.script
tests/scripts/xserver-fail-start.script
tests/src/test-xserver.c

index 3e8129c18da774f7576008b2ad15abc4a5e7060a..36eb8b0e21d20c4f120ff4ac4be9d08926f2e2e4 100644 (file)
@@ -28,6 +28,7 @@ PKG_CHECK_MODULES(LIGHTDM, [
     gio-2.0 >= 2.26
     gio-unix-2.0
     xdmcp
+    xcb
 ])
 
 PKG_CHECK_MODULES(GLIB, [
index 3a029b3a8bd795ea3562240d2699ce086e5865fa..f856873abe59c644245cfde72e9b9f4108e56e90 100644 (file)
@@ -25,7 +25,8 @@ G_DEFINE_TYPE (DisplayServer, display_server, G_TYPE_OBJECT);
 static gboolean
 display_server_real_start (DisplayServer *server)
 {
-    return FALSE;
+    g_signal_emit (server, signals[READY], 0);
+    return TRUE;
 }
 
 gboolean
@@ -35,29 +36,10 @@ display_server_start (DisplayServer *server)
     return DISPLAY_SERVER_GET_CLASS (server)->start (server);
 }
 
-void
-display_server_set_ready (DisplayServer *server)
-{
-    g_return_if_fail (server != NULL);
-    g_signal_emit (server, signals[READY], 0);
-}
-
-static gboolean
-display_server_real_restart (DisplayServer *server)
-{
-    return FALSE;
-}
-
-gboolean
-display_server_restart (DisplayServer *server)
-{
-    g_return_val_if_fail (server != NULL, FALSE);
-    return DISPLAY_SERVER_GET_CLASS (server)->restart (server);
-}
-
 static void
 display_server_real_stop (DisplayServer *server)
 {
+    g_signal_emit (server, signals[STOPPED], 0);
 }
 
 void
@@ -67,13 +49,6 @@ display_server_stop (DisplayServer *server)
     DISPLAY_SERVER_GET_CLASS (server)->stop (server);
 }
 
-void
-display_server_set_stopped (DisplayServer *server)
-{
-    g_return_if_fail (server != NULL);
-    g_signal_emit (server, signals[STOPPED], 0);
-}
-
 static void
 display_server_init (DisplayServer *server)
 {
@@ -83,7 +58,6 @@ static void
 display_server_class_init (DisplayServerClass *klass)
 {
     klass->start = display_server_real_start;
-    klass->restart = display_server_real_restart;
     klass->stop = display_server_real_stop;
 
     signals[READY] =
index fc351d1ad173c1ecddb5f8ac81fe7382c71990e7..e307e9553e5a8cce77587463ff16f10de1bab072 100644 (file)
@@ -37,7 +37,6 @@ typedef struct
     void (*stopped)(DisplayServer *server);
 
     gboolean (*start)(DisplayServer *server);
-    gboolean (*restart)(DisplayServer *server);
     void (*stop)(DisplayServer *server);
 } DisplayServerClass;
 
@@ -45,14 +44,8 @@ GType display_server_get_type (void);
 
 gboolean display_server_start (DisplayServer *server);
 
-void display_server_set_ready (DisplayServer *server);
-
-gboolean display_server_restart (DisplayServer *server);
-
 void display_server_stop (DisplayServer *server);
 
-void display_server_set_stopped (DisplayServer *server);
-
 G_END_DECLS
 
 #endif /* _DISPLAY_SERVER_H_ */
index 6730c24695ff56e1e1c1167097713420084ae7d0..d440cc258e203155f318cdc5f4a4bce54fcb74e2 100644 (file)
@@ -385,28 +385,18 @@ check_stopped (Display *display)
     }
 }
 
-static void
-session_stopped_cb (Session *session, Display *display)
-{
-    if (session_get_is_greeter (display->priv->session))
-        g_debug ("Greeter quit");
-    else
-        g_debug ("User session quit");
-
-    /* Stop listening to events from the greeter */
-    if (display->priv->greeter)
-        g_signal_handlers_disconnect_matched (display->priv->greeter, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
-
-    /* If a guest account, remove the account on exit */
-    // FIXME
-    //if (g_strcmp0 (pam_session_get_username (display->priv->pam_session), guest_account_get_username ()) == 0)
-    //    guest_account_unref ();
+static void display_server_ready_cb (DisplayServer *display_server, Display *display);
 
-    g_signal_handlers_disconnect_matched (session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
+static gboolean
+cleanup_after_session (Display *display)
+{
+    g_signal_handlers_disconnect_matched (display->priv->session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
 
+    /* Close ConsoleKit session */
     if (getuid () == 0)
-        end_ck_session (session_get_cookie (session));
+        end_ck_session (session_get_cookie (display->priv->session));
 
+    /* Close PAM session */
     pam_session_end (display->priv->pam_session);
     g_object_unref (display->priv->pam_session);
     display->priv->pam_session = NULL;
@@ -419,15 +409,35 @@ session_stopped_cb (Session *session, Display *display)
     if (display->priv->stopping)
     {
         check_stopped (display);
-        return;
+        return TRUE;
     }
 
-    /* Restart the X server or start a new one if it failed */
-    if (!display_server_restart (display->priv->display_server))
-    {
-        g_debug ("Starting new display server");
-        display_server_start (display->priv->display_server);
-    }
+    return FALSE;
+}
+
+static void
+greeter_session_stopped_cb (Session *session, Display *display)
+{
+    g_debug ("Greeter quit");
+
+    if (cleanup_after_session (display))
+        return;
+
+    /* Start the session */
+    if (display->priv->display_server)
+        display_server_ready_cb (display->priv->display_server, display);
+}
+
+static void
+user_session_stopped_cb (Session *session, Display *display)
+{
+    g_debug ("User session quit");
+
+    if (cleanup_after_session (display))
+        return;
+
+    /* This display has ended */
+    display_stop (display);
 }
 
 static Session *
@@ -493,7 +503,10 @@ create_session (Display *display, PAMSession *pam_session, const gchar *session_
     g_return_val_if_fail (session != NULL, NULL);
     g_signal_connect (session, "exited", G_CALLBACK (session_exited_cb), display);
     g_signal_connect (session, "terminated", G_CALLBACK (session_terminated_cb), display);
-    g_signal_connect (session, "stopped", G_CALLBACK (session_stopped_cb), display);
+    if (is_greeter)
+        g_signal_connect (session, "stopped", G_CALLBACK (greeter_session_stopped_cb), display);
+    else
+        g_signal_connect (session, "stopped", G_CALLBACK (user_session_stopped_cb), display);
     session_set_is_greeter (session, is_greeter);
     session_set_user (session, user);
     session_set_command (session, command);
@@ -767,28 +780,13 @@ start_user_session (Display *display, PAMSession *pam_session, const gchar *name
 static void
 display_server_stopped_cb (DisplayServer *server, Display *display)
 {
-    if (display->priv->stopping)
-    {
-        g_object_unref (display->priv->display_server);
-        display->priv->display_server = NULL;
-        check_stopped (display);
-    }
-    else
-    {
-        g_debug ("Display server stopped");
-       
-        /* Stop the session then start a new X server */
-        if (display->priv->session)
-        {
-            g_debug ("Stopping session");
-            process_stop (PROCESS (display->priv->session));
-        }
-        else
-        {
-            g_debug ("Starting new display server");
-            display_server_start (display->priv->display_server);
-        }
-    }
+    g_debug ("Display server stopped");
+
+    g_object_unref (display->priv->display_server);
+    display->priv->display_server = NULL;
+
+    /* Stop this display, it will be restarted by the seat if necessary */
+    display_stop (display);
 }
 
 static void
@@ -811,7 +809,7 @@ display_server_ready_cb (DisplayServer *display_server, Display *display)
         pam_session_get_in_session (greeter_get_pam_session (display->priv->greeter)))
         pam_session = g_object_ref (greeter_get_pam_session (display->priv->greeter));
 
-    /* Stop any existing greeter */
+    /* Stop the greeter connection */
     if (display->priv->greeter)
     {
         g_signal_handlers_disconnect_matched (display->priv->greeter, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
@@ -892,17 +890,17 @@ display_stop (Display *display)
 {
     g_return_if_fail (display != NULL);
 
-    if (display->priv->stopping)
-        return;
-
-    g_debug ("Stopping display");
+    if (!display->priv->stopping)
+    {
+        g_debug ("Stopping display");
 
-    display->priv->stopping = TRUE;
+        display->priv->stopping = TRUE;
 
-    if (display->priv->display_server)
-        display_server_stop (display->priv->display_server);
-    if (display->priv->session)
-        session_stop (display->priv->session);
+        if (display->priv->display_server)
+            display_server_stop (display->priv->display_server);
+        if (display->priv->session)
+            session_stop (display->priv->session);
+    }
 
     check_stopped (display);
 }
index 59d7faf6e431c77d3927e16aa4a8859001efcb5b..487be1ea2d573f665f7e7919b8dd8c96f558934d 100644 (file)
@@ -17,6 +17,9 @@
 
 struct SeatXDMCPSessionPrivate
 {
+    /* Remote display */
+    XDisplay *display;
+  
     /* Session being serviced */
     XDMCPSession *session;
 };
@@ -39,15 +42,20 @@ seat_xdmcp_session_add_display (Seat *seat)
 {
     XAuthority *authority;
     XServerRemote *xserver;
-    XDisplay *display;
 
     authority = xdmcp_session_get_authority (SEAT_XDMCP_SESSION (seat)->priv->session);
     xserver = xserver_remote_new (xauth_get_address (authority), xdmcp_session_get_display_number (SEAT_XDMCP_SESSION (seat)->priv->session), authority);
 
-    display = xdisplay_new (XSERVER (xserver));
+    SEAT_XDMCP_SESSION (seat)->priv->display = xdisplay_new (XSERVER (xserver));
     g_object_unref (xserver);
 
-    return DISPLAY (display);
+    return DISPLAY (SEAT_XDMCP_SESSION (seat)->priv->display);
+}
+
+static void
+seat_xdmcp_session_display_removed (Seat *seat, Display *display)
+{
+   seat_stop (seat);
 }
 
 static void
@@ -56,12 +64,29 @@ seat_xdmcp_session_init (SeatXDMCPSession *seat)
     seat->priv = G_TYPE_INSTANCE_GET_PRIVATE (seat, SEAT_XDMCP_SESSION_TYPE, SeatXDMCPSessionPrivate);
 }
 
+static void
+seat_xdmcp_session_finalize (GObject *object)
+{
+    SeatXDMCPSession *self;
+
+    self = SEAT_XDMCP_SESSION (object);
+
+    if (self->priv->display)
+        g_object_unref (self->priv->display);
+    g_object_unref (self->priv->session);
+
+    G_OBJECT_CLASS (seat_xdmcp_session_parent_class)->finalize (object);
+}
+
 static void
 seat_xdmcp_session_class_init (SeatXDMCPSessionClass *klass)
 {
     SeatClass *seat_class = SEAT_CLASS (klass);
+    GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
     seat_class->add_display = seat_xdmcp_session_add_display;
+    seat_class->display_removed = seat_xdmcp_session_display_removed;
+    object_class->finalize = seat_xdmcp_session_finalize;
 
     g_type_class_add_private (klass, sizeof (SeatXDMCPSessionPrivate));
 }
index 9ca8ecbd3ed4eb34683c84d180327815f12f529d..240c3d956730299a58416148ceb9b24093a4afd5 100644 (file)
 
 G_DEFINE_TYPE (SeatXLocal, seat_xlocal, SEAT_TYPE);
 
+struct SeatXLocalPrivate
+{
+    /* TRUE if stopping this seat (waiting for displays to stop) */
+    gboolean stopping;
+};
+
 static void
 seat_xlocal_setup (Seat *seat)
 {
@@ -130,9 +136,28 @@ seat_xlocal_set_active_display (Seat *seat, Display *display)
         vt_set_active (number);
 }
 
+static void
+seat_xlocal_display_removed (Seat *seat, Display *display)
+{
+    if (SEAT_XLOCAL (seat)->priv->stopping)
+        return;
+
+    /* Show a new greeter */
+    g_debug ("Display stopped, switching to greeter");
+    seat_switch_to_greeter (seat);
+}
+
+static void
+seat_xlocal_stop (Seat *seat)
+{
+    SEAT_XLOCAL (seat)->priv->stopping = TRUE;
+    SEAT_CLASS (seat_xlocal_parent_class)->stop (seat);
+}
+
 static void
 seat_xlocal_init (SeatXLocal *seat)
 {
+    seat->priv = G_TYPE_INSTANCE_GET_PRIVATE (seat, SEAT_XLOCAL_TYPE, SeatXLocalPrivate);
 }
 
 static void
@@ -143,4 +168,8 @@ seat_xlocal_class_init (SeatXLocalClass *klass)
     seat_class->setup = seat_xlocal_setup;
     seat_class->add_display = seat_xlocal_add_display;
     seat_class->set_active_display = seat_xlocal_set_active_display;
+    seat_class->display_removed = seat_xlocal_display_removed;
+    seat_class->stop = seat_xlocal_stop;
+
+    g_type_class_add_private (klass, sizeof (SeatXLocalPrivate));
 }
index 3956494d90b6a80ce4918f0f8d67272ba1b46c72..b584a9589330cb505d1d5617116ec4e4990eac5e 100644 (file)
@@ -20,9 +20,12 @@ G_BEGIN_DECLS
 #define SEAT_XLOCAL_TYPE (seat_xlocal_get_type())
 #define SEAT_XLOCAL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SEAT_XLOCAL_TYPE, SeatXLocal))
 
+typedef struct SeatXLocalPrivate SeatXLocalPrivate;
+
 typedef struct
 {
-    Seat parent_instance;
+    Seat               parent_instance;
+    SeatXLocalPrivate *priv;
 } SeatXLocal;
 
 typedef struct
index 1bf6af1b26954c1f753e49045831081b3e92c578..c3f4a82674c062f77fa062244b44297cfdb61eb9 100644 (file)
@@ -45,6 +45,9 @@ struct SeatPrivate
     gboolean autologin_guest;
     guint autologin_timeout;
 
+    /* Display running greeter */
+    Display *greeter_display;
+
     /* The displays for this seat */
     GList *displays;
 
@@ -140,25 +143,20 @@ seat_get_allow_guest (Seat *seat)
 }
 
 static gboolean
-display_switch_to_user_cb (Display *display, const gchar *username, Seat *seat)
+switch_to_user (Seat *seat, const gchar *username)
 {
     GList *link;
 
     /* Switch to active display if it exists */
     for (link = seat->priv->displays; link; link = link->next)
     {
-        Display *d = link->data;
+        Display *display = link->data;
         Session *session;
 
-        if (d == display)
-            continue;
-
-        session = display_get_session (d);
-        if (!session || session_get_is_greeter (session))
-            continue;
         /* If already logged in, then switch to that display and stop the greeter display */
-        if (g_strcmp0 (user_get_name (session_get_user (session)), username) == 0)
+        session = display_get_session (display);
+        if (session && !session_get_is_greeter (session) &&
+            g_strcmp0 (user_get_name (session_get_user (session)), username) == 0)
         {
             // FIXME: Use display_get_name
             g_debug ("Switching to user %s session on display %s", username, xserver_get_address (XSERVER (display_get_display_server (display))));
@@ -170,6 +168,12 @@ display_switch_to_user_cb (Display *display, const gchar *username, Seat *seat)
     return FALSE;
 }
 
+static gboolean
+display_switch_to_user_cb (Display *display, const gchar *username, Seat *seat)
+{
+    return switch_to_user (seat, username);
+}
+
 static gboolean
 display_switch_to_guest_cb (Display *display, Seat *seat)
 {
@@ -190,6 +194,34 @@ display_get_guest_username_cb (Display *display, Seat *seat)
     return g_strdup (seat->priv->guest_username);
 }
 
+static void
+display_session_started_cb (Display *display, Seat *seat)
+{
+    GList *link;
+
+    /* Switch to this new display */
+    SEAT_GET_CLASS (seat)->set_active_display (seat, display);
+
+    /* Stop any other greeters */
+    // FIXME: Do this when the switch is complete
+    for (link = seat->priv->displays; link; link = link->next)
+    {
+        Display *d = link->data;
+        Session *session;
+
+        if (d == display)
+            continue;
+
+        /* Must be a user session */
+        session = display_get_session (d);
+        if (session && session_get_is_greeter (session))
+        {
+            g_debug ("Stopping existing greeter");
+            display_stop (d);
+        }
+    }
+}
+
 static void
 display_session_stopped_cb (Display *display, Seat *seat)
 {
@@ -229,56 +261,61 @@ display_stopped_cb (Display *display, Seat *seat)
 }
 
 static gboolean
-switch_to_user (Seat *seat, const gchar *username, gboolean is_guest, gboolean autologin)
+switch_to_user_or_start_greeter (Seat *seat, const gchar *username, gboolean is_guest, gboolean autologin)
 {
-    Display *display;
     GList *link;
+    Display *new_display = NULL;
 
     /* Switch to active display if it exists */
     for (link = seat->priv->displays; link; link = link->next)
     {
-        display = link->data;
+        Display *display = link->data;
         Session *session;
+        const gchar *session_username = NULL;
 
         session = display_get_session (display);
-        if (!session)
-            continue;
-        /* Shouldn't be any other greeters running, close them if so */
-        if (!session || session_get_is_greeter (session))
-        {
-            display_stop (display);
-            continue;
-        }
+        if (session && !session_get_is_greeter (session))
+            session_username = user_get_name (session_get_user (session));
 
-        /* If already logged in, then switch to that display */
-        if (g_strcmp0 (user_get_name (session_get_user (session)), username) == 0)
+        /* If already logged in, then switch to that display and stop the greeter display */
+        if (g_strcmp0 (session_username, username) == 0)
         {
             // FIXME: Use display_get_name
-            g_debug ("Switching to user %s session on display %s", username, xserver_get_address (XSERVER (display_get_display_server (display))));
+            if (username)
+                g_debug ("Switching to user %s session on display %s", username, xserver_get_address (XSERVER (display_get_display_server (display))));
+            else
+                g_debug ("Switching to greeter on display %s", xserver_get_address (XSERVER (display_get_display_server (display))));
             SEAT_GET_CLASS (seat)->set_active_display (seat, display);
             return TRUE;
         }
     }
 
     /* They don't exist, so start a greeter */
-    display = SEAT_GET_CLASS (seat)->add_display (seat);
-    display_load_config (DISPLAY (display), seat->priv->config_section);
-    g_signal_connect (display, "switch-to-user", G_CALLBACK (display_switch_to_user_cb), seat);
-    g_signal_connect (display, "switch-to-guest", G_CALLBACK (display_switch_to_guest_cb), seat);
-    g_signal_connect (display, "get-guest-username", G_CALLBACK (display_get_guest_username_cb), seat);
-    g_signal_connect (display, "session-stopped", G_CALLBACK (display_session_stopped_cb), seat);
-    g_signal_connect (display, "stopped", G_CALLBACK (display_stopped_cb), seat);
-    display_set_allow_guest (display, seat_get_allow_guest (seat));
     if (is_guest)
-        display_set_default_user (display, NULL, TRUE, autologin, 0);
+        g_debug ("Starting new greeter to authenticate guest");        
     else if (username)
-        display_set_default_user (display, username, FALSE, autologin, 0);
+        g_debug ("Starting new greeter to authenticate user %s", username);
+    else
+        g_debug ("Starting new greeter");
+
+    new_display = SEAT_GET_CLASS (seat)->add_display (seat);
+    display_load_config (DISPLAY (new_display), seat->priv->config_section);
+    g_signal_connect (new_display, "switch-to-user", G_CALLBACK (display_switch_to_user_cb), seat);
+    g_signal_connect (new_display, "switch-to-guest", G_CALLBACK (display_switch_to_guest_cb), seat);
+    g_signal_connect (new_display, "get-guest-username", G_CALLBACK (display_get_guest_username_cb), seat);
+    g_signal_connect (new_display, "session-started", G_CALLBACK (display_session_started_cb), seat);
+    g_signal_connect (new_display, "session-stopped", G_CALLBACK (display_session_stopped_cb), seat);
+    g_signal_connect (new_display, "stopped", G_CALLBACK (display_stopped_cb), seat);
+    display_set_allow_guest (new_display, seat_get_allow_guest (seat));
+    if (is_guest)
+        display_set_default_user (new_display, NULL, TRUE, autologin, 0);
+    else if (username)
+        display_set_default_user (new_display, username, FALSE, autologin, 0);
 
-    seat->priv->displays = g_list_append (seat->priv->displays, g_object_ref (display));
-    g_signal_emit (seat, signals[DISPLAY_ADDED], 0, display);
+    seat->priv->displays = g_list_append (seat->priv->displays, new_display);
+    g_signal_emit (seat, signals[DISPLAY_ADDED], 0, new_display);
 
-    return display_start (display);
+    return display_start (new_display);
 }
 
 gboolean
@@ -290,8 +327,7 @@ seat_switch_to_greeter (Seat *seat)
         return FALSE;
 
     g_debug ("Showing greeter");
-  
-    return switch_to_user (seat, NULL, FALSE, FALSE);
+    return switch_to_user_or_start_greeter (seat, NULL, FALSE, FALSE);
 }
 
 gboolean
@@ -304,7 +340,7 @@ seat_switch_to_user (Seat *seat, const gchar *username)
         return FALSE;
 
     g_debug ("Switching to user %s", username);
-    return switch_to_user (seat, username, FALSE, FALSE);
+    return switch_to_user_or_start_greeter (seat, username, FALSE, FALSE);
 }
 
 gboolean
@@ -319,7 +355,7 @@ seat_switch_to_guest (Seat *seat)
         g_debug ("Switching to existing guest account %s", seat->priv->guest_username);
     else
         g_debug ("Switching to new guest account");
-    return switch_to_user (seat, seat->priv->guest_username, TRUE, TRUE);
+    return switch_to_user_or_start_greeter (seat, seat->priv->guest_username, TRUE, TRUE);
 }
 
 void
@@ -361,13 +397,15 @@ seat_real_setup (Seat *seat)
 static gboolean
 seat_real_start (Seat *seat)
 {
+    g_debug ("Starting seat");
+
     /* Start showing a greeter */
     if (seat->priv->autologin_username)
-        return switch_to_user (seat, seat->priv->autologin_username, FALSE, TRUE);
+        return switch_to_user_or_start_greeter (seat, seat->priv->autologin_username, FALSE, TRUE);
     else if (seat->priv->autologin_guest)
-        return switch_to_user (seat, NULL, TRUE, TRUE);
+        return switch_to_user_or_start_greeter (seat, NULL, TRUE, TRUE);
     else
-        return switch_to_user (seat, NULL, FALSE, FALSE);
+        return switch_to_user_or_start_greeter (seat, NULL, FALSE, FALSE);
 }
 
 static Display *
index 056d6ed859bc54d6838f12f319e2bec697e695d7..ec3f7958f476bd0333fa11f7549401a592cb7b54 100644 (file)
@@ -215,7 +215,8 @@ got_signal_cb (Process *process, int signum, XServerLocal *server)
             plymouth_quit (TRUE);
         }
 
-        display_server_set_ready (DISPLAY_SERVER (server));
+        // FIXME: Check return value
+        DISPLAY_SERVER_CLASS (xserver_local_parent_class)->start (DISPLAY_SERVER (server));
     }
 }
 
@@ -240,6 +241,28 @@ stopped_cb (Process *process, XServerLocal *server)
     g_object_unref (server->priv->xserver_process);
     server->priv->xserver_process = NULL;
 
+    if (xserver_get_authority (XSERVER (server)) && server->priv->authority_file)
+    {
+        GError *error = NULL;
+        gchar *path;
+
+        path = g_file_get_path (server->priv->authority_file);      
+        g_debug ("Removing X server authority from %s", path);
+        g_free (path);
+
+        if (!xauth_write (xserver_get_authority (XSERVER (server)), XAUTH_WRITE_MODE_REMOVE, NULL, server->priv->authority_file, &error))
+            g_debug ("Error removing authority: %s", error->message);
+        g_clear_error (&error);
+
+        g_object_unref (server->priv->authority_file);
+        server->priv->authority_file = NULL;
+    }
+
+    release_display_number (xserver_get_display_number (XSERVER (server)));
+
+    if (server->priv->vt >= 0)
+        vt_release (server->priv->vt);
+
     if (server->priv->replacing_plymouth && plymouth_get_is_running ())
     {
         g_debug ("Stopping Plymouth, X server failed to start");
@@ -247,7 +270,7 @@ stopped_cb (Process *process, XServerLocal *server)
         plymouth_quit (FALSE);
     }
 
-    display_server_set_stopped (DISPLAY_SERVER (server));
+    DISPLAY_SERVER_CLASS (xserver_local_parent_class)->stop (DISPLAY_SERVER (server));
 }
 
 static void
@@ -258,9 +281,11 @@ write_authority_file (XServerLocal *server)
     GError *error = NULL;
 
     authority = xserver_get_authority (XSERVER (server));
+    if (!authority)
+        return;
 
     /* Get file to write to if have authority */
-    if (authority && !server->priv->authority_file)
+    if (!server->priv->authority_file)
     {
         gchar *run_dir, *dir;
       
@@ -275,27 +300,11 @@ write_authority_file (XServerLocal *server)
         g_free (path);
     }
 
-    /* Delete existing file if no authority */
-    if (!authority)
-    {
-        if (server->priv->authority_file)
-        {
-            path = g_file_get_path (server->priv->authority_file);
-            g_debug ("Deleting X server authority %s", path);
-            g_free (path);
-
-            g_file_delete (server->priv->authority_file, NULL, NULL);
-            g_object_unref (server->priv->authority_file);
-            server->priv->authority_file = NULL;
-        }
-        return;
-    }
-
     path = g_file_get_path (server->priv->authority_file);
     g_debug ("Writing X server authority to %s", path);
     g_free (path);
 
-    if (!xauth_write (authority, XAUTH_WRITE_MODE_SET, NULL, server->priv->authority_file, &error))
+    if (!xauth_write (authority, XAUTH_WRITE_MODE_REPLACE, NULL, server->priv->authority_file, &error))
         g_warning ("Failed to write authority: %s", error->message);
     g_clear_error (&error);
 }
@@ -424,35 +433,6 @@ xserver_local_start (DisplayServer *display_server)
     return result;
 }
  
-static gboolean
-xserver_local_restart (DisplayServer *display_server)
-{
-    XServerLocal *server = XSERVER_LOCAL (display_server);
-    gchar hostname[1024], *number;
-
-    /* Not running */
-    if (!server->priv->xserver_process)
-        return FALSE;
-
-    /* Can only restart with not using authentication */
-    if (server->priv->xdmcp_key)
-        return FALSE;
-
-    g_debug ("Generating new cookie for X server");
-    gethostname (hostname, 1024);
-    number = g_strdup_printf ("%d", xserver_get_display_number (XSERVER (server)));
-    xserver_set_authority (XSERVER (server), xauth_new_cookie (XAUTH_FAMILY_LOCAL, hostname, number));
-    g_free (number);
-    write_authority_file (server);
-
-    g_debug ("Sending signal to X server to disconnect clients");
-
-    server->priv->got_signal = FALSE;
-    process_signal (server->priv->xserver_process, SIGHUP);
-
-    return TRUE;
-}
-
 static void
 xserver_local_stop (DisplayServer *server)
 {
@@ -474,21 +454,15 @@ xserver_local_finalize (GObject *object)
 
     self = XSERVER_LOCAL (object);
 
-    release_display_number (xserver_get_display_number (XSERVER (self)));
-
-    if (self->priv->vt >= 0)
-        vt_release (self->priv->vt);
-
+    if (self->priv->xserver_process)
+        g_object_unref (self->priv->xserver_process);
     g_free (self->priv->command);
     g_free (self->priv->config_file);
     g_free (self->priv->layout);
     g_free (self->priv->xdmcp_server);
     g_free (self->priv->xdmcp_key);
     if (self->priv->authority_file)
-    {
-        g_file_delete (self->priv->authority_file, NULL, NULL);
         g_object_unref (self->priv->authority_file);
-    }
 
     G_OBJECT_CLASS (xserver_local_parent_class)->finalize (object);
 }
@@ -500,7 +474,6 @@ xserver_local_class_init (XServerLocalClass *klass)
     DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass);
 
     display_server_class->start = xserver_local_start;
-    display_server_class->restart = xserver_local_restart;
     display_server_class->stop = xserver_local_stop;
     object_class->finalize = xserver_local_finalize;
 
index 65ad4de2966664e1ec83f3cfdd685f151ac307c5..183e36b021f522f74ea996bde1ac06e22338b99a 100644 (file)
@@ -27,19 +27,6 @@ xserver_remote_new (const gchar *hostname, guint number, XAuthority *authority)
     return self;
 }
 
-static gboolean
-xserver_remote_start (DisplayServer *server)
-{
-    display_server_set_ready (DISPLAY_SERVER (server));
-    return TRUE;
-}
-
-static void
-xserver_remote_stop (DisplayServer *server)
-{
-    display_server_set_stopped (DISPLAY_SERVER (server));
-}
-
 static void
 xserver_remote_init (XServerRemote *server)
 {
@@ -48,8 +35,4 @@ xserver_remote_init (XServerRemote *server)
 static void
 xserver_remote_class_init (XServerRemoteClass *klass)
 {
-    DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass);
-
-    display_server_class->start = xserver_remote_start;
-    display_server_class->stop = xserver_remote_stop;
 }
index 445c9b395c43330b780cb2b26b9bad432a5aa158..ac128329ae32a1bfa502636fce1033e4e29fb2a8 100644 (file)
@@ -10,6 +10,8 @@
  */
 
 #include <config.h>
+#include <string.h>
+#include <xcb/xcb.h>
 
 #include "xserver.h"
 #include "configuration.h"
@@ -28,6 +30,9 @@ struct XServerPrivate
 
     /* Authority */
     XAuthority *authority;
+
+    /* Connection to this X server */
+    xcb_connection_t *connection;
 };
 
 G_DEFINE_TYPE (XServer, xserver, DISPLAY_SERVER_TYPE);
@@ -97,6 +102,33 @@ xserver_get_authority (XServer *server)
     return server->priv->authority;
 }
 
+static gboolean
+xserver_start (DisplayServer *display_server)
+{
+    XServer *server = XSERVER (display_server);
+    xcb_auth_info_t *auth = NULL, a;
+
+    if (server->priv->authority)
+    {
+        a.namelen = strlen (xauth_get_authorization_name (server->priv->authority));
+        a.name = (char *) xauth_get_authorization_name (server->priv->authority);
+        a.datalen = xauth_get_authorization_data_length (server->priv->authority);
+        a.data = (char *) xauth_get_authorization_data (server->priv->authority);
+        auth = &a;
+    }
+
+    /* Open connection */  
+    g_debug ("Connecting to XServer %s", xserver_get_address (server));
+    server->priv->connection = xcb_connect_to_display_with_auth_info (xserver_get_address (server), auth, NULL);
+    if (xcb_connection_has_error (server->priv->connection))
+    {
+        g_debug ("Error connecting to XServer %s", xserver_get_address (server));
+        return FALSE;
+    }
+
+    return DISPLAY_SERVER_CLASS (xserver_parent_class)->start (display_server);
+}
+
 static void
 xserver_init (XServer *server)
 {
@@ -114,6 +146,8 @@ xserver_finalize (GObject *object)
     g_free (self->priv->address);
     if (self->priv->authority)
         g_object_unref (self->priv->authority);
+    if (self->priv->connection)
+        xcb_disconnect (self->priv->connection);
 
     G_OBJECT_CLASS (xserver_parent_class)->finalize (object);
 }
@@ -122,7 +156,9 @@ static void
 xserver_class_init (XServerClass *klass)
 {
     GObjectClass *object_class = G_OBJECT_CLASS (klass);
+    DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass);
 
+    display_server_class->start = xserver_start;
     object_class->finalize = xserver_finalize;
 
     g_type_class_add_private (klass, sizeof (XServerPrivate));
index a3bcef00c214ea55cd07e232c4dbf6b6c918a19c..baaa4e217b3ee70e05fdb0ba572386eb018a8207 100644 (file)
@@ -8,6 +8,9 @@ RUNNER DAEMON-START
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Default session starts
 SESSION START USER=guest
 XSERVER :50 ACCEPT-CONNECT
index 604136a4aa3829a858472beb22c6486cc14eacb5..82008cf39308d96431e5e2b451157b596003409c 100644 (file)
@@ -8,6 +8,9 @@ RUNNER DAEMON-START
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Autologin session starts
 SESSION START USER=alice
 XSERVER :50 ACCEPT-CONNECT
@@ -16,10 +19,16 @@ SESSION CONNECT-XSERVER
 # Logout
 SESSION LOGOUT
 
-# X server resets
-XSERVER :50 DISCONNECT-CLIENTS
+# X server stops
+XSERVER :50 TERMINATE SIGNAL=15
+
+# X server starts
+XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
index 7f1cccbba3fdbb5f39fc796ef97a4fa322ba0790..f86b33cdb0658280b4b334f4dff54ab3952f473c 100644 (file)
@@ -8,6 +8,9 @@ RUNNER DAEMON-START
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Default session starts
 SESSION START USER=alice
 XSERVER :50 ACCEPT-CONNECT
@@ -20,9 +23,14 @@ XSERVER :50 CRASH
 # Session terminates
 SESSION TERMINATE SIGNAL=15
 
-# X server restarts and loads greeter
+# X server restarts
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
+
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
+# Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
 GREETER CONNECT-XSERVER :50
index d25459bf451a2bd879f865105c558839ce142087..e41e937ce55c133ec3331f85c8d40124136acbe4 100644 (file)
@@ -8,6 +8,9 @@ RUNNER DAEMON-START
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Default session starts
 SESSION START USER=alice
 XSERVER :50 ACCEPT-CONNECT
index 1937c734ee460dd7499de7f7486c57bc86ed8a51..0f968b36c564a130450ec15947c99ee300850f82 100644 (file)
@@ -8,6 +8,9 @@ RUNNER DAEMON-START
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
@@ -19,9 +22,14 @@ GREETER CONNECTED-TO-DAEMON
 GREETER CRASH-XSERVER
 XSERVER :50 CRASH
 
-# X server restarts and loads greeter
+# X server restarts
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
+
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
+# Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
 GREETER CONNECT-XSERVER :50
index dc83a2323165a5f48c9d976e6f6fa6781ddeae4d..e095b174792d602889d3b0c876879ff562b802d8 100644 (file)
@@ -8,6 +8,9 @@ RUNNER DAEMON-START
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
index 53b80b9947ad75b2ec8a8b01444f3382f7df2cca..b40ca8ca0de37106f582952372bd304eeca720f6 100644 (file)
@@ -8,6 +8,9 @@ RUNNER DAEMON-START
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
@@ -20,10 +23,6 @@ GREETER AUTHENTICATE-GUEST
 GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE
 GREETER TERMINATE SIGNAL=15
 
-# X server resets
-XSERVER :50 DISCONNECT-CLIENTS
-XSERVER :50 INDICATE-READY
-
 # (guest account attempts to start, fails, then returns to greeter)
 
 # Greeter starts
index 9f580500872adb84fa2b11e0b8612067748193d6..0daaa62b36710f9be0895b0095708c4b02fed1ef 100644 (file)
@@ -8,6 +8,9 @@ RUNNER DAEMON-START
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
index 2622cbd9bc72075b8d8274bc7d60a7f856872835..b114202784a08d0cecd9abb8972987d95fe5ad5e 100644 (file)
@@ -8,6 +8,9 @@ RUNNER DAEMON-START
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
@@ -20,10 +23,6 @@ GREETER AUTHENTICATE-GUEST
 GREETER AUTHENTICATION-COMPLETE AUTHENTICATED=TRUE
 GREETER TERMINATE SIGNAL=15
 
-# X server resets
-XSERVER :50 DISCONNECT-CLIENTS
-XSERVER :50 INDICATE-READY
-
 # Guest session starts
 SESSION START USER=guest
 XSERVER :50 ACCEPT-CONNECT
index 00154a5ea815a56b5bd0bb5b31afa61b4af597ab..851476b15603aca1d1fb0dc8732f0dbf9f9059c3 100644 (file)
@@ -8,6 +8,9 @@ RUNNER DAEMON-START
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
index 92edaa27cda26b20e403a4d543aa194d6078fd6d..2bc8186455409fd57900708f9259cdccec6410d7 100644 (file)
@@ -8,6 +8,9 @@ RUNNER DAEMON-START
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
@@ -22,10 +25,6 @@ GREETER RESPOND TEXT="password"
 GREETER AUTHENTICATION-COMPLETE USERNAME=alice AUTHENTICATED=TRUE
 GREETER TERMINATE SIGNAL=15
 
-# X server resets
-XSERVER :50 DISCONNECT-CLIENTS
-XSERVER :50 INDICATE-READY
-
 # Session starts
 SESSION START USER=alice
 XSERVER :50 ACCEPT-CONNECT
@@ -34,10 +33,16 @@ SESSION CONNECT-XSERVER
 # Logout of session
 SESSION LOGOUT
 
-# X server resets
-XSERVER :50 DISCONNECT-CLIENTS
+# X server stops
+XSERVER :50 TERMINATE SIGNAL=15
+
+# X server starts
+XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
index 846435b8d3eee0641ca3e448637553f567ec3b7a..27da6a13ee91406875ede1c5f221c85cc5899d80 100644 (file)
@@ -8,6 +8,9 @@ RUNNER DAEMON-START
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
@@ -24,10 +27,6 @@ GREETER RESPOND TEXT="password"
 GREETER AUTHENTICATION-COMPLETE USERNAME=alice AUTHENTICATED=TRUE
 GREETER TERMINATE SIGNAL=15
 
-# X server resets
-XSERVER :50 DISCONNECT-CLIENTS
-XSERVER :50 INDICATE-READY
-
 # Session starts
 SESSION START USER=alice
 XSERVER :50 ACCEPT-CONNECT
index c7db8d2da1a0cfc9aa44f57f43805321f48b7b9f..10f54f9ab58fc57c34ff302e5600952ac00d2515 100644 (file)
@@ -8,6 +8,9 @@ RUNNER DAEMON-START
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
@@ -20,10 +23,6 @@ GREETER AUTHENTICATE USERNAME=bob
 GREETER AUTHENTICATION-COMPLETE USERNAME=bob AUTHENTICATED=TRUE
 GREETER TERMINATE SIGNAL=15
 
-# X server resets
-XSERVER :50 DISCONNECT-CLIENTS
-XSERVER :50 INDICATE-READY
-
 # Session starts
 SESSION START USER=bob
 XSERVER :50 ACCEPT-CONNECT
index 1198c38cca9af30f49d930c3acba548fe7b0612b..2d121b1376b1b0657f9a061128be60dee87b04a6 100644 (file)
@@ -8,6 +8,9 @@ RUNNER DAEMON-START
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
@@ -22,10 +25,6 @@ GREETER RESPOND TEXT="password"
 GREETER AUTHENTICATION-COMPLETE USERNAME=alice AUTHENTICATED=TRUE
 GREETER TERMINATE SIGNAL=15
 
-# X server resets
-XSERVER :50 DISCONNECT-CLIENTS
-XSERVER :50 INDICATE-READY
-
 # Session starts
 SESSION START USER=alice
 XSERVER :50 ACCEPT-CONNECT
@@ -34,11 +33,17 @@ SESSION CONNECT-XSERVER
 # Session crashes
 SESSION CRASH
 
-# X server resets
-XSERVER :50 DISCONNECT-CLIENTS
+# X server stops
+XSERVER :50 TERMINATE SIGNAL=15
+
+# X server starts
+XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
-# Greeter starts on X server
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
+# Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
 GREETER CONNECT-XSERVER :50
index c473251a9247d9e2d3bb1387d8edf1c50a0b8cfb..a43f64393889fe6a30c8a2ee9ace39e5d6bbd48b 100644 (file)
@@ -8,6 +8,9 @@ RUNNER DAEMON-START
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
index a1dc54ae258a879d34a351c825a2985b706f51ad..d89a1ff49d99898eaee9d0d59c8490bbb1c83fd6 100644 (file)
@@ -8,6 +8,9 @@ RUNNER DAEMON-START
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
@@ -22,10 +25,6 @@ GREETER RESPOND TEXT="password"
 GREETER AUTHENTICATION-COMPLETE USERNAME=alice AUTHENTICATED=TRUE
 GREETER TERMINATE SIGNAL=15
 
-# X server resets
-XSERVER :50 DISCONNECT-CLIENTS
-XSERVER :50 INDICATE-READY
-
 # Session starts
 SESSION START USER=alice
 XSERVER :50 ACCEPT-CONNECT
@@ -38,9 +37,12 @@ XSERVER :50 CRASH
 # User session is terminated
 SESSION TERMINATE SIGNAL=15
 
-# X server restarts and loads greeter
+# X server restarts
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
+XSERVER :50 ACCEPT-CONNECT
+
+# Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
 GREETER CONNECT-XSERVER :50
index ac8ea91bc0786d76802bb44d52ed7ae287a95cfd..c09ee56fe917c61460dca32adb5bfcaa6bb86f29 100644 (file)
@@ -8,6 +8,9 @@ RUNNER DAEMON-START
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
@@ -15,17 +18,13 @@ GREETER CONNECT-XSERVER :50
 GREETER CONNECT-TO-DAEMON
 GREETER CONNECTED-TO-DAEMON
 
-# Login
+# Login as alice
 GREETER AUTHENTICATE USERNAME=alice
 GREETER SHOW-PROMPT TEXT="Password:"
 GREETER RESPOND TEXT="password"
 GREETER AUTHENTICATION-COMPLETE USERNAME=alice AUTHENTICATED=TRUE
 GREETER TERMINATE SIGNAL=15
 
-# X server resets
-XSERVER :50 DISCONNECT-CLIENTS
-XSERVER :50 INDICATE-READY
-
 # Session starts
 SESSION START USER=alice
 XSERVER :50 ACCEPT-CONNECT
index ed84b550d349804ca54029858cd3aa7aae7618e7..2bb33674ffe336c51b2b980fae0cec0294f57fe1 100644 (file)
@@ -8,6 +8,9 @@ RUNNER DAEMON-START
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
index cbeaef069463a04d325e66bcd40fc571d25f9f90..f1bfc64428c4b28d50d4088ce3d2d860217184cf 100644 (file)
@@ -12,8 +12,13 @@ PLYMOUTH DEACTIVATE
 # X server starts
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
+
+# Plymouth quits but keeps image in framebuffer
 PLYMOUTH QUIT RETAIN-SPLASH=TRUE
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
index de17942b620b86a7e7a628c3ad93ed2576993d40..882173fc5b499de6af27bdafb3dbffbdbf6bacb2 100644 (file)
@@ -13,6 +13,9 @@ PLYMOUTH QUIT RETAIN-SPLASH=FALSE
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
index 68fe39aed3ce05de8bbadc1902696b4ae394a81b..51a978a246b27a689e7d0f709f5af9503605e168 100644 (file)
@@ -20,6 +20,9 @@ PLYMOUTH QUIT RETAIN-SPLASH=FALSE
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
index 79b8ec80d48474cfce5b0cde4080101cb8202164..b7b90352f0a811c460688f69c01321ab450f0b1b 100644 (file)
@@ -8,6 +8,9 @@ RUNNER DAEMON-START
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
@@ -22,10 +25,6 @@ GREETER RESPOND TEXT="password"
 GREETER AUTHENTICATION-COMPLETE USERNAME=alice AUTHENTICATED=TRUE
 GREETER TERMINATE SIGNAL=15
 
-# X server resets
-XSERVER :50 DISCONNECT-CLIENTS
-XSERVER :50 INDICATE-READY
-
 # Session starts
 SESSION START USER=alice
 XSERVER :50 ACCEPT-CONNECT
@@ -39,6 +38,9 @@ RUNNER SWITCH-TO-GREETER
 XSERVER :51 START
 XSERVER :51 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :51 ACCEPT-CONNECT
+
 # Greeter starts
 GREETER START
 XSERVER :51 ACCEPT-CONNECT
index 999295836c07068f2a76146119ea6d2a7f72beb0..6c87d983fa25cd55424110f2df9235b5ea52043c 100644 (file)
@@ -9,6 +9,9 @@ RUNNER DAEMON-START
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Default session starts
 SESSION START USER=alice
 XSERVER :50 ACCEPT-CONNECT
@@ -22,6 +25,9 @@ RUNNER SWITCH-TO-GUEST
 XSERVER :51 START
 XSERVER :51 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :51 ACCEPT-CONNECT
+
 # Guest session starts
 SESSION START USER=guest
 XSERVER :51 ACCEPT-CONNECT
index 0e3ceec6d20fd9419b909eb9d5f34c72043528bb..92d8dc4a305016dfce189f2f6a0ff462e3683693 100644 (file)
@@ -9,6 +9,9 @@ RUNNER DAEMON-START
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
@@ -20,20 +23,21 @@ GREETER CONNECTED-TO-DAEMON
 *SWITCH-TO-USER USERNAME=alice
 RUNNER SWITCH-TO-USER USERNAME=alice
 
-# Existing X server and greeter stops
-(GREETER TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15)
-(GREETER TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15)
-
 # New X server starts
 XSERVER :51 START
 XSERVER :51 INDICATE-READY
 
-# New greeter starts
-GREETER START
+# LightDM connects to X server
 XSERVER :51 ACCEPT-CONNECT
-GREETER CONNECT-XSERVER :51
-GREETER CONNECT-TO-DAEMON
-GREETER CONNECTED-TO-DAEMON
+
+# Existing X server stops, new greeter starts
+(XSERVER :50 TERMINATE SIGNAL=15|GREETER TERMINATE SIGNAL=15||GREETER CONNECT-XSERVER :51|XSERVER :51 ACCEPT-CONNECT|GREETER CONNECT-TO-DAEMON|GREETER CONNECTED-TO-DAEMON)
+(XSERVER :50 TERMINATE SIGNAL=15|GREETER TERMINATE SIGNAL=15|GREETER START|GREETER CONNECT-XSERVER :51|XSERVER :51 ACCEPT-CONNECT|GREETER CONNECT-TO-DAEMON|GREETER CONNECTED-TO-DAEMON)
+(XSERVER :50 TERMINATE SIGNAL=15|GREETER TERMINATE SIGNAL=15|GREETER START|GREETER CONNECT-XSERVER :51|XSERVER :51 ACCEPT-CONNECT|GREETER CONNECT-TO-DAEMON|GREETER CONNECTED-TO-DAEMON)
+(XSERVER :50 TERMINATE SIGNAL=15|GREETER TERMINATE SIGNAL=15|GREETER START|GREETER CONNECT-XSERVER :51|XSERVER :51 ACCEPT-CONNECT|GREETER CONNECT-TO-DAEMON|GREETER CONNECTED-TO-DAEMON)
+(XSERVER :50 TERMINATE SIGNAL=15|GREETER TERMINATE SIGNAL=15|GREETER START|GREETER CONNECT-XSERVER :51|XSERVER :51 ACCEPT-CONNECT|GREETER CONNECT-TO-DAEMON|GREETER CONNECTED-TO-DAEMON)
+(XSERVER :50 TERMINATE SIGNAL=15|GREETER TERMINATE SIGNAL=15|GREETER START|GREETER CONNECT-XSERVER :51|XSERVER :51 ACCEPT-CONNECT|GREETER CONNECT-TO-DAEMON|GREETER CONNECTED-TO-DAEMON)
+(XSERVER :50 TERMINATE SIGNAL=15|GREETER TERMINATE SIGNAL=15|GREETER START|GREETER CONNECT-XSERVER :51|XSERVER :51 ACCEPT-CONNECT|GREETER CONNECT-TO-DAEMON|GREETER CONNECTED-TO-DAEMON)
 
 # Alice is automatically selected
 GREETER AUTHENTICATE-SELECTED USERNAME=alice
index 2efa4440309675995db02e99dbbbc86be9502c92..9b45b77ed401d595832a6fd8ec4a0ea6b85994ee 100644 (file)
@@ -16,6 +16,9 @@ XSERVER :98 SEND-REQUEST DISPLAY-NUMBER=98 AUTHORIZATION-NAME="MIT-MAGIC-COOKIE-
 XSERVER :98 GOT-ACCEPT SESSION-ID=[0-9]* AUTHENTICATION-NAME="" AUTHORIZATION-NAME=""
 XSERVER :98 SEND-MANAGE SESSION-ID=[0-9]* DISPLAY-NUMBER=98 DISPLAY-CLASS="DISPLAY CLASS"
 
+# LightDM connects to X server
+XSERVER :98 ACCEPT-CONNECT
+
 # Greeter starts and connects to remote X server
 GREETER START
 XSERVER :98 ACCEPT-CONNECT
index 078380c024b00d3188efdccf35b94bf112cd076d..a10ea943826d267ac91c9b772b150bf101a3c48e 100644 (file)
@@ -11,6 +11,9 @@ XSERVER :50 EXIT CODE=1
 XSERVER :50 START
 XSERVER :50 INDICATE-READY
 
+# LightDM connects to X server
+XSERVER :50 ACCEPT-CONNECT
+
 # Greeter starts
 GREETER START
 XSERVER :50 ACCEPT-CONNECT
index 43e64167c209de84c8a416c8f876018301848b59..123e651c53395d7e75fa7d854a4c4339f3a1f719 100644 (file)
@@ -519,27 +519,48 @@ decode_request (Connection *connection, const guint8 *buffer, gssize buffer_leng
     }
 }
 
+static void
+indicate_ready ()
+{
+    void *handler;  
+    handler = signal (SIGUSR1, SIG_IGN);
+    if (handler == SIG_IGN)
+    {
+        notify_status ("XSERVER :%d INDICATE-READY", display_number);
+        kill (getppid (), SIGUSR1);
+    }
+    signal (SIGUSR1, handler);
+}
+
 static gboolean
 socket_data_cb (GIOChannel *channel, GIOCondition condition, gpointer data)
 {
+    Connection *connection;
     guint8 buffer[MAXIMUM_REQUEST_LENGTH];
     gssize n_read;
 
+    connection = g_hash_table_lookup (connections, channel);
+
     n_read = recv (g_io_channel_unix_get_fd (channel), buffer, MAXIMUM_REQUEST_LENGTH, 0);
     if (n_read < 0)
         g_warning ("Error reading from socket: %s", strerror (errno));
     else if (n_read == 0)
     {
-        g_debug ("EOF");
+        if (connection)
+        {
+            g_debug ("Client disconnected");
+            g_hash_table_remove (connections, connection->channel);
+            if (g_hash_table_size (connections) == 0)
+                indicate_ready ();
+        }
+        else
+            g_debug ("EOF before connection made");
         return FALSE;
     }
     else
     {
-        Connection *connection;
-
         log_buffer ("Read X", buffer, n_read);
 
-        connection = g_hash_table_lookup (connections, channel);
         if (connection)
             decode_request (connection, buffer, n_read);
         else
@@ -566,19 +587,6 @@ socket_connect_cb (GIOChannel *channel, GIOCondition condition, gpointer data)
     return TRUE;
 }
 
-static void
-indicate_ready ()
-{
-    void *handler;  
-    handler = signal (SIGUSR1, SIG_IGN);
-    if (handler == SIG_IGN)
-    {
-        notify_status ("XSERVER :%d INDICATE-READY", display_number);
-        kill (getppid (), SIGUSR1);
-    }
-    signal (SIGUSR1, handler);
-}
-
 static void
 signal_cb (int signum)
 {