]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Make Mir tests pass, break VNC and XDMCP tests..
authorRobert Ancell <robert.ancell@canonical.com>
Thu, 25 Jul 2013 23:40:02 +0000 (11:40 +1200)
committerRobert Ancell <robert.ancell@canonical.com>
Thu, 25 Jul 2013 23:40:02 +0000 (11:40 +1200)
src/display-server.c
src/display-server.h
src/mir-server.c
src/seat-unity.c
src/seat-xlocal.c
src/seat.c
src/seat.h
src/session.c
src/session.h
src/x-server.c

index 987ed3c1ac8d9f7457b0635c021a559dfa427f0d..8a83769a45b00720692f490583e0e27a375bfe03 100644 (file)
@@ -88,13 +88,24 @@ display_server_real_start (DisplayServer *server)
 }
 
 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)
 {
 }
 
@@ -135,7 +146,8 @@ display_server_class_init (DisplayServerClass *klass)
     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));
index 926e20e713b31109331c11c94f1d2d119f7445e1..ec328a77a5969737e9f440ad7a315175ef85eab0 100644 (file)
@@ -43,8 +43,8 @@ typedef struct
     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;
 
@@ -60,7 +60,9 @@ gint display_server_get_vt (DisplayServer *server);
 
 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);
 
index 5c315b361a23ba8c20bcd5183704eff5e1d0ff48..a8fca7850a7217f97edef60751415cda34f2412c 100644 (file)
@@ -89,7 +89,7 @@ mir_server_local_get_vt (DisplayServer *server)
 }
 
 static void
-mir_server_setup_session (DisplayServer *display_server, Session *session)
+mir_server_connect_session (DisplayServer *display_server, Session *session)
 {
     MirServer *server;
 
@@ -106,6 +106,14 @@ mir_server_setup_session (DisplayServer *display_server, Session *session)
     }
 }
 
+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)
 {
@@ -136,7 +144,8 @@ mir_server_class_init (MirServerClass *klass)
     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));
index 5f63e3938f277ffb962e75d0587eb5690382e53c..a7d3f6ccacda4b19927192c208c9bf53c88ca2ff 100644 (file)
@@ -503,6 +503,17 @@ seat_unity_create_display_server (Seat *seat, const gchar *session_type)
     }
 }
 
+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)
 {
@@ -663,6 +674,7 @@ seat_unity_class_init (SeatUnityClass *klass)
     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;
index f8ac99ce11dc2af757aa4cbafaa6753b17bbf1b5..fea6f8a30462e96837da9075a5c1d027ae2bb1ec 100644 (file)
@@ -160,13 +160,24 @@ create_x_server (Seat *seat)
     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);
@@ -174,6 +185,17 @@ seat_xlocal_create_display_server (Seat *seat, const gchar *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)
 {
@@ -254,6 +276,7 @@ seat_xlocal_class_init (SeatXLocalClass *klass)
     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;
index 71e363af1d90cfe754968978df5bbf29aee1669b..2bb7f1370a683db8602f1006fc12264c662a5f47 100644 (file)
@@ -364,6 +364,12 @@ display_server_stopped_cb (DisplayServer *display_server, Seat *seat)
     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)
 {
@@ -378,7 +384,7 @@ 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
     {
@@ -520,8 +526,7 @@ session_stopped_cb (Session *session, Seat *seat)
 
     /* 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;
@@ -713,6 +718,8 @@ create_user_session (Seat *seat, const gchar *username)
     SessionConfig *session_config;
     Session *session = NULL;
 
+    g_debug ("Creating user session");
+
     /* Load user preferences */
     user = accounts_get_user_by_name (username);
     if (!user)
@@ -835,6 +842,12 @@ find_user_session (Seat *seat, const gchar *username)
     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)
 {
@@ -844,6 +857,7 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi
     User *user;
     gchar *sessions_dir = NULL;
     gchar **argv;
+    DisplayServer *display_server;
 
     /* Get the session to use */
     if (greeter_get_guest_authenticated (greeter))
@@ -905,8 +919,8 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi
         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);
@@ -917,13 +931,19 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi
         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;
@@ -931,8 +951,6 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi
     /* 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))
@@ -951,6 +969,8 @@ create_greeter_session (Seat *seat)
     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);
@@ -1062,6 +1082,8 @@ create_display_server (Seat *seat, const gchar *session_type)
 {
     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);
index e3c7f9e603e405c43c88030a8c057d32c051c07e..94d3341dc7185adeb29abb18655cd3a5b64bfaf9 100644 (file)
@@ -41,6 +41,7 @@ typedef struct
     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);
index 03340dab19fe17101941c6b568bda5e8e32a981d..3b360d287e95a8ac1826d845ad692fb6c755693a 100644 (file)
@@ -209,7 +209,10 @@ session_set_display_server (Session *session, DisplayServer *display_server)
     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);
 }
 
@@ -258,11 +261,56 @@ session_set_remote_host_name (Session *session, const gchar *remote_host_name)
     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
@@ -493,7 +541,7 @@ session_real_start (Session *session)
 
     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)
@@ -674,7 +722,7 @@ session_real_run (Session *session)
     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;
 
index 0ac44c8b82a408fd42c761eb088a651fed388a20..eb2dad4ccda6f9a9c5c42b2eebac5e71211e25c3 100644 (file)
@@ -98,6 +98,8 @@ void session_set_remote_host_name (Session *session, const gchar *remote_host_na
 
 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
index 8bc14dc4868ad125d82acbfb7a9d25f46bcd2eac..c8960ceb449662aeeff3b42c698a55856fec9c09 100644 (file)
@@ -133,7 +133,7 @@ x_server_start (DisplayServer *display_server)
 }
 
 static void
-x_server_setup_session (DisplayServer *display_server, Session *session)
+x_server_connect_session (DisplayServer *display_server, Session *session)
 {
     gint vt;
 
@@ -162,6 +162,17 @@ x_server_setup_session (DisplayServer *display_server, Session *session)
                              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)
 {
@@ -192,7 +203,8 @@ x_server_class_init (XServerClass *klass)
     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));