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

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