135 lines
5.8 KiB
Diff
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
|
|
|