diff --git a/0001-manager-Keep-register-display-method.patch b/0001-manager-Keep-register-display-method.patch new file mode 100644 index 0000000..735a7d0 --- /dev/null +++ b/0001-manager-Keep-register-display-method.patch @@ -0,0 +1,134 @@ +From 361a0a7d069e7c2bb83f9df8a57fb888ec7826ea Mon Sep 17 00:00:00 2001 +From: rpm-build +Date: Thu, 8 Jan 2026 01:00:00 +0100 +Subject: [PATCH] manager: Keep register display method + +The use of register session combines the old register display and register +session methods. This is the new behaviour. + +To keep ABI compatibility, keep the register display method, which +internally calls register session. + +--- + daemon/gdm-manager.c | 51 +++++++++++++++++++++++++++++++++++++----- + daemon/gdm-manager.xml | 3 +++ + 2 files changed, 48 insertions(+), 6 deletions(-) + +diff --git a/daemon/gdm-manager.c b/daemon/gdm-manager.c +index ff04203..be6daea 100644 +--- a/daemon/gdm-manager.c ++++ b/daemon/gdm-manager.c +@@ -731,6 +731,16 @@ find_user_session_for_display (GdmManager *self, + return NULL; + } + ++static gboolean ++display_is_managed_and_registered (GdmDisplay *display) ++{ ++ gboolean session_registered = FALSE; ++ ++ g_object_get (display, "session-registered", &session_registered, NULL); ++ ++ return gdm_display_get_status (display) == GDM_DISPLAY_MANAGED && session_registered; ++} ++ + static gboolean + gdm_manager_handle_register_session (GdmDBusManager *manager, + GDBusMethodInvocation *invocation, +@@ -738,6 +748,7 @@ gdm_manager_handle_register_session (GdmDBusManager *manager, + { + GdmManager *self = GDM_MANAGER (manager); + const char *sender; ++ const char *method_name; + GDBusConnection *connection; + GdmDisplay *display = NULL; + GdmSession *session; +@@ -746,9 +757,13 @@ gdm_manager_handle_register_session (GdmDBusManager *manager, + char *value = NULL; + g_autofree char *x11_display_name = NULL; + g_autofree char *tty = NULL; ++ gboolean is_register_display; + + sender = g_dbus_method_invocation_get_sender (invocation); + connection = g_dbus_method_invocation_get_connection (invocation); ++ method_name = g_dbus_method_invocation_get_method_name (invocation); ++ is_register_display = g_strcmp0 (method_name, "RegisterDisplay") == 0; ++ + 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); +@@ -762,11 +777,32 @@ gdm_manager_handle_register_session (GdmDBusManager *manager, + return TRUE; + } + ++ if (display_is_managed_and_registered (display)) { ++ g_debug ("GdmManager: display already managed and session-registered"); ++ if (is_register_display) ++ gdm_dbus_manager_complete_register_display (GDM_DBUS_MANAGER (manager), invocation); ++ else ++ gdm_dbus_manager_complete_register_session (GDM_DBUS_MANAGER (manager), invocation); ++ ++ return TRUE; ++ } ++ + g_variant_iter_init (&iter, details); +- while (g_variant_iter_loop (&iter, "{&s&s}", &key, &value)) { +- if (g_strcmp0 (key, "x11-display-name") == 0) { +- x11_display_name = g_strdup (value); +- break; ++ if (is_register_display) { ++ while (g_variant_iter_loop (&iter, "{&s&s}", &key, &value)) { ++ if (g_strcmp0 (key, "x11-display-name") == 0) { ++ x11_display_name = g_strdup (value); ++ break; ++ } ++ } ++ } else { ++ GVariant *variant_value = NULL; ++ while (g_variant_iter_loop (&iter, "{&sv}", &key, &variant_value)) { ++ if (g_strcmp0 (key, "x11-display-name") == 0 && ++ g_variant_is_of_type (variant_value, G_VARIANT_TYPE_STRING)) { ++ x11_display_name = g_variant_dup_string (variant_value, NULL); ++ break; ++ } + } + } + +@@ -797,8 +833,10 @@ gdm_manager_handle_register_session (GdmDBusManager *manager, + "session-registered", TRUE, + NULL); + +- gdm_dbus_manager_complete_register_session (GDM_DBUS_MANAGER (manager), +- invocation); ++ if (is_register_display) ++ gdm_dbus_manager_complete_register_display (GDM_DBUS_MANAGER (manager), invocation); ++ else ++ gdm_dbus_manager_complete_register_session (GDM_DBUS_MANAGER (manager), invocation); + + return TRUE; + } +@@ -1214,6 +1252,7 @@ gdm_manager_handle_open_reauthentication_channel (GdmDBusManager *manager + static void + manager_interface_init (GdmDBusManagerIface *interface) + { ++ interface->handle_register_display = gdm_manager_handle_register_session; + 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 aba079a..92ef1d0 100644 +--- a/daemon/gdm-manager.xml ++++ b/daemon/gdm-manager.xml +@@ -1,6 +1,9 @@ + + + ++ ++ ++ + + + +-- +2.51.1 + diff --git a/gdm.spec b/gdm.spec index d326af1..0302ba6 100644 --- a/gdm.spec +++ b/gdm.spec @@ -48,6 +48,7 @@ Patch: 0001-Introduce-gdm-new-session-tool.patch # RHEL-86140 # https://gitlab.gnome.org/GNOME/gdm/-/merge_requests/285 Patch: 0001-Revert-hack-that-quits-plymouth-late.patch +Patch: 0001-manager-Keep-register-display-method.patch # RHEL-4147 # https://gitlab.gnome.org/GNOME/gdm/-/merge_requests/335