From ee26bb5bd979ca5eec8fa68bde38b00ba5bc4271 Mon Sep 17 00:00:00 2001 From: AlmaLinux RelEng Bot Date: Mon, 30 Mar 2026 10:29:37 -0400 Subject: [PATCH] import CS gnome-shell-40.10-33.el9 --- ...1-Support-conflicting-session-dialog.patch | 69 +++++++--- ...ct-disable-show-password-key-with-pa.patch | 118 ++++++++++++++++++ ...Register-session-with-GDM-on-startup.patch | 46 +++++++ ...cker-Track-windows-when-finding-app-.patch | 85 +++++++++++++ SPECS/gnome-shell.spec | 26 +++- 5 files changed, 324 insertions(+), 20 deletions(-) create mode 100644 SOURCES/0001-authPrompt-Connect-disable-show-password-key-with-pa.patch create mode 100644 SOURCES/0001-main-Register-session-with-GDM-on-startup.patch create mode 100644 SOURCES/0001-shell-window-tracker-Track-windows-when-finding-app-.patch diff --git a/SOURCES/0001-Support-conflicting-session-dialog.patch b/SOURCES/0001-Support-conflicting-session-dialog.patch index f942064..2bc392a 100644 --- a/SOURCES/0001-Support-conflicting-session-dialog.patch +++ b/SOURCES/0001-Support-conflicting-session-dialog.patch @@ -197,25 +197,44 @@ closed on its side, the new session will start. Part-of: --- - js/gdm/loginDialog.js | 77 ++++++++++++++++++++++++++++++++++++++++--- - 1 file changed, 73 insertions(+), 4 deletions(-) + .../org.freedesktop.login1.Session.xml | 1 + + js/gdm/loginDialog.js | 95 ++++++++++++++++++- + 2 files changed, 92 insertions(+), 4 deletions(-) +diff --git a/data/dbus-interfaces/org.freedesktop.login1.Session.xml b/data/dbus-interfaces/org.freedesktop.login1.Session.xml +index ecab4bb..16dee1c 100644 +--- a/data/dbus-interfaces/org.freedesktop.login1.Session.xml ++++ b/data/dbus-interfaces/org.freedesktop.login1.Session.xml +@@ -6,6 +6,7 @@ + + + ++ + + + diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js -index 674ff24a5..25b86880d 100644 +index 6cf8133..e3dac97 100644 --- a/js/gdm/loginDialog.js +++ b/js/gdm/loginDialog.js -@@ -914,8 +914,8 @@ var LoginDialog = GObject.registerClass({ +@@ -916,8 +916,14 @@ var LoginDialog = GObject.registerClass({ this._defaultSessionChangedId = this._greeter.connect('default-session-name-changed', this._onDefaultSessionChanged.bind(this)); - this._sessionOpenedId = this._greeter.connect('session-opened', - this._onSessionOpened.bind(this)); -+ this._sessionOpenedId = this._greeter.connect('session-opened-with-session-id', -+ this._onSessionOpenedWithSessionId.bind(this)); ++ // Connect to the new signal if available, otherwise fall back to the old signal ++ let signalId = GObject.signal_lookup('session-opened-with-session-id', this._greeter.constructor.$gtype); ++ if (signalId !== 0) ++ this._sessionOpenedId = this._greeter.connect('session-opened-with-session-id', ++ this._onSessionOpenedWithSessionId.bind(this)); ++ else ++ this._sessionOpenedId = this._greeter.connect('session-opened', ++ this._onSessionOpened.bind(this)); this._timedLoginRequestedId = this._greeter.connect('timed-login-requested', this._onTimedLoginRequested.bind(this)); } -@@ -1053,6 +1053,28 @@ var LoginDialog = GObject.registerClass({ +@@ -1055,6 +1061,28 @@ var LoginDialog = GObject.registerClass({ }); } @@ -244,7 +263,7 @@ index 674ff24a5..25b86880d 100644 _startSession(serviceName) { this._bindOpacity(); this.ease({ -@@ -1066,8 +1088,55 @@ var LoginDialog = GObject.registerClass({ +@@ -1068,8 +1096,67 @@ var LoginDialog = GObject.registerClass({ }); } @@ -261,24 +280,27 @@ index 674ff24a5..25b86880d 100644 + + async _findConflictingSession(startingSessionId) { + const loginManager = LoginManager.getLoginManager(); -+ const sessions = await this._listSessions(); -+ const [, , startingSessionOwner, ,] = sessions.find(([id, , , ,]) => id === startingSessionId); -+ for (const session of sessions.map(([id, , user, , path]) => ({id, user, path}))) { -+ if (startingSessionId === session.id) ++ let sessions = await this._listSessions(); ++ sessions = sessions.map(([, , , , path]) => loginManager.getSession(path)); ++ const startingSession = sessions.find(s => s.Id === startingSessionId); ++ for (const session of sessions) { ++ if (startingSession.Id === session.Id) + continue; + -+ if (startingSessionOwner !== session.user) ++ if (startingSession.User[0] !== session.User[0]) // this is the uid + continue; + -+ const sessionProxy = loginManager.getSession(session.path); -+ -+ if (sessionProxy.Type !== 'wayland' && sessionProxy.Type !== 'x11') ++ if (startingSession.Type === 'x11' && session.Type === 'x11' && ++ startingSession.Remote && session.Remote) + continue; + -+ if (sessionProxy.State !== 'active' && sessionProxy.State !== 'online') ++ if (session.Type !== 'wayland' && session.Type !== 'x11') + continue; + -+ return sessionProxy; ++ if (session.State !== 'active' && session.State !== 'online') ++ continue; ++ ++ return session; + } + + return null; @@ -298,12 +320,21 @@ index 674ff24a5..25b86880d 100644 + } catch (error) { + logError(error, `Failed to start session '${sessionId}'`); + this._authPrompt.reset(); ++ } ++ } ++ ++ async _onSessionOpened(client, serviceName, sessionId) { ++ try { ++ this._authPrompt.finish(() => this._startSession(serviceName)); ++ } catch (error) { ++ logError(error, `Failed to start session '${sessionId}'`); ++ this._authPrompt.reset(); + } } _waitForItemForUser(userName) { -- -2.49.0 +2.51.0 From b5dc399c0cdbecad7bd91bbae2287154e934981a Mon Sep 17 00:00:00 2001 diff --git a/SOURCES/0001-authPrompt-Connect-disable-show-password-key-with-pa.patch b/SOURCES/0001-authPrompt-Connect-disable-show-password-key-with-pa.patch new file mode 100644 index 0000000..c09c88b --- /dev/null +++ b/SOURCES/0001-authPrompt-Connect-disable-show-password-key-with-pa.patch @@ -0,0 +1,118 @@ +From 1db8edbaf877a9ba8b972bd64871767866b3c9af Mon Sep 17 00:00:00 2001 +From: Joan Torres Lopez +Date: Wed, 22 Oct 2025 13:32:15 +0200 +Subject: [PATCH 1/2] authPrompt: Connect disable-show-password key with + password entry + +--- + js/gdm/authPrompt.js | 15 ++++++++++++++- + 1 file changed, 14 insertions(+), 1 deletion(-) + +diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js +index e961f39..b6a323f 100644 +--- a/js/gdm/authPrompt.js ++++ b/js/gdm/authPrompt.js +@@ -1,7 +1,7 @@ + // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + /* exported AuthPrompt */ + +-const { Clutter, GLib, GObject, Meta, Pango, Shell, St } = imports.gi; ++const { Clutter, Gio, GLib, GObject, Meta, Pango, Shell, St } = imports.gi; + + const Animation = imports.ui.animation; + const AuthList = imports.gdm.authList; +@@ -20,6 +20,9 @@ var DEFAULT_BUTTON_WELL_ANIMATION_TIME = 300; + + var MESSAGE_FADE_OUT_ANIMATION_TIME = 500; + ++const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown'; ++const DISABLE_SHOW_PASSWORD_KEY = 'disable-show-password'; ++ + var AuthPromptMode = { + UNLOCK_ONLY: 0, + UNLOCK_OR_LOG_IN: 1, +@@ -198,6 +201,11 @@ var AuthPrompt = GObject.registerClass({ + this._mainBox.add_child(this._entry); + this._entry.grab_key_focus(); + ++ this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA }); ++ this._lockdownSettings.connect(`changed::${DISABLE_SHOW_PASSWORD_KEY}`, ++ this._updateShowPasswordIcon.bind(this)); ++ this._updateShowPasswordIcon(); ++ + this._timedLoginIndicator = new St.Bin({ + style_class: 'login-dialog-timed-login-indicator', + scale_x: 0, +@@ -233,6 +241,13 @@ var AuthPrompt = GObject.registerClass({ + this._defaultButtonWell.add_child(this._spinner); + } + ++ _updateShowPasswordIcon() { ++ try { ++ const disableShowPassword = this._lockdownSettings.get_boolean(DISABLE_SHOW_PASSWORD_KEY); ++ this._passwordEntry.set_show_peek_icon(!disableShowPassword); ++ } catch (e) {} ++ } ++ + showTimedLoginIndicator(time) { + let hold = new Batch.Hold(); + +-- +2.51.0 + + +From e308153f0d3cef060d38ffba0d781c4a53c6921a Mon Sep 17 00:00:00 2001 +From: Joan Torres Lopez +Date: Wed, 22 Oct 2025 13:42:01 +0200 +Subject: [PATCH 2/2] unlockDialog: Do not reset the auth prompt on every tap + +Currently we have a tap event tracker that causes that every time a tap +happens in the lock screen, we reset the auth prompt and this can be +particularly annoying at least in three cases: + 1. Just clicking everywhere in the screen may lead the unlock entry + content to be cleared + 2. Clicking in the screen while an authentication is in progress, + cancels it + 3. This may break a multi-factor authentication method, as a single + click may lead previous steps to be cancelled + +So, while resetting the auth prompt is important when we're about to +show it, it's not something we want to do while an authentication has +started. + +As per this also do not touch the auth prompt sensitivity unless we're +in an idle phase, or we may end up overriding the auth prompt state, +leading for example to a text entry being editable while we're verifying +the secret + +Fixes: 37e55df29865dac13656116efdd7abec8056dea9 +Part-of: +--- + js/ui/unlockDialog.js | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +diff --git a/js/ui/unlockDialog.js b/js/ui/unlockDialog.js +index 00e3eef..169043b 100644 +--- a/js/ui/unlockDialog.js ++++ b/js/ui/unlockDialog.js +@@ -698,8 +698,15 @@ var UnlockDialog = GObject.registerClass({ + this._promptBox.add_child(this._authPrompt); + } + +- this._authPrompt.reset(); +- this._authPrompt.updateSensitivity(true); ++ const {verificationStatus} = this._authPrompt; ++ switch (verificationStatus) { ++ case AuthPrompt.AuthPromptStatus.NOT_VERIFYING: ++ case AuthPrompt.AuthPromptStatus.VERIFICATION_CANCELLED: ++ case AuthPrompt.AuthPromptStatus.VERIFICATION_FAILED: ++ this._authPrompt.reset(); ++ this._authPrompt.updateSensitivity( ++ verificationStatus === AuthPrompt.AuthPromptStatus.NOT_VERIFYING); ++ } + } + + _maybeDestroyAuthPrompt() { +-- +2.51.0 + diff --git a/SOURCES/0001-main-Register-session-with-GDM-on-startup.patch b/SOURCES/0001-main-Register-session-with-GDM-on-startup.patch new file mode 100644 index 0000000..082379e --- /dev/null +++ b/SOURCES/0001-main-Register-session-with-GDM-on-startup.patch @@ -0,0 +1,46 @@ +From 32a013304f8c507cb72a5419c7f4b7c553253520 Mon Sep 17 00:00:00 2001 +From: Adrian Vovk +Date: Thu, 1 May 2025 18:34:52 -0400 +Subject: [PATCH] main: Register session with GDM on startup + +When no monitor is connected, gnome-shell starts but never emits +`startup-prepared` nor `startup-complete`. As a result, GDM never +detects that the shell has launched and plymouthd remains running, +preventing the system from reaching graphical.target. + +Ensure that registerSessionWithGDM() is called even when no monitor +is connected, so GDM can terminate plymouthd and allow the system to +reach graphical.target properly. + +Part of https://gitlab.gnome.org/GNOME/gdm/-/merge_requests/285 + +Part-of: +--- + js/ui/main.js | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/js/ui/main.js b/js/ui/main.js +index 7cfbba3..c753ab6 100644 +--- a/js/ui/main.js ++++ b/js/ui/main.js +@@ -274,6 +274,8 @@ function _initializeUI() { + extensionManager = new ExtensionSystem.ExtensionManager(); + extensionManager.init(); + ++ LoginManager.registerSessionWithGDM(); ++ + if (sessionMode.isGreeter && screenShield) { + layoutManager.connect('startup-prepared', () => { + screenShield.showDialog(); +@@ -307,8 +309,6 @@ function _initializeUI() { + sessionMode.currentMode !== 'initial-setup') + _handleLockScreenWarning(); + +- LoginManager.registerSessionWithGDM(); +- + let perfModuleName = GLib.getenv("SHELL_PERF_MODULE"); + if (perfModuleName) { + let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT"); +-- +2.51.0 + diff --git a/SOURCES/0001-shell-window-tracker-Track-windows-when-finding-app-.patch b/SOURCES/0001-shell-window-tracker-Track-windows-when-finding-app-.patch new file mode 100644 index 0000000..7f9da0a --- /dev/null +++ b/SOURCES/0001-shell-window-tracker-Track-windows-when-finding-app-.patch @@ -0,0 +1,85 @@ +From 8f6fe1b2290c112e2b4b75812e67ea82bdf7660d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jonas=20=C3=85dahl?= +Date: Thu, 27 Nov 2025 14:28:16 +0100 +Subject: [PATCH] shell/window-tracker: Track windows when finding app info + already + +We'd get the Shell.App from the window, in order to get the app info for +find-app-info signal, but that had the side effect of creating and +starting the Shell.App instance, without tracking the window. + +Fix this by simply fully tracking the window already at this stage. +--- + src/shell-window-tracker.c | 20 ++++++++++++++------ + 1 file changed, 14 insertions(+), 6 deletions(-) + +diff --git a/src/shell-window-tracker.c b/src/shell-window-tracker.c +index 2f2bd10eed..3d7c6bb2de 100644 +--- a/src/shell-window-tracker.c ++++ b/src/shell-window-tracker.c +@@ -65,7 +65,7 @@ static void set_focus_app (ShellWindowTracker *tracker, + ShellApp *new_focus_app); + static void on_focus_window_changed (MetaDisplay *display, GParamSpec *spec, ShellWindowTracker *tracker); + +-static void track_window (ShellWindowTracker *tracker, MetaWindow *window); ++static ShellApp * track_window (ShellWindowTracker *tracker, MetaWindow *window); + static void disassociate_window (ShellWindowTracker *tracker, MetaWindow *window); + + static ShellApp * shell_startup_sequence_get_app (MetaStartupSequence *sequence); +@@ -543,7 +543,7 @@ on_window_unmanaged (MetaWindow *window, + disassociate_window (SHELL_WINDOW_TRACKER (user_data), window); + } + +-static void ++static ShellApp * + track_window (ShellWindowTracker *self, + MetaWindow *window) + { +@@ -551,7 +551,7 @@ track_window (ShellWindowTracker *self, + + app = get_app_for_window (self, window); + if (!app) +- return; ++ return NULL; + + /* At this point we've stored the association from window -> application */ + g_hash_table_insert (self->window_to_app, window, app); +@@ -564,6 +564,8 @@ track_window (ShellWindowTracker *self, + _shell_app_add_window (app, window); + + g_signal_emit (self, signals[TRACKED_WINDOWS_CHANGED], 0); ++ ++ return app; + } + + static void +@@ -582,7 +584,10 @@ shell_window_tracker_on_window_added (MetaWorkspace *workspace, + MetaWindow *window, + gpointer user_data) + { +- track_window (SHELL_WINDOW_TRACKER (user_data), window); ++ ShellWindowTracker *self = user_data; ++ ++ if (!g_hash_table_contains (self->window_to_app, window)) ++ track_window (self, window); + } + + static void +@@ -656,9 +661,12 @@ on_find_app_info (MetaDisplay *display, + MetaWindow *window, + ShellWindowTracker *tracker) + { +- g_autoptr (ShellApp) app = NULL; ++ ShellApp *app; ++ ++ app = g_hash_table_lookup (tracker->window_to_app, window); ++ if (!app) ++ app = track_window (tracker, window); + +- app = get_app_for_window (tracker, window); + if (!app) + return NULL; + +-- +2.47.3 + diff --git a/SPECS/gnome-shell.spec b/SPECS/gnome-shell.spec index 771a02a..0ec1f82 100644 --- a/SPECS/gnome-shell.spec +++ b/SPECS/gnome-shell.spec @@ -8,7 +8,7 @@ Name: gnome-shell Version: 40.10 -Release: 28%{?dist} +Release: 33%{?dist} Summary: Window management and application launching for GNOME License: GPLv2+ @@ -36,6 +36,8 @@ Patch17: fix-resetting-auth-prompt.patch Patch18: 0001-authPrompt-Disregard-smartcard-status-changes-events.patch Patch19: 0001-loginDialog-Show-session-menu-button-when-in-IN_PROG.patch Patch20: 0001-systemActions-Optionally-allow-restart-shutdown-on-l.patch +Patch21: 0001-authPrompt-Connect-disable-show-password-key-with-pa.patch +Patch22: 0001-main-Register-session-with-GDM-on-startup.patch # Misc. Patch30: 0001-panel-add-an-icon-to-the-ActivitiesButton.patch @@ -75,6 +77,7 @@ Patch63: 0001-shell-window-tracker-Help-mutter-finding-app-info-s-.patch Patch64: 0001-dnd-Don-t-leak-a-signal-connection.patch Patch65: 0001-st-theme-Reuse-stylesheets-if-possible.patch Patch66: 0001-Support-conflicting-session-dialog.patch +Patch67: 0001-shell-window-tracker-Track-windows-when-finding-app-.patch %define eds_version 3.33.1 %define gnome_desktop_version 3.35.91 @@ -304,6 +307,27 @@ desktop-file-validate %{buildroot}%{_datadir}/applications/evolution-calendar.de %endif %changelog +* Tue Nov 18 2025 Joan Torres Lopez - 40.10-33 +- Register session with GDM on startup + Resolves: RHEL-129287 + +* Thu Nov 27 2025 Jonas Ã…dahl - 40.10-32 +- Avoid broken app instances with remote clients + Resolves: RHEL-68825 + +* Wed Oct 22 2025 Joan Torres - 40.10-31 +- Don't fail if disable-show-password doesn't exist + Related: RHEL-109190 + +* Thu Oct 2 2025 Joan Torres - 40.10-30 +- Fix regression on multiple remote sessions and same user + Also, add missing fix to keep API/ABI compatibility on GDM greeter proxy. + Resolves: RHEL-109190 + +* Tue Oct 21 2025 Joan Torres - 40.10-29 +- Allow disabling showing password on login/unlock screens + Resolves: RHEL-123139 + * Wed Jul 16 2025 Joan Torres - 40.10-28 - Allow restart/shutdown on lock screen Resolves: RHEL-103984