|
|
c90517 |
From f9021afe364c757e0f2f129987e5ca466f05f1c9 Mon Sep 17 00:00:00 2001
|
|
|
c90517 |
From: Ray Strode <rstrode@redhat.com>
|
|
|
c90517 |
Date: Tue, 25 Sep 2018 14:30:16 -0400
|
|
|
c90517 |
Subject: [PATCH 36/48] local-display-factory: Remove same VT so don't switch
|
|
|
c90517 |
check
|
|
|
c90517 |
|
|
|
c90517 |
We avoid changing to the login screen vt if we're already on it,
|
|
|
c90517 |
but the call is racy since we react to vt changes concurrently
|
|
|
c90517 |
with logind (who we query for the active vt).
|
|
|
c90517 |
|
|
|
c90517 |
This check drops the active vt check since it's pointless and
|
|
|
c90517 |
getting in the way.
|
|
|
c90517 |
---
|
|
|
c90517 |
daemon/gdm-local-display-factory.c | 39 ++++++++++--------------------
|
|
|
c90517 |
1 file changed, 13 insertions(+), 26 deletions(-)
|
|
|
c90517 |
|
|
|
c90517 |
diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c
|
|
|
c90517 |
index 8e46dbca2..be7b43cff 100644
|
|
|
c90517 |
--- a/daemon/gdm-local-display-factory.c
|
|
|
c90517 |
+++ b/daemon/gdm-local-display-factory.c
|
|
|
c90517 |
@@ -410,103 +410,90 @@ lookup_by_seat_id (const char *id,
|
|
|
c90517 |
res = g_strcmp0 (current, looking_for) == 0;
|
|
|
c90517 |
|
|
|
c90517 |
g_free(current);
|
|
|
c90517 |
|
|
|
c90517 |
return res;
|
|
|
c90517 |
}
|
|
|
c90517 |
|
|
|
c90517 |
static gboolean
|
|
|
c90517 |
lookup_prepared_display_by_seat_id (const char *id,
|
|
|
c90517 |
GdmDisplay *display,
|
|
|
c90517 |
gpointer user_data)
|
|
|
c90517 |
{
|
|
|
c90517 |
int status;
|
|
|
c90517 |
|
|
|
c90517 |
status = gdm_display_get_status (display);
|
|
|
c90517 |
|
|
|
c90517 |
if (status != GDM_DISPLAY_PREPARED)
|
|
|
c90517 |
return FALSE;
|
|
|
c90517 |
|
|
|
c90517 |
return lookup_by_seat_id (id, display, user_data);
|
|
|
c90517 |
}
|
|
|
c90517 |
|
|
|
c90517 |
static GdmDisplay *
|
|
|
c90517 |
create_display (GdmLocalDisplayFactory *factory,
|
|
|
c90517 |
const char *seat_id,
|
|
|
c90517 |
const char *session_type,
|
|
|
c90517 |
gboolean initial)
|
|
|
c90517 |
{
|
|
|
c90517 |
GdmDisplayStore *store;
|
|
|
c90517 |
GdmDisplay *display = NULL;
|
|
|
c90517 |
- char *active_session_id = NULL;
|
|
|
c90517 |
- int ret;
|
|
|
c90517 |
+ g_autofree char *login_session_id = NULL;
|
|
|
c90517 |
|
|
|
c90517 |
g_debug ("GdmLocalDisplayFactory: %s login display for seat %s requested",
|
|
|
c90517 |
session_type? : "X11", seat_id);
|
|
|
c90517 |
store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory));
|
|
|
c90517 |
|
|
|
c90517 |
if (sd_seat_can_multi_session (seat_id))
|
|
|
c90517 |
display = gdm_display_store_find (store, lookup_prepared_display_by_seat_id, (gpointer) seat_id);
|
|
|
c90517 |
else
|
|
|
c90517 |
display = gdm_display_store_find (store, lookup_by_seat_id, (gpointer) seat_id);
|
|
|
c90517 |
|
|
|
c90517 |
/* Ensure we don't create the same display more than once */
|
|
|
c90517 |
if (display != NULL) {
|
|
|
c90517 |
g_debug ("GdmLocalDisplayFactory: display already created");
|
|
|
c90517 |
return NULL;
|
|
|
c90517 |
}
|
|
|
c90517 |
|
|
|
c90517 |
- ret = sd_seat_get_active (seat_id, &active_session_id, NULL);
|
|
|
c90517 |
-
|
|
|
c90517 |
- if (ret == 0) {
|
|
|
c90517 |
- char *login_session_id = NULL;
|
|
|
c90517 |
-
|
|
|
c90517 |
- /* If we already have a login window, switch to it */
|
|
|
c90517 |
- if (gdm_get_login_window_session_id (seat_id, &login_session_id)) {
|
|
|
c90517 |
- GdmDisplay *display;
|
|
|
c90517 |
-
|
|
|
c90517 |
- display = gdm_display_store_find (store,
|
|
|
c90517 |
- lookup_by_session_id,
|
|
|
c90517 |
- (gpointer) login_session_id);
|
|
|
c90517 |
- if (display != NULL && gdm_display_get_status (display) == GDM_DISPLAY_MANAGED) {
|
|
|
c90517 |
- if (g_strcmp0 (active_session_id, login_session_id) != 0) {
|
|
|
c90517 |
- g_debug ("GdmLocalDisplayFactory: session %s found, activating.",
|
|
|
c90517 |
- login_session_id);
|
|
|
c90517 |
- gdm_activate_session_by_id (factory->priv->connection, seat_id, login_session_id);
|
|
|
c90517 |
- }
|
|
|
c90517 |
- g_clear_pointer (&login_session_id, g_free);
|
|
|
c90517 |
- g_clear_pointer (&active_session_id, g_free);
|
|
|
c90517 |
- return NULL;
|
|
|
c90517 |
- }
|
|
|
c90517 |
- g_clear_pointer (&login_session_id, g_free);
|
|
|
c90517 |
+ /* If we already have a login window, switch to it */
|
|
|
c90517 |
+ if (gdm_get_login_window_session_id (seat_id, &login_session_id)) {
|
|
|
c90517 |
+ GdmDisplay *display;
|
|
|
c90517 |
+
|
|
|
c90517 |
+ display = gdm_display_store_find (store,
|
|
|
c90517 |
+ lookup_by_session_id,
|
|
|
c90517 |
+ (gpointer) login_session_id);
|
|
|
c90517 |
+ if (display != NULL && gdm_display_get_status (display) == GDM_DISPLAY_MANAGED) {
|
|
|
c90517 |
+ g_debug ("GdmLocalDisplayFactory: session %s found, activating.",
|
|
|
c90517 |
+ login_session_id);
|
|
|
c90517 |
+ gdm_activate_session_by_id (factory->priv->connection, seat_id, login_session_id);
|
|
|
c90517 |
+ return NULL;
|
|
|
c90517 |
}
|
|
|
c90517 |
- g_clear_pointer (&active_session_id, g_free);
|
|
|
c90517 |
}
|
|
|
c90517 |
|
|
|
c90517 |
g_debug ("GdmLocalDisplayFactory: Adding display on seat %s", seat_id);
|
|
|
c90517 |
|
|
|
c90517 |
#ifdef ENABLE_USER_DISPLAY_SERVER
|
|
|
c90517 |
if (g_strcmp0 (seat_id, "seat0") == 0) {
|
|
|
c90517 |
display = gdm_local_display_new ();
|
|
|
c90517 |
if (session_type != NULL) {
|
|
|
c90517 |
g_object_set (G_OBJECT (display), "session-type", session_type, NULL);
|
|
|
c90517 |
}
|
|
|
c90517 |
}
|
|
|
c90517 |
#endif
|
|
|
c90517 |
|
|
|
c90517 |
if (display == NULL) {
|
|
|
c90517 |
guint32 num;
|
|
|
c90517 |
|
|
|
c90517 |
num = take_next_display_number (factory);
|
|
|
c90517 |
|
|
|
c90517 |
display = gdm_legacy_display_new (num);
|
|
|
c90517 |
}
|
|
|
c90517 |
|
|
|
c90517 |
g_object_set (display, "seat-id", seat_id, NULL);
|
|
|
c90517 |
g_object_set (display, "is-initial", initial, NULL);
|
|
|
c90517 |
|
|
|
c90517 |
store_display (factory, display);
|
|
|
c90517 |
|
|
|
c90517 |
/* let store own the ref */
|
|
|
c90517 |
g_object_unref (display);
|
|
|
c90517 |
|
|
|
c90517 |
if (! gdm_display_manage (display)) {
|
|
|
c90517 |
--
|
|
|
c90517 |
2.26.0
|
|
|
c90517 |
|