gdm/0001-manager-Keep-register-display-method.patch
2026-05-19 15:07:41 -04:00

135 lines
5.8 KiB
Diff

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