Blame SOURCES/0038-manager-don-t-kill-initial-setup-before-starting-use.patch

400dab
From c65a0dbd195be52f0db0c49ea0355fe1b5eb4c09 Mon Sep 17 00:00:00 2001
400dab
From: Ray Strode <rstrode@redhat.com>
400dab
Date: Fri, 31 Aug 2018 15:48:38 -0400
400dab
Subject: [PATCH 38/51] manager: don't kill initial-setup before starting user
400dab
 session on wayland
400dab
400dab
Right now we kill initial-setup before starting the session for the user
400dab
initial-setup created.  This is the right thing to do for Xorg, since
400dab
Xorg can't be killed in the background, but it adds unncessary flicker
400dab
for wayland.
400dab
400dab
This commit checks if it's wayland and avoids killing it right away
400dab
in that case.
400dab
---
400dab
 daemon/gdm-manager.c | 26 +++++++++++++++++++++-----
400dab
 1 file changed, 21 insertions(+), 5 deletions(-)
400dab
400dab
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
400dab
index e896c8945..0823e8638 100644
400dab
--- a/daemon/gdm-manager.c
400dab
+++ b/daemon/gdm-manager.c
400dab
@@ -1639,105 +1639,121 @@ create_display_for_user_session (GdmManager *self,
400dab
         GdmDisplay *display;
400dab
         /* at the moment we only create GdmLocalDisplay objects on seat0 */
400dab
         const char *seat_id = "seat0";
400dab
 
400dab
         display = gdm_local_display_new ();
400dab
 
400dab
         g_object_set (G_OBJECT (display),
400dab
                       "session-class", "user",
400dab
                       "seat-id", seat_id,
400dab
                       "session-id", session_id,
400dab
                       NULL);
400dab
         gdm_display_store_add (self->priv->display_store,
400dab
                                display);
400dab
         g_object_set_data (G_OBJECT (session), "gdm-display", display);
400dab
         g_object_set_data_full (G_OBJECT (display),
400dab
                                 "gdm-user-session",
400dab
                                 g_object_ref (session),
400dab
                                 (GDestroyNotify)
400dab
                                 clean_user_session);
400dab
 }
400dab
 
400dab
 static gboolean
400dab
 on_start_user_session (StartUserSessionOperation *operation)
