Blame SOURCES/0005-daemon-try-harder-to-get-to-a-login-screen-at-logout.patch

ca70cf
From b7b492296a69bc5100ff5908048ed5ef121d3587 Mon Sep 17 00:00:00 2001
ca70cf
From: Ray Strode <rstrode@redhat.com>
ca70cf
Date: Mon, 30 Jul 2018 16:21:29 -0400
ca70cf
Subject: [PATCH 5/7] daemon: try harder to get to a login screen at logout
ca70cf
ca70cf
commit 22c332ba and some follow up commits try to ensure the
ca70cf
user never stays on a blank VT by jumping to a login screen in
ca70cf
the event they'd end up on one.
ca70cf
ca70cf
Unfortunately, that part of the code can't start a login screen
ca70cf
if there's not one running at all.
ca70cf
ca70cf
This commit moves the code to GdmLocalDisplyFactor where the
ca70cf
login screens are created, so users won't end up on a blank
ca70cf
VT even if no login screen is yet running.
ca70cf
---
ca70cf
 daemon/gdm-local-display-factory.c | 161 ++++++++++++++++++++++++++++-
ca70cf
 daemon/gdm-manager.c               |  54 ----------
ca70cf
 2 files changed, 156 insertions(+), 59 deletions(-)
ca70cf
ca70cf
diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
ca70cf
index b29f5ac52..cf852b55a 100644
ca70cf
--- a/daemon/gdm-local-display-factory.c
ca70cf
+++ b/daemon/gdm-local-display-factory.c
ca70cf
@@ -1,60 +1,62 @@
ca70cf
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
ca70cf
  *
ca70cf
  * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
ca70cf
  *
ca70cf
  * This program is free software; you can redistribute it and/or modify
ca70cf
  * it under the terms of the GNU General Public License as published by
ca70cf
  * the Free Software Foundation; either version 2 of the License, or
ca70cf
  * (at your option) any later version.
ca70cf
  *
ca70cf
  * This program is distributed in the hope that it will be useful,
ca70cf
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
ca70cf
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
ca70cf
  * GNU General Public License for more details.
ca70cf
  *
ca70cf
  * You should have received a copy of the GNU General Public License
ca70cf
  * along with this program; if not, write to the Free Software
ca70cf
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
ca70cf
  *
ca70cf
  */
ca70cf
 
ca70cf
 #include "config.h"
ca70cf
 
ca70cf
 #include <stdlib.h>
ca70cf
 #include <stdio.h>
ca70cf
 
ca70cf
 #include <glib.h>
ca70cf
 #include <glib/gi18n.h>
ca70cf
 #include <glib-object.h>
ca70cf
 #include <gio/gio.h>
ca70cf
 
ca70cf
+#include <systemd/sd-login.h>
ca70cf
+
ca70cf
 #include "gdm-common.h"
ca70cf
 #include "gdm-manager.h"
ca70cf
 #include "gdm-display-factory.h"
ca70cf
 #include "gdm-local-display-factory.h"
ca70cf
 #include "gdm-local-display-factory-glue.h"
ca70cf
 
ca70cf
 #include "gdm-settings-keys.h"
ca70cf
 #include "gdm-settings-direct.h"
ca70cf
 #include "gdm-display-store.h"
ca70cf
 #include "gdm-local-display.h"
ca70cf
 #include "gdm-legacy-display.h"
ca70cf
 
ca70cf
 #define GDM_LOCAL_DISPLAY_FACTORY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_LOCAL_DISPLAY_FACTORY, GdmLocalDisplayFactoryPrivate))
ca70cf
 
ca70cf
 #define GDM_DBUS_PATH                       "/org/gnome/DisplayManager"
ca70cf
 #define GDM_LOCAL_DISPLAY_FACTORY_DBUS_PATH GDM_DBUS_PATH "/LocalDisplayFactory"
ca70cf
 #define GDM_MANAGER_DBUS_NAME               "org.gnome.DisplayManager.LocalDisplayFactory"
ca70cf
 
ca70cf
 #define MAX_DISPLAY_FAILURES 5
ca70cf
 
ca70cf
 struct GdmLocalDisplayFactoryPrivate
