[gdm/wip/wayland-for-merge: 9/14] manager: Don't reuse the same X server when we have a display server



commit 9a76407d20dc5a976049d53816555b4027d432da
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Tue Feb 11 12:45:13 2014 -0500

    manager: Don't reuse the same X server when we have a display server
    
    Rather than morphing our own X server into the user's session
    the login screen on the same VT, and start the user session. GNOME will
    activate its session when ready.

 daemon/gdm-manager.c |   20 +++++++++++++++++++-
 daemon/gdm-session.c |    6 ++++++
 daemon/gdm-session.h |    1 +
 3 files changed, 26 insertions(+), 1 deletions(-)
---
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
index b4dc47d..07dc6ed 100644
--- a/daemon/gdm-manager.c
+++ b/daemon/gdm-manager.c
@@ -870,7 +870,25 @@ on_start_user_session (StartUserSessionOperation *operation)
         }
 
         display = get_display_for_user_session (operation->session);
-        gdm_display_stop_greeter_session (display);
+
+        if (gdm_session_has_own_display_server (operation->session)) {
+                uid_t allowed_uid;
+
+                g_debug ("GdmManager: session has its display server, reusing our server for another login 
screen");
+
+                /* The seed session is going to follow the session worker
+                 * into the new display. Untie it from this display and
+                 * create a new seed session for us. */
+                allowed_uid = gdm_session_get_allowed_user (operation->session);
+                g_object_set_data (G_OBJECT (display), "gdm-seed-session", NULL);
+                g_object_set_data (G_OBJECT (operation->session), "gdm-display", NULL);
+                create_seed_session_for_display (operation->manager, display, allowed_uid);
+        } else {
+                /* In this case, the greeter's display is morphing into
+                 * the user session display. Kill the greeter on this session
+                 * and let the seed session follow the same display. */
+                gdm_display_stop_greeter_session (display);
+        }
 
         start_user_session (operation->manager, operation);
 
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
index 7b6b5e2..45b8acc 100644
--- a/daemon/gdm-session.c
+++ b/daemon/gdm-session.c
@@ -2691,6 +2691,12 @@ out:
         return bypasses_xsession;
 }
 
+gboolean
+gdm_session_has_own_display_server (GdmSession *self)
+{
+        return FALSE;
+}
+
 void
 gdm_session_select_program (GdmSession *self,
                             const char *text)
diff --git a/daemon/gdm-session.h b/daemon/gdm-session.h
index fb190bf..87e27b4 100644
--- a/daemon/gdm-session.h
+++ b/daemon/gdm-session.h
@@ -111,6 +111,7 @@ const char       *gdm_session_get_display_device          (GdmSession     *sessi
 const char       *gdm_session_get_display_seat_id         (GdmSession     *session);
 const char       *gdm_session_get_session_id              (GdmSession     *session);
 gboolean          gdm_session_bypasses_xsession           (GdmSession     *session);
+gboolean          gdm_session_has_own_display_server      (GdmSession     *session);
 
 void              gdm_session_start_conversation          (GdmSession *session,
                                                            const char *service_name);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]