Keep register display method

Fixes abidiff error from last commit where GDM manager doesn't have
RegisterDisplay method. Keeps ABI compatibility.

Related: https://issues.redhat.com/browse/RHEL-86140
This commit is contained in:
Joan Torres Lopez 2026-01-08 12:43:46 +01:00
parent be9e87f983
commit d3830ea866
2 changed files with 135 additions and 0 deletions

View File

@ -0,0 +1,134 @@
From 361a0a7d069e7c2bb83f9df8a57fb888ec7826ea Mon Sep 17 00:00:00 2001
From: rpm-build <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 @@
<!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>
--
2.51.1

View File

@ -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