ca70cf
 {
ca70cf
         GdmDBusLocalDisplayFactory *skeleton;
ca70cf
         GDBusConnection *connection;
ca70cf
         GHashTable      *used_display_numbers;
ca70cf
 
ca70cf
         /* FIXME: this needs to be per seat? */
ca70cf
         guint            num_failures;
ca70cf
 
ca70cf
         guint            seat_new_id;
ca70cf
@@ -226,171 +228,320 @@ gdm_local_display_factory_create_transient_display (GdmLocalDisplayFactory *fact
ca70cf
         store_display (factory, display);
ca70cf
 
ca70cf
         if (! gdm_display_manage (display)) {
ca70cf
                 display = NULL;
ca70cf
                 goto out;
ca70cf
         }
ca70cf
 
ca70cf
         if (! gdm_display_get_id (display, id, NULL)) {
ca70cf
                 display = NULL;
ca70cf
                 goto out;
ca70cf
         }
ca70cf
 
ca70cf
         ret = TRUE;
ca70cf
  out:
ca70cf
         /* ref either held by store or not at all */
ca70cf
         g_object_unref (display);
ca70cf
 
ca70cf
         return ret;
ca70cf
 }
ca70cf
 
ca70cf
 static void
ca70cf
 on_display_status_changed (GdmDisplay             *display,
ca70cf
                            GParamSpec             *arg1,
ca70cf
                            GdmLocalDisplayFactory *factory)
ca70cf
 {
ca70cf
         int              status;
ca70cf
         GdmDisplayStore *store;
ca70cf
         int              num;
ca70cf
         char            *seat_id = NULL;
ca70cf
         char            *session_type = NULL;
ca70cf
+        char            *session_class = NULL;
ca70cf
         gboolean         is_initial = TRUE;
ca70cf
         gboolean         is_local = TRUE;
ca70cf
 
ca70cf
         num = -1;
ca70cf
         gdm_display_get_x11_display_number (display, &num, NULL);
ca70cf
 
ca70cf
         store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
ca70cf
 
ca70cf
         g_object_get (display,
ca70cf
                       "seat-id", &seat_id,
ca70cf
                       "is-initial", &is_initial,
ca70cf
                       "is-local", &is_local,
ca70cf
                       "session-type", &session_type,
ca70cf
+                      "session-class", &session_class,
ca70cf
                       NULL);
ca70cf
 
ca70cf
         status = gdm_display_get_status (display);
ca70cf
 
ca70cf
         g_debug ("GdmLocalDisplayFactory: display status changed: %d", status);
ca70cf
         switch (status) {
ca70cf
         case GDM_DISPLAY_FINISHED:
ca70cf
                 /* remove the display number from factory->priv->used_display_numbers
ca70cf
                    so that it may be reused */
ca70cf
                 if (num != -1) {
ca70cf
                         g_hash_table_remove (factory->priv->used_display_numbers, GUINT_TO_POINTER (num));
ca70cf
                 }
ca70cf
                 gdm_display_store_remove (store, display);
ca70cf
 
ca70cf
                 /* if this is a local display, do a full resync.  Only
ca70cf
                  * seats without displays will get created anyway.  This
ca70cf
                  * ensures we get a new login screen when the user logs out,
ca70cf
                  * if there isn't one.
ca70cf
                  */
ca70cf
-                if (is_local) {
ca70cf
+                if (is_local && g_strcmp0 (session_class, "greeter") != 0) {
ca70cf
                         /* reset num failures */
ca70cf
                         factory->priv->num_failures = 0;
ca70cf
 
ca70cf
                         gdm_local_display_factory_sync_seats (factory);
ca70cf
                 }
ca70cf
                 break;
ca70cf
         case GDM_DISPLAY_FAILED:
ca70cf
                 /* leave the display number in factory->priv->used_display_numbers
ca70cf
                    so that it doesn't get reused */
ca70cf
                 gdm_display_store_remove (store, display);
ca70cf
 
ca70cf
                 /* Create a new equivalent display if it was static */
ca70cf
                 if (is_local) {
ca70cf
 
ca70cf
                         factory->priv->num_failures++;
ca70cf
 
ca70cf
                         if (factory->priv->num_failures > MAX_DISPLAY_FAILURES) {
ca70cf
                                 /* oh shit */
ca70cf
                                 g_warning ("GdmLocalDisplayFactory: maximum number of X display failures reached: check X server log for errors");
ca70cf
                         } else {
ca70cf
 #ifdef ENABLE_WAYLAND_SUPPORT
ca70cf
                                 if (g_strcmp0 (session_type, "wayland") == 0) {
ca70cf
                                         g_free (session_type);
ca70cf
                                         session_type = NULL;
ca70cf
                                 }
ca70cf
 
ca70cf
 #endif
ca70cf
                                 create_display (factory, seat_id, session_type, is_initial);
ca70cf
                         }
ca70cf
                 }
ca70cf
                 break;
ca70cf
         case GDM_DISPLAY_UNMANAGED:
ca70cf
                 break;
ca70cf
         case GDM_DISPLAY_PREPARED:
ca70cf
                 break;
ca70cf
         case GDM_DISPLAY_MANAGED:
ca70cf
                 break;
ca70cf
         default:
ca70cf
                 g_assert_not_reached ();
ca70cf
                 break;
ca70cf
         }
ca70cf
 
ca70cf
         g_free (seat_id);
ca70cf
         g_free (session_type);
ca70cf
+        g_free (session_class);
ca70cf
 }
ca70cf
 
ca70cf
 static gboolean
ca70cf
 lookup_by_seat_id (const char *id,
ca70cf
                    GdmDisplay *display,
ca70cf
                    gpointer    user_data)
ca70cf
 {
ca70cf
         const char *looking_for = user_data;
ca70cf
         char *current;
ca70cf
         gboolean res;
ca70cf
 
ca70cf
         g_object_get (G_OBJECT (display), "seat-id", &current, NULL);
ca70cf
 
ca70cf
         res = g_strcmp0 (current, looking_for) == 0;
ca70cf
 
ca70cf
         g_free(current);
ca70cf
 
ca70cf
         return res;
ca70cf
 }
ca70cf
 
ca70cf
+static gboolean
ca70cf
+activate_session_id (GdmLocalDisplayFactory *self,
ca70cf
+                     const char             *seat_id,
ca70cf
+                     const char             *session_id)
ca70cf
+{
ca70cf
+        GError *error = NULL;
ca70cf
+        GVariant *reply;
ca70cf
+
ca70cf
+        reply = g_dbus_connection_call_sync (self->priv->connection,
ca70cf
+                                             "org.freedesktop.login1",
ca70cf
+                                             "/org/freedesktop/login1",
ca70cf
+                                             "org.freedesktop.login1.Manager",
ca70cf
+                                             "ActivateSessionOnSeat",
ca70cf
+                                             g_variant_new ("(ss)", session_id, seat_id),
ca70cf
+                                             NULL, /* expected reply */
ca70cf
+                                             G_DBUS_CALL_FLAGS_NONE,
ca70cf
+                                             -1,
ca70cf
+                                             NULL,
ca70cf
+                                             &error);
ca70cf
+        if (reply == NULL) {
ca70cf
+                g_debug ("GdmManager: logind 'ActivateSessionOnSeat' %s raised:\n %s\n\n",
ca70cf
+                         g_dbus_error_get_remote_error (error), error->message);
ca70cf
+                g_error_free (error);
ca70cf
+                return FALSE;
ca70cf
+        }
ca70cf
+
ca70cf
+        g_variant_unref (reply);
ca70cf
+
ca70cf
+        return TRUE;
ca70cf
+}
ca70cf
+
ca70cf
+static gboolean
ca70cf
+get_login_window_session_id (const char  *seat_id,
ca70cf
+                             char       **session_id)
ca70cf
+{
ca70cf
+        gboolean   ret;
ca70cf
+        int        res, i;
ca70cf
+        char     **sessions;
ca70cf
+        char      *service_id;
ca70cf
+        char      *service_class;
ca70cf
+        char      *state;
ca70cf
+
ca70cf
+        res = sd_seat_get_sessions (seat_id, &sessions, NULL, NULL);
ca70cf
+        if (res < 0) {
ca70cf
+                g_debug ("Failed to determine sessions: %s", strerror (-res));
ca70cf
+                return FALSE;
ca70cf
+        }
ca70cf
+
ca70cf
+        if (sessions == NULL || sessions[0] == NULL) {
ca70cf
+                *session_id = NULL;
ca70cf
+                ret = TRUE;
ca70cf
+                goto out;
ca70cf
+        }
ca70cf
+
ca70cf
+        for (i = 0; sessions[i]; i ++) {
ca70cf
+
ca70cf
+                res = sd_session_get_class (sessions[i], &service_class);
ca70cf
+                if (res < 0) {
ca70cf
+                        if (res == -ENOENT || res == -ENXIO) {
ca70cf
+                                continue;
ca70cf
+                        }
ca70cf
+
ca70cf
+                        g_debug ("failed to determine class of session %s: %s", sessions[i], strerror (-res));
ca70cf
+                        ret = FALSE;
ca70cf
+                        goto out;
ca70cf
+                }
ca70cf
+
ca70cf
+                if (strcmp (service_class, "greeter") != 0) {
ca70cf
+                        free (service_class);
ca70cf
+                        continue;
ca70cf
+                }
ca70cf
+
ca70cf
+                free (service_class);
ca70cf
+
ca70cf
+                ret = sd_session_get_state (sessions[i], &state);
ca70cf
+                if (ret < 0) {
ca70cf
+                        if (res == -ENOENT || res == -ENXIO)
ca70cf
+                                continue;
ca70cf
+
ca70cf
+                        g_debug ("failed to determine state of session %s: %s", sessions[i], strerror (-res));
ca70cf
+                        ret = FALSE;
ca70cf
+                        goto out;
ca70cf
+                }
ca70cf
+
ca70cf
+                if (g_strcmp0 (state, "closing") == 0) {
ca70cf
+                        free (state);
ca70cf
+                        continue;
ca70cf
+                }
ca70cf
+                free (state);
ca70cf
+
ca70cf
+                res = sd_session_get_service (sessions[i], &service_id);
ca70cf
+                if (res < 0) {
ca70cf
+                        if (res == -ENOENT || res == -ENXIO)
ca70cf
+                                continue;
ca70cf
+                        g_debug ("failed to determine service of session %s: %s", sessions[i], strerror (-res));
ca70cf
+                        ret = FALSE;
ca70cf
+                        goto out;
ca70cf
+                }
ca70cf
+
ca70cf
+                if (strcmp (service_id, "gdm-launch-environment") == 0) {
ca70cf
+                        *session_id = g_strdup (sessions[i]);
ca70cf
+                        ret = TRUE;
ca70cf
+
ca70cf
+                        free (service_id);
ca70cf
+                        goto out;
ca70cf
+                }
ca70cf
+
ca70cf
+                free (service_id);
ca70cf
+        }
ca70cf
+
ca70cf
+        *session_id = NULL;
ca70cf
+        ret = FALSE;
ca70cf
+
ca70cf
+out:
ca70cf
+        if (sessions) {
ca70cf
+                for (i = 0; sessions[i]; i ++) {
ca70cf
+                        free (sessions[i]);
ca70cf
+                }
ca70cf
+
ca70cf
+                free (sessions);
ca70cf
+        }
ca70cf
+
ca70cf
+        return ret;
ca70cf
+}
ca70cf
+
ca70cf
 static GdmDisplay *
ca70cf
 create_display (GdmLocalDisplayFactory *factory,
ca70cf
                 const char             *seat_id,
ca70cf
                 const char             *session_type,
ca70cf
                 gboolean                initial)
ca70cf
 {
ca70cf
         GdmDisplayStore *store;
ca70cf
         GdmDisplay      *display = NULL;
ca70cf
+        char            *active_session_id = NULL;
ca70cf
+        int              ret;
ca70cf
 
ca70cf
-        /* Ensure we don't create the same display more than once */
ca70cf
         store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
ca70cf
-        display = gdm_display_store_find (store, lookup_by_seat_id, (gpointer) seat_id);
ca70cf
-        if (display != NULL) {
ca70cf
-                return NULL;
ca70cf
+
ca70cf
+        ret = sd_seat_get_active (seat_id, &active_session_id, NULL);
ca70cf
+
ca70cf
+        if (ret == 0) {
ca70cf
+                char *login_session_id = NULL;
ca70cf
+
ca70cf
+                /* If we already have a login window, switch to it */
ca70cf
+                if (get_login_window_session_id (seat_id, &login_session_id)) {
ca70cf
+                        if (g_strcmp0 (active_session_id, login_session_id) != 0) {
ca70cf
+                                activate_session_id (factory, seat_id, login_session_id);
ca70cf
+                        }
ca70cf
+                        g_clear_pointer (&login_session_id, g_free);
ca70cf
+                        g_clear_pointer (&active_session_id, g_free);
ca70cf
+                        return NULL;
ca70cf
+                }
ca70cf
+                g_clear_pointer (&active_session_id, g_free);
ca70cf
+        } else {
ca70cf
+                /* Ensure we don't create the same display more than once */
ca70cf
+                display = gdm_display_store_find (store, lookup_by_seat_id, (gpointer) seat_id);
ca70cf
+
ca70cf
+                if (display != NULL) {
ca70cf
+                        return NULL;
ca70cf
+                }
ca70cf
         }
ca70cf
 
ca70cf
         g_debug ("GdmLocalDisplayFactory: Adding display on seat %s", seat_id);
ca70cf
 
ca70cf
 #ifdef ENABLE_USER_DISPLAY_SERVER
ca70cf
         if (g_strcmp0 (seat_id, "seat0") == 0) {
ca70cf
                 display = gdm_local_display_new ();
ca70cf
                 if (session_type != NULL) {
ca70cf
                         g_object_set (G_OBJECT (display), "session-type", session_type, NULL);
ca70cf
                 }
ca70cf
         }
ca70cf
 #endif
ca70cf
 
ca70cf
         if (display == NULL) {
ca70cf
                 guint32 num;
ca70cf
 
ca70cf
                 num = take_next_display_number (factory);
ca70cf
 
ca70cf
                 display = gdm_legacy_display_new (num);
ca70cf
         }
ca70cf
 
ca70cf
         g_object_set (display, "seat-id", seat_id, NULL);
ca70cf
         g_object_set (display, "is-initial", initial, NULL);
ca70cf
 
ca70cf
         store_display (factory, display);
ca70cf
 
ca70cf
         /* let store own the ref */
ca70cf
         g_object_unref (display);
ca70cf
 
ca70cf
         if (! gdm_display_manage (display)) {
ca70cf
diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c
ca70cf
index 34ee74033..031c61ce6 100644
ca70cf
--- a/daemon/gdm-manager.c
ca70cf
+++ b/daemon/gdm-manager.c
ca70cf
@@ -1318,171 +1318,118 @@ maybe_start_pending_initial_login (GdmManager *manager,
ca70cf
         g_free (user_session_seat_id);
ca70cf
 }
ca70cf
 
ca70cf
 static gboolean
ca70cf
 get_login_window_session_id (const char  *seat_id,
ca70cf
                              char       **session_id)
ca70cf
 {
ca70cf
         gboolean   ret;
ca70cf
         int        res, i;
ca70cf
         char     **sessions;
ca70cf
         char      *service_id;
ca70cf
         char      *service_class;
ca70cf
         char      *state;
ca70cf
 
ca70cf
         res = sd_seat_get_sessions (seat_id, &sessions, NULL, NULL);
ca70cf
         if (res < 0) {
ca70cf
                 g_debug ("Failed to determine sessions: %s", strerror (-res));
ca70cf
                 return FALSE;
ca70cf
         }
ca70cf
 
ca70cf
         if (sessions == NULL || sessions[0] == NULL) {
ca70cf
                 *session_id = NULL;
ca70cf
                 ret = FALSE;
ca70cf
                 goto out;
ca70cf
         }
ca70cf
 
ca70cf
         for (i = 0; sessions[i]; i ++) {
ca70cf
 
ca70cf
                 res = sd_session_get_class (sessions[i], &service_class);
ca70cf
                 if (res < 0) {
ca70cf
-                        if (res == -ENOENT || res == -ENXIO) {
ca70cf
-                                continue;
ca70cf
-                        }
ca70cf
-
ca70cf
                         g_debug ("failed to determine class of session %s: %s", sessions[i], strerror (-res));
ca70cf
                         ret = FALSE;
ca70cf
                         goto out;
ca70cf
                 }
ca70cf
 
ca70cf
                 if (strcmp (service_class, "greeter") != 0) {
ca70cf
                         free (service_class);
ca70cf
                         continue;
ca70cf
                 }
ca70cf
 
ca70cf
                 free (service_class);
ca70cf
 
ca70cf
                 ret = sd_session_get_state (sessions[i], &state);
ca70cf
                 if (ret < 0) {
ca70cf
-                        if (res == -ENOENT || res == -ENXIO)
ca70cf
-                                continue;
ca70cf
-
ca70cf
                         g_debug ("failed to determine state of session %s: %s", sessions[i], strerror (-res));
ca70cf
                         ret = FALSE;
ca70cf
                         goto out;
ca70cf
                 }
ca70cf
 
ca70cf
                 if (g_strcmp0 (state, "closing") == 0) {
ca70cf
                         free (state);
ca70cf
                         continue;
ca70cf
                 }
ca70cf
                 free (state);
ca70cf
 
ca70cf
                 res = sd_session_get_service (sessions[i], &service_id);
ca70cf
                 if (res < 0) {
ca70cf
-                        if (res == -ENOENT || res == -ENXIO)
ca70cf
-                                continue;
ca70cf
                         g_debug ("failed to determine service of session %s: %s", sessions[i], strerror (-res));
ca70cf
                         ret = FALSE;
ca70cf
                         goto out;
ca70cf
                 }
ca70cf
 
ca70cf
                 if (strcmp (service_id, "gdm-launch-environment") == 0) {
ca70cf
                         *session_id = g_strdup (sessions[i]);
ca70cf
                         ret = TRUE;
ca70cf
 
ca70cf
                         free (service_id);
ca70cf
                         goto out;
ca70cf
                 }
ca70cf
 
ca70cf
                 free (service_id);
ca70cf
         }
ca70cf
 
ca70cf
         *session_id = NULL;
ca70cf
         ret = FALSE;
ca70cf
 
ca70cf
 out:
ca70cf
         if (sessions) {
ca70cf
                 for (i = 0; sessions[i]; i ++) {
ca70cf
                         free (sessions[i]);
ca70cf
                 }
ca70cf
 
ca70cf
                 free (sessions);
ca70cf
         }
ca70cf
 
ca70cf
         return ret;
ca70cf
 }
ca70cf
 
ca70cf
-static void
ca70cf
-activate_login_window_session_on_seat (GdmManager *self,
ca70cf
-                                       const char *seat_id)
ca70cf
-{
ca70cf
-        char *session_id;
ca70cf
-
ca70cf
-        if (!get_login_window_session_id (seat_id, &session_id)) {
ca70cf
-                return;
ca70cf
-        }
ca70cf
-
ca70cf
-        activate_session_id (self, seat_id, session_id);
ca70cf
-}
ca70cf
-
ca70cf
-static void
ca70cf
-maybe_activate_other_session (GdmManager *self,
ca70cf
-                              GdmDisplay *old_display)
ca70cf
-{
ca70cf
-        char *seat_id = NULL;
ca70cf
-        char *session_id = NULL;
ca70cf
-        int ret;
ca70cf
-
ca70cf
-        g_object_get (G_OBJECT (old_display),
ca70cf
-                      "seat-id", &seat_id,
ca70cf
-                      NULL);
ca70cf
-
ca70cf
-        ret = sd_seat_get_active (seat_id, &session_id, NULL);
ca70cf
-
ca70cf
-        if (ret == 0) {
ca70cf
-                GdmDisplay *display;
ca70cf
-
ca70cf
-                display = gdm_display_store_find (self->priv->display_store,
ca70cf
-                                                  lookup_by_session_id,
ca70cf
-                                                  (gpointer) session_id);
ca70cf
-
ca70cf
-                if (display == NULL || gdm_display_get_status (display) == GDM_DISPLAY_FINISHED) {
ca70cf
-                        activate_login_window_session_on_seat (self, seat_id);
ca70cf
-                }
ca70cf
-
ca70cf
-                g_free (session_id);
ca70cf
-        }
ca70cf
-
ca70cf
-        g_free (seat_id);
ca70cf
-}
ca70cf
-
ca70cf
 static const char *
ca70cf
 get_username_for_greeter_display (GdmManager *manager,
ca70cf
                                   GdmDisplay *display)
ca70cf
 {
ca70cf
         gboolean doing_initial_setup = FALSE;
ca70cf
 
ca70cf
         g_object_get (G_OBJECT (display),
ca70cf
                       "doing-initial-setup", &doing_initial_setup,
ca70cf
                       NULL);
ca70cf
 
ca70cf
         if (doing_initial_setup) {
ca70cf
                 return INITIAL_SETUP_USERNAME;
ca70cf
         } else {
ca70cf
                 return GDM_USERNAME;
ca70cf
         }
ca70cf
 }
ca70cf
 
ca70cf
 static void
ca70cf
 set_up_automatic_login_session (GdmManager *manager,
ca70cf
                                 GdmDisplay *display)
ca70cf
 {
ca70cf
         GdmSession *session;
ca70cf
         char       *display_session_type = NULL;
ca70cf
         gboolean is_initial;
ca70cf
 
ca70cf
         /* 0 is root user; since the daemon talks to the session object
ca70cf
          * directly, itself, for automatic login
ca70cf
          */
ca70cf
         session = create_user_session_for_display (manager, display, 0);
ca70cf
 
ca70cf
@@ -1674,61 +1621,60 @@ on_display_status_changed (GdmDisplay *display,
ca70cf
                         if ((display_number == -1 && status == GDM_DISPLAY_PREPARED) ||
ca70cf
                             (display_number != -1 && status == GDM_DISPLAY_MANAGED)) {
ca70cf
                                 char *session_class;
ca70cf
 
ca70cf
                                 g_object_get (display,
ca70cf
                                               "session-class", &session_class,
ca70cf
                                               NULL);
ca70cf
                                 if (g_strcmp0 (session_class, "greeter") == 0)
ca70cf
                                         set_up_session (manager, display);
ca70cf
                                 g_free (session_class);
ca70cf
                         }
ca70cf
 
ca70cf
                         if (status == GDM_DISPLAY_MANAGED) {
ca70cf
                                 greeter_display_started (manager, display);
ca70cf
                         }
ca70cf
                         break;
ca70cf
                 case GDM_DISPLAY_FAILED:
ca70cf
                 case GDM_DISPLAY_UNMANAGED:
ca70cf
                 case GDM_DISPLAY_FINISHED:
ca70cf
 #ifdef WITH_PLYMOUTH
ca70cf
                         if (quit_plymouth) {
ca70cf
                                 plymouth_quit_without_transition ();
ca70cf
                                 manager->priv->plymouth_is_running = FALSE;
ca70cf
                         }
ca70cf
 #endif
ca70cf
 
ca70cf
                         if (status == GDM_DISPLAY_FINISHED || g_strcmp0 (session_type, "x11") == 0) {
ca70cf
                                 manager->priv->ran_once = TRUE;
ca70cf
                         }
ca70cf
                         maybe_start_pending_initial_login (manager, display);
ca70cf
-                        maybe_activate_other_session (manager, display);
ca70cf
                         break;
ca70cf
                 default:
ca70cf
                         break;
ca70cf
         }
ca70cf
 
ca70cf
 }
ca70cf
 
ca70cf
 static void
ca70cf
 on_display_removed (GdmDisplayStore *display_store,
ca70cf
                     const char      *id,
ca70cf
                     GdmManager      *manager)
ca70cf
 {
ca70cf
         GdmDisplay *display;
ca70cf
 
ca70cf
         display = gdm_display_store_lookup (display_store, id);
ca70cf
         if (display != NULL) {
ca70cf
                 g_dbus_object_manager_server_unexport (manager->priv->object_manager, id);
ca70cf
 
ca70cf
                 g_signal_handlers_disconnect_by_func (display, G_CALLBACK (on_display_status_changed), manager);
ca70cf
 
ca70cf
                 g_signal_emit (manager, signals[DISPLAY_REMOVED], 0, id);
ca70cf
         }
ca70cf
 }
ca70cf
 
ca70cf
 static void
ca70cf
 destroy_start_user_session_operation (StartUserSessionOperation *operation)
ca70cf
 {
ca70cf
         g_object_set_data (G_OBJECT (operation->session),
ca70cf
                            "start-user-session-operation",
ca70cf
                            NULL);
ca70cf
-- 
ca70cf
2.19.0
ca70cf