diff --git a/0001-Revert-hack-that-quits-plymouth-late.patch b/0001-Revert-hack-that-quits-plymouth-late.patch new file mode 100644 index 0000000..164d8d0 --- /dev/null +++ b/0001-Revert-hack-that-quits-plymouth-late.patch @@ -0,0 +1,367 @@ +From 8a91856f4020657adcbba67482daa6db373e8ed6 Mon Sep 17 00:00:00 2001 +From: Adrian Vovk +Date: Thu, 1 May 2025 15:42:49 -0400 +Subject: [PATCH 1/2] Revert hack that quits plymouth late + +Reverts 2cbd7ad1f66d0a757c1d2217705436aa1beca76a + +Fixes #375 + +Part-of: +--- + daemon/gdm-manager.c | 27 ++++++++------------------- + 1 file changed, 8 insertions(+), 19 deletions(-) + +diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c +index b904f93..e04791b 100644 +--- a/daemon/gdm-manager.c ++++ b/daemon/gdm-manager.c +@@ -175,7 +175,7 @@ plymouth_prepare_for_transition (void) + } + } + +-static gboolean ++static void + plymouth_quit_with_transition (void) + { + gboolean res; +@@ -187,8 +187,6 @@ plymouth_quit_with_transition (void) + g_warning ("Could not quit plymouth: %s", error->message); + g_error_free (error); + } +- +- return G_SOURCE_REMOVE; + } + + static void +@@ -1641,6 +1639,13 @@ on_display_status_changed (GdmDisplay *display, + set_up_session (manager, display); + g_free (session_class); + } ++ ++#ifdef WITH_PLYMOUTH ++ if (status == GDM_DISPLAY_MANAGED && quit_plymouth) { ++ plymouth_quit_with_transition (); ++ manager->priv->plymouth_is_running = FALSE; ++ } ++#endif + break; + + case GDM_DISPLAY_FAILING: +@@ -2060,15 +2065,6 @@ on_user_session_started (GdmSession *session, + { + g_debug ("GdmManager: session started %d", pid); + add_session_record (manager, session, pid, SESSION_RECORD_LOGIN); +- +-#ifdef WITH_PLYMOUTH +- if (g_strcmp0 (service_name, "gdm-autologin") == 0) { +- if (manager->priv->plymouth_is_running) { +- g_timeout_add_seconds (20, (GSourceFunc) plymouth_quit_with_transition, NULL); +- manager->priv->plymouth_is_running = FALSE; +- } +- } +-#endif + } + + static void +@@ -2261,13 +2257,6 @@ on_session_client_connected (GdmSession *session, + return; + } + +-#ifdef WITH_PLYMOUTH +- if (manager->priv->plymouth_is_running) { +- plymouth_quit_with_transition (); +- manager->priv->plymouth_is_running = FALSE; +- } +-#endif +- + g_object_get (G_OBJECT (display), "allow-timed-login", &allow_timed_login, NULL); + + if (!allow_timed_login) { +-- +2.51.0 + +From deeb4b8aba46e37a1f6dcb85252ed713183cb170 Mon Sep 17 00:00:00 2001 +From: Adrian Vovk +Date: Thu, 1 May 2025 16:13:53 -0400 +Subject: [PATCH 2/2] manager: Combine register display with register session + +Before we'd always register the display as soon as the session was +started. However, this is too early for Wayland! The compositor might +not have completely initialized its Wayland connection yet, so the +display isn't really open. + +The "register display" should happen when the compositor is up and +running. This occurs when it calls RegisterSession, so it makes sense +to combine both. + +This helps on terminating plymouthd when the new session has been +started, and also kill background greeters. + +Part-of: +--- + daemon/gdm-local-display-factory.c | 33 ++++----------------- + daemon/gdm-manager.c | 47 ++++++------------------------ + daemon/gdm-manager.xml | 3 -- + daemon/gdm-wayland-session.c | 31 -------------------- + daemon/gdm-x-session.c | 32 -------------------- + 5 files changed, 15 insertions(+), 131 deletions(-) + +diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c +index 51f6f34..ef2ff7c 100644 +--- a/daemon/gdm-local-display-factory.c ++++ b/daemon/gdm-local-display-factory.c +@@ -506,25 +506,6 @@ on_finish_waiting_for_seat0_displays_timeout (GdmLocalDisplayFactory *factory) + return G_SOURCE_REMOVE; + } + +-static void +-on_session_registered_cb (GObject *gobject, +- GParamSpec *pspec, +- gpointer user_data) +-{ +- GdmDisplay *display = GDM_DISPLAY (gobject); +- GdmLocalDisplayFactory *factory = GDM_LOCAL_DISPLAY_FACTORY (user_data); +- gboolean registered; +- +- g_object_get (display, "session-registered", ®istered, NULL); +- +- if (!registered) +- return; +- +- g_debug ("GdmLocalDisplayFactory: session registered on display, looking for any background displays to kill"); +- +- finish_waiting_displays_on_seat (factory, "seat0"); +-} +- + static void + on_display_status_changed (GdmDisplay *display, + GParamSpec *arg1, +@@ -537,6 +518,7 @@ on_display_status_changed (GdmDisplay *display, + char *session_class = NULL; + gboolean is_initial = TRUE; + gboolean is_local = TRUE; ++ gboolean registered = FALSE; + + + if (!factory->is_started) +@@ -602,14 +584,11 @@ on_display_status_changed (GdmDisplay *display, + break; + case GDM_DISPLAY_MANAGED: + #if defined(ENABLE_USER_DISPLAY_SERVER) +- g_signal_handlers_disconnect_by_func (display, +- G_CALLBACK (on_session_registered_cb), +- factory); +- g_signal_connect_object (display, +- "notify::session-registered", +- G_CALLBACK (on_session_registered_cb), +- factory, +- 0); ++ g_object_get (display, "session-registered", ®istered, NULL); ++ if (registered) { ++ g_debug ("GdmLocalDisplayFactory: session registered on display, looking for any background displays to kill"); ++ finish_waiting_displays_on_seat (factory, "seat0"); ++ } + #endif + break; + case GDM_DISPLAY_WAITING_TO_FINISH: +diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c +index 3c60c82..dce431e 100644 +--- a/daemon/gdm-manager.c ++++ b/daemon/gdm-manager.c +@@ -747,7 +747,7 @@ find_user_session_for_display (GdmManager *self, + } + + static gboolean +-gdm_manager_handle_register_display (GdmDBusManager *manager, ++gdm_manager_handle_register_session (GdmDBusManager *manager, + GDBusMethodInvocation *invocation, + GVariant *details) + { +@@ -759,15 +759,15 @@ gdm_manager_handle_register_display (GdmDBusManager *manager, + GVariantIter iter; + char *key = NULL; + char *value = NULL; +- char *x11_display_name = NULL; +- char *tty = NULL; +- +- g_debug ("GdmManager: trying to register new display"); ++ g_autofree char *x11_display_name = NULL; ++ g_autofree char *tty = NULL; + + sender = g_dbus_method_invocation_get_sender (invocation); + connection = g_dbus_method_invocation_get_connection (invocation); + get_display_and_details_for_bus_sender (self, connection, sender, &display, NULL, NULL, &tty, NULL, NULL, NULL, NULL); + ++ g_debug ("GdmManager: trying to register new session on display %p", display); ++ + if (display == NULL) { + g_dbus_method_invocation_return_error_literal (invocation, + G_DBUS_ERROR, +@@ -807,38 +807,10 @@ gdm_manager_handle_register_display (GdmDBusManager *manager, + } + } + +- g_object_set (G_OBJECT (display), "status", GDM_DISPLAY_MANAGED, NULL); +- +- gdm_dbus_manager_complete_register_display (GDM_DBUS_MANAGER (manager), +- invocation); +- +- g_clear_pointer (&x11_display_name, g_free); +- g_clear_pointer (&tty, g_free); +- return TRUE; +-} +- +-static gboolean +-gdm_manager_handle_register_session (GdmDBusManager *manager, +- GDBusMethodInvocation *invocation, +- GVariant *details) +-{ +- GdmManager *self = GDM_MANAGER (manager); +- GdmDisplay *display = NULL; +- const char *sender; +- GDBusConnection *connection; +- +- sender = g_dbus_method_invocation_get_sender (invocation); +- connection = g_dbus_method_invocation_get_connection (invocation); +- +- get_display_and_details_for_bus_sender (self, connection, sender, &display, +- NULL, NULL, NULL, NULL, NULL, NULL, NULL); +- +- g_debug ("GdmManager: trying to register new session on display %p", display); +- +- if (display != NULL) +- g_object_set (G_OBJECT (display), "session-registered", TRUE, NULL); +- else +- g_debug ("GdmManager: No display, not registering"); ++ g_object_set (G_OBJECT (display), ++ "status", GDM_DISPLAY_MANAGED, ++ "session-registered", TRUE, ++ NULL); + + gdm_dbus_manager_complete_register_session (GDM_DBUS_MANAGER (manager), + invocation); +@@ -1292,7 +1264,6 @@ gdm_manager_handle_open_reauthentication_channel (GdmDBusManager *manager + static void + manager_interface_init (GdmDBusManagerIface *interface) + { +- interface->handle_register_display = gdm_manager_handle_register_display; + interface->handle_register_session = gdm_manager_handle_register_session; + interface->handle_open_session = gdm_manager_handle_open_session; + interface->handle_open_reauthentication_channel = gdm_manager_handle_open_reauthentication_channel; +diff --git a/daemon/gdm-manager.xml b/daemon/gdm-manager.xml +index 92ef1d0..aba079a 100644 +--- a/daemon/gdm-manager.xml ++++ b/daemon/gdm-manager.xml +@@ -1,9 +1,6 @@ + + + +- +- +- + + + +diff --git a/daemon/gdm-wayland-session.c b/daemon/gdm-wayland-session.c +index d0404d2..d4d1edd 100644 +--- a/daemon/gdm-wayland-session.c ++++ b/daemon/gdm-wayland-session.c +@@ -404,29 +404,6 @@ wait_on_subprocesses (State *state) + } + } + +-static gboolean +-register_display (State *state, +- GCancellable *cancellable) +-{ +- GError *error = NULL; +- gboolean registered = FALSE; +- GVariantBuilder details; +- +- g_variant_builder_init (&details, G_VARIANT_TYPE ("a{ss}")); +- g_variant_builder_add (&details, "{ss}", "session-type", "wayland"); +- +- registered = gdm_dbus_manager_call_register_display_sync (state->display_manager_proxy, +- g_variant_builder_end (&details), +- cancellable, +- &error); +- if (error != NULL) { +- g_debug ("Could not register display: %s", error->message); +- g_error_free (error); +- } +- +- return registered; +-} +- + static void + init_state (State **state) + { +@@ -584,14 +561,6 @@ main (int argc, + if (!connect_to_display_manager (state)) + goto out; + +- ret = register_display (state, state->cancellable); +- +- if (!ret) { +- g_printerr ("Unable to register display with display manager\n"); +- exit_status = EX_SOFTWARE; +- goto out; +- } +- + if (register_session) { + g_debug ("gdm-wayland-session: Will register session in %d seconds", REGISTER_SESSION_TIMEOUT); + state->register_session_id = g_timeout_add_seconds (REGISTER_SESSION_TIMEOUT, +diff --git a/daemon/gdm-x-session.c b/daemon/gdm-x-session.c +index 0b07ab5..36b3975 100644 +--- a/daemon/gdm-x-session.c ++++ b/daemon/gdm-x-session.c +@@ -757,30 +757,6 @@ wait_on_subprocesses (State *state) + } + } + +-static gboolean +-register_display (State *state, +- GCancellable *cancellable) +-{ +- GError *error = NULL; +- gboolean registered = FALSE; +- GVariantBuilder details; +- +- g_variant_builder_init (&details, G_VARIANT_TYPE ("a{ss}")); +- g_variant_builder_add (&details, "{ss}", "session-type", "x11"); +- g_variant_builder_add (&details, "{ss}", "x11-display-name", state->display_name); +- +- registered = gdm_dbus_manager_call_register_display_sync (state->display_manager_proxy, +- g_variant_builder_end (&details), +- cancellable, +- &error); +- if (error != NULL) { +- g_debug ("Could not register display: %s", error->message); +- g_error_free (error); +- } +- +- return registered; +-} +- + static void + init_state (State **state) + { +@@ -953,14 +929,6 @@ main (int argc, + if (!connect_to_display_manager (state)) + goto out; + +- ret = register_display (state, state->cancellable); +- +- if (!ret) { +- g_printerr ("Unable to register display with display manager\n"); +- exit_status = EX_SOFTWARE; +- goto out; +- } +- + ret = spawn_session (state, run_script, state->cancellable); + + if (!ret) { +-- +2.51.0 + diff --git a/gdm.spec b/gdm.spec index 1b4241a..3e2137e 100644 --- a/gdm.spec +++ b/gdm.spec @@ -11,7 +11,7 @@ Name: gdm Epoch: 1 Version: 40.1 -Release: 39%{?dist} +Release: 40%{?dist} Summary: The GNOME Display Manager License: GPLv2+ @@ -70,6 +70,8 @@ Patch140001: 0001-session-Fix-memory-leak-on-new-outside-connection.patch Patch150001: 0001-libgdm-Don-t-collect-twice-sessions-on-usr-share.patch +Patch160001: 0001-Revert-hack-that-quits-plymouth-late.patch + # Non-upstreamable workarounds Patch66610001: 0001-data-reap-gdm-sessions-on-shutdown.patch @@ -373,6 +375,10 @@ dconf update || : %{_libdir}/pkgconfig/gdm-pam-extensions.pc %changelog +* Tue Nov 18 2025 Joan Torres Lopez - 40.1-40 +- Now Plymouth will quit even when no monitor is connected. + Resolves: RHEL-129215 + * Fri Oct 31 2025 Joan Torres Lopez - 40.1-39 - Fix Handle GDM_SUPPORTED_SESSION_TYPES being unset Resolves: RHEL-117034