Improve plymouth handling

Now plymouth will quit even when monitor is not connected.

Resolves: https://issues.redhat.com/browse/RHEL-129215
This commit is contained in:
Joan Torres Lopez 2025-11-14 16:33:33 +01:00
parent 0e0667bec8
commit b77f0f7a16
2 changed files with 374 additions and 1 deletions

View File

@ -0,0 +1,367 @@
From 8a91856f4020657adcbba67482daa6db373e8ed6 Mon Sep 17 00:00:00 2001
From: Adrian Vovk <adrianvovk@gmail.com>
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: <https://gitlab.gnome.org/GNOME/gdm/-/merge_requests/285>
---
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 <adrianvovk@gmail.com>
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: <https://gitlab.gnome.org/GNOME/gdm/-/merge_requests/285>
---
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", &registered, 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", &registered, 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 @@
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node name="/org/gnome/DisplayManager/Manager">
<interface name="org.gnome.DisplayManager.Manager">
- <method name="RegisterDisplay">
- <arg name="details" direction="in" type="a{ss}"/>
- </method>
<method name="RegisterSession">
<arg name="details" direction="in" type="a{sv}"/>
</method>
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

View File

@ -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 <joantolo@redhat.com> - 40.1-40
- Now Plymouth will quit even when no monitor is connected.
Resolves: RHEL-129215
* Fri Oct 31 2025 Joan Torres Lopez <joantolo@redhat.com> - 40.1-39
- Fix Handle GDM_SUPPORTED_SESSION_TYPES being unset
Resolves: RHEL-117034