400dab
 {
400dab
         GdmManager *self = operation->manager;
400dab
         gboolean migrated;
400dab
         gboolean fail_if_already_switched = TRUE;
400dab
         gboolean doing_initial_setup = FALSE;
400dab
         GdmDisplay *display;
400dab
         const char *session_id;
400dab
+#if defined(ENABLE_WAYLAND_SUPPORT) && defined(ENABLE_USER_DISPLAY_SERVER)
400dab
+        g_autofree char *display_session_type = NULL;
400dab
+#endif
400dab
 
400dab
         g_debug ("GdmManager: start or jump to session");
400dab
 
400dab
         /* If there's already a session running, jump to it.
400dab
          * If the only session running is the one we just opened,
400dab
          * start a session on it.
400dab
          */
400dab
         migrated = switch_to_compatible_user_session (operation->manager, operation->session, fail_if_already_switched);
400dab
 
400dab
         g_debug ("GdmManager: migrated: %d", migrated);
400dab
         if (migrated) {
400dab
                 /* We don't stop the manager here because
400dab
                    when Xorg exits it switches to the VT it was
400dab
                    started from.  That interferes with fast
400dab
                    user switching. */
400dab
                 gdm_session_reset (operation->session);
400dab
                 destroy_start_user_session_operation (operation);
400dab
                 goto out;
400dab
         }
400dab
 
400dab
         display = get_display_for_user_session (operation->session);
400dab
 
400dab
-        g_object_get (G_OBJECT (display), "doing-initial-setup", &doing_initial_setup, NULL);
400dab
+        g_object_get (G_OBJECT (display),
400dab
+                      "doing-initial-setup", &doing_initial_setup,
400dab
+#if defined(ENABLE_WAYLAND_SUPPORT) && defined(ENABLE_USER_DISPLAY_SERVER)
400dab
+                      "session-type", &display_session_type,
400dab
+#endif
400dab
+                      NULL);
400dab
 
400dab
         session_id = gdm_session_get_conversation_session_id (operation->session,
400dab
                                                               operation->service_name);
400dab
 
400dab
         if (gdm_session_get_display_mode (operation->session) == GDM_SESSION_DISPLAY_MODE_REUSE_VT) {
400dab
                 /* In this case, the greeter's display is morphing into
400dab
                  * the user session display. Kill the greeter on this session
400dab
                  * and let the user session follow the same display. */
400dab
                 gdm_display_stop_greeter_session (display);
400dab
                 g_object_set (G_OBJECT (display),
400dab
                                 "session-class", "user",
400dab
                                 "session-id", session_id,
400dab
                                 NULL);
400dab
         } else {
400dab
                 uid_t allowed_uid;
400dab
 
400dab
                 g_object_ref (display);
400dab
                 if (doing_initial_setup) {
400dab
-                        g_debug ("GdmManager: closing down initial setup display");
400dab
-                        gdm_display_stop_greeter_session (display);
400dab
-                        gdm_display_unmanage (display);
400dab
-                        gdm_display_finish (display);
400dab
+#if defined(ENABLE_WAYLAND_SUPPORT) && defined(ENABLE_USER_DISPLAY_SERVER)
400dab
+                        if (g_strcmp0 (display_session_type, "wayland") == 0) {
400dab
+                                g_debug ("GdmManager: closing down initial setup display in background");
400dab
+                                g_object_set (G_OBJECT (display), "status", GDM_DISPLAY_WAITING_TO_FINISH, NULL);
400dab
+                        }
400dab
+#endif
400dab
+                        if (gdm_display_get_status (display) == GDM_DISPLAY_MANAGED) {
400dab
+                                g_debug ("GdmManager: closing down initial setup display");
400dab
+                                gdm_display_stop_greeter_session (display);
400dab
+                                gdm_display_unmanage (display);
400dab
+                                gdm_display_finish (display);
400dab
+                        }
400dab
                 } else {
400dab
                         g_debug ("GdmManager: session has its display server, reusing our server for another login screen");
400dab
                 }
400dab
 
400dab
                 /* The user session is going to follow the session worker
400dab
                  * into the new display. Untie it from this display and
400dab
                  * create a new session for a future user login. */
400dab
                 allowed_uid = gdm_session_get_allowed_user (operation->session);
400dab
                 g_object_set_data (G_OBJECT (display), "gdm-user-session", NULL);
400dab
                 g_object_set_data (G_OBJECT (operation->session), "gdm-display", NULL);
400dab
                 create_user_session_for_display (operation->manager, display, allowed_uid);
400dab
 
400dab
                 /* Give the user session a new display object for bookkeeping purposes */
400dab
                 create_display_for_user_session (operation->manager,
400dab
                                                  operation->session,
400dab
                                                  session_id);
400dab
 
400dab
                 if ((g_strcmp0 (operation->service_name, "gdm-autologin") == 0) &&
400dab
                     !gdm_session_client_is_connected (operation->session)) {
400dab
                         /* remove the unused prepared greeter display since we're not going
400dab
                          * to have a greeter */
400dab
                         gdm_display_store_remove (self->priv->display_store, display);
400dab
                         g_object_unref (display);
400dab
 
400dab
                         self->priv->automatic_login_display = g_object_get_data (G_OBJECT (operation->session), "gdm-display");
400dab
                         g_object_add_weak_pointer (G_OBJECT (self->priv->automatic_login_display), (gpointer *) &self->priv->automatic_login_display);
400dab
                 }
400dab
         }
400dab
 
400dab
         start_user_session (operation->manager, operation);
400dab
-- 
400dab
2.27.0
400dab