Compare commits

...

No commits in common. "c8" and "c8-beta" have entirely different histories.
c8 ... c8-beta

6 changed files with 133 additions and 1075 deletions

View File

@ -1,270 +0,0 @@
From 1b3edde30bac1bb4944b56e59cbc7f1412a90a3d Mon Sep 17 00:00:00 2001
From: Joan Torres Lopez <joantolo@redhat.com>
Date: Wed, 17 Jun 2026 09:54:57 +0200
Subject: [PATCH 1/5] loginDialog: Don't reconnect on each reset with gdmClient
When resetting the greeter proxy, it's destroyed and then recreated
again.
This destroy/recreate thing doesn't give any info to GDM and the greeter
interface destroyed has the same state as the newly created one.
Each time get_greeter_sync is called when greeter is destroyed makes GDM
create a new connection which stores in a list. This means that for each
reset a new unnecessary connection is created and stored.
GDM was leaking some objects which combined with this excessive connection
creation was causing a fd leak on each reset.
To make better use of resources and avoid problems, use ensure instead
of reset greeter proxy.
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3749>
---
js/gdm/loginDialog.js | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js
index eb6846d..c5e8853 100644
--- a/js/gdm/loginDialog.js
+++ b/js/gdm/loginDialog.js
@@ -815,11 +815,11 @@ var LoginDialog = GObject.registerClass({
this._showPrompt();
}
- _resetGreeterProxy() {
+ _ensureGreeterProxy() {
if (GLib.getenv('GDM_GREETER_TEST') != '1') {
- if (this._greeter) {
- this._greeter.run_dispose();
- }
+ if (this._greeter)
+ return;
+
this._greeter = this._gdmClient.get_greeter_sync(null);
this._defaultSessionChangedId = this._greeter.connect('default-session-name-changed',
@@ -832,7 +832,7 @@ var LoginDialog = GObject.registerClass({
}
_onReset(authPrompt, beginRequest) {
- this._resetGreeterProxy();
+ this._ensureGreeterProxy();
this._sessionMenuButton.updateSensitivity(true);
this._user = null;
--
2.54.0
From fb0f4366393fef39e13a2b233c57900db6661198 Mon Sep 17 00:00:00 2001
From: Joan Torres Lopez <joantolo@redhat.com>
Date: Wed, 17 Jun 2026 09:56:25 +0200
Subject: [PATCH 2/5] gdm/loginDialog: Reset the greeter proxy on connection
closed
If gdm fails to start the display session the greeter proxy we are using
gets disconnected, however since commit 56ea95f2 we are now preserving
the greeter instance, and this will eventually lead to using an instance
of a disconnected proxy.
This eventually implies that after a login failure, we would never get
the `::session-opened` signal that actually triggers the session start.
And thus, even the user has properly authenticated, gdm will stick to
the authentication page.
So, instead of reverting such commit (that isn't wrong per se), consume
the greeter proxy connection `::closed` signal and use it to
re-initialize the greeter instance.
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3885>
---
js/gdm/loginDialog.js | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js
index c5e8853..613b97e 100644
--- a/js/gdm/loginDialog.js
+++ b/js/gdm/loginDialog.js
@@ -822,6 +822,14 @@ var LoginDialog = GObject.registerClass({
this._greeter = this._gdmClient.get_greeter_sync(null);
+ this._greeterConnectionClosedId =
+ this._greeter.get_connection().connect('closed', conn => {
+ conn.disconnect(this._greeterConnectionClosedId);
+ this._greeterConnectionClosedId = 0;
+ this._greeter = null;
+ this._ensureGreeterProxy();
+ });
+
this._defaultSessionChangedId = this._greeter.connect('default-session-name-changed',
this._onDefaultSessionChanged.bind(this));
this._sessionOpenedId = this._greeter.connect('session-opened',
@@ -1191,6 +1199,10 @@ var LoginDialog = GObject.registerClass({
this._settings = null;
}
if (this._greeter) {
+ if (this._greeterConnectionClosedId) {
+ this._greeter.get_connection().disconnect(this._greeterConnectionClosedId);
+ this._greeterConnectionClosedId = 0;
+ }
this._greeter.disconnect(this._defaultSessionChangedId);
this._greeter.disconnect(this._sessionOpenedId);
this._greeter.disconnect(this._timedLoginRequestedId);
--
2.54.0
From be05549008e57ac8f73211abf43e183eeb661292 Mon Sep 17 00:00:00 2001
From: Joan Torres Lopez <joantolo@redhat.com>
Date: Wed, 17 Jun 2026 10:03:00 +0200
Subject: [PATCH 3/5] gdm/util: Clear the request if user verifier connection
is closed
Similarly to previous commit, in case the user verifier connection is
closed we should just clear the user verifier instance, since starting
from this point is going to be just invalid.
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3885>
---
js/gdm/util.js | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/js/gdm/util.js b/js/gdm/util.js
index 9e24913..5a5df21 100644
--- a/js/gdm/util.js
+++ b/js/gdm/util.js
@@ -190,6 +190,10 @@ var ShellUserVerifier = class {
_clearUserVerifier() {
if (this._userVerifier) {
+ if (this._userVerifierConnectionClosedId) {
+ this._userVerifier.get_connection().disconnect(this._userVerifierConnectionClosedId);
+ this._userVerifierConnectionClosedId = 0;
+ }
this._userVerifier.run_dispose();
this._userVerifier = null;
if (this._userVerifierChoiceList) {
@@ -370,6 +374,9 @@ var ShellUserVerifier = class {
return;
}
+ this._userVerifierConnectionClosedId =
+ this._userVerifier.get_connection().connect('closed', () => this.clear());
+
if (client.get_user_verifier_choice_list)
this._userVerifierChoiceList = client.get_user_verifier_choice_list();
else
@@ -392,6 +399,9 @@ var ShellUserVerifier = class {
return;
}
+ this._userVerifierConnectionClosedId =
+ this._userVerifier.get_connection().connect('closed', () => this.clear());
+
if (client.get_user_verifier_choice_list)
this._userVerifierChoiceList = client.get_user_verifier_choice_list();
else
--
2.54.0
From 87cef60e36c5ca402364f5cc99fb6ce834cf4827 Mon Sep 17 00:00:00 2001
From: Joan Torres Lopez <joantolo@redhat.com>
Date: Wed, 17 Jun 2026 10:06:32 +0200
Subject: [PATCH 4/5] gdm/util: Do not run dispose on user verifier
This is not a good habit anywhere and especially in JS code, I assume
the rationale for this was to ensure that cached instances of the proxy
were cleared, but this did not work properly (as it happened on
finalize), and it would still require [1].
So let's just avoid this and assume that the getters just return what we
expect.
[1] https://gitlab.gnome.org/GNOME/gdm/-/merge_requests/321
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3885>
---
js/gdm/util.js | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/js/gdm/util.js b/js/gdm/util.js
index 5a5df21..58b5946 100644
--- a/js/gdm/util.js
+++ b/js/gdm/util.js
@@ -194,12 +194,8 @@ var ShellUserVerifier = class {
this._userVerifier.get_connection().disconnect(this._userVerifierConnectionClosedId);
this._userVerifierConnectionClosedId = 0;
}
- this._userVerifier.run_dispose();
this._userVerifier = null;
- if (this._userVerifierChoiceList) {
- this._userVerifierChoiceList.run_dispose();
- this._userVerifierChoiceList = null;
- }
+ this._userVerifierChoiceList = null;
}
}
--
2.54.0
From 6b1fe48ea3b4dedae9344941e97f48a9a046c0a7 Mon Sep 17 00:00:00 2001
From: Joan Torres Lopez <joantolo@redhat.com>
Date: Wed, 17 Jun 2026 17:32:52 +0200
Subject: [PATCH 5/5] gdm: Clear user verifier before starting new async operations
in begin()
Move _clearUserVerifier() from the finish callbacks
(_reauthenticationChannelOpened, _userVerifierGot) to the start of
begin().
When a reauthentication retry happens, begin() creates a new
cancellable and starts an async open_reauthentication_channel call.
If the previous user verifier's connection 'closed' handler is still
active, it can fire during the async operation and call this.clear(),
which cancels the new cancellable. This causes the retry to fail with
G_IO_ERROR_CANCELLED.
By clearing the user verifier at the start of begin(), the old
connection's 'closed' handler is disconnected before the new
cancellable is created, eliminating the window where closing the old
connection can cancel the new operation.
---
js/gdm/util.js | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/js/gdm/util.js b/js/gdm/util.js
index 58b5946..c86e638 100644
--- a/js/gdm/util.js
+++ b/js/gdm/util.js
@@ -161,6 +161,7 @@ var ShellUserVerifier = class {
}
begin(userName, hold) {
+ this._clearUserVerifier();
this._cancellable = new Gio.Cancellable();
this._hold = hold;
this._userName = userName;
@@ -351,7 +352,6 @@ var ShellUserVerifier = class {
_reauthenticationChannelOpened(client, result) {
try {
- this._clearUserVerifier();
this._userVerifier = client.open_reauthentication_channel_finish(result);
} catch(e) {
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
@@ -386,7 +386,6 @@ var ShellUserVerifier = class {
_userVerifierGot(client, result) {
try {
- this._clearUserVerifier();
this._userVerifier = client.get_user_verifier_finish(result);
} catch(e) {
if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
--
2.54.0

View File

@ -1,115 +0,0 @@
From 7909d2f989e937e9300933a718e1721bf7346d9d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
Date: Wed, 29 Jan 2025 02:46:44 +0100
Subject: [PATCH] st/theme: Reuse stylesheets if possible
The following happens when processing an `@import()` rule:
1. `_st_theme_resolve_url()` to resolve file
2. `insert_stylesheet()` to track file/sheet
a. take ownership of file/sheet (ref)
b. use file as key in `stylesheets_by_file` hash table
c. use file as value in `files_by_stylesheet` hash table
3. release reference to file
This leads to a refcount error when importing a file that
was already parsed before:
1. file start with refcount 1
2. `insert_stylesheet()`
a. increases refcount to 2
b. inserting into `stylesheets_by_file` *decreases* the
passed-in key if the key already exists
c. `files_by_stylesheet` now tracks a file with recount 1
3. releases the last reference to file
The file object tracked in `files_by_stylesheet` is now invalid,
and accessing it results in a crash.
Avoid this issue by reusing existing stylesheets, so we don't insert
a stylesheet that's already tracked.
As a side-effect, this also saves us from re-parsing the same file
unnecessarily.
Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/7306
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3619>
---
src/st/st-theme.c | 32 ++++++++++++++++++++++++++------
1 file changed, 26 insertions(+), 6 deletions(-)
diff --git a/src/st/st-theme.c b/src/st/st-theme.c
index b567f7e5e3..3ecaf5ed1b 100644
--- a/src/st/st-theme.c
+++ b/src/st/st-theme.c
@@ -249,6 +249,27 @@ insert_stylesheet (StTheme *theme,
g_hash_table_insert (theme->files_by_stylesheet, stylesheet, file);
}
+static CRStyleSheet *
+resolve_stylesheet (StTheme *theme,
+ GFile *file,
+ GError **error)
+{
+ CRStyleSheet *sheet;
+
+ sheet = g_hash_table_lookup (theme->stylesheets_by_file, file);
+ if (sheet)
+ {
+ cr_stylesheet_ref (sheet);
+ return sheet;
+ }
+
+ sheet = parse_stylesheet (file, error);
+ if (sheet)
+ insert_stylesheet (theme, file, sheet);
+
+ return sheet;
+}
+
gboolean
st_theme_load_stylesheet (StTheme *theme,
GFile *file,
@@ -256,13 +277,12 @@ st_theme_load_stylesheet (StTheme *theme,
{
CRStyleSheet *stylesheet;
- stylesheet = parse_stylesheet (file, error);
+ stylesheet = resolve_stylesheet (theme, file, error);
if (!stylesheet)
return FALSE;
stylesheet->app_data = GUINT_TO_POINTER (TRUE);
- insert_stylesheet (theme, file, stylesheet);
cr_stylesheet_ref (stylesheet);
theme->custom_stylesheets = g_slist_prepend (theme->custom_stylesheets, stylesheet);
g_signal_emit (theme, signals[STYLESHEETS_CHANGED], 0);
@@ -873,6 +893,7 @@ add_matched_properties (StTheme *a_this,
if (import_rule->sheet == NULL)
{
+ CRStyleSheet *sheet = NULL;
GFile *file = NULL;
if (import_rule->url->stryng && import_rule->url->stryng->str)
@@ -880,13 +901,12 @@ add_matched_properties (StTheme *a_this,
file = _st_theme_resolve_url (a_this,
a_nodesheet,
import_rule->url->stryng->str);
- import_rule->sheet = parse_stylesheet (file, NULL);
+ sheet = resolve_stylesheet (a_this, file, NULL);
}
- if (import_rule->sheet)
+ if (sheet)
{
- insert_stylesheet (a_this, file, import_rule->sheet);
- /* refcount of stylesheets starts off at zero, so we don't need to unref! */
+ import_rule->sheet = sheet;
}
else
{
--
2.49.0

View File

@ -1,65 +0,0 @@
From d45377eaf231ac7ffa10a453c984381f5987f8ef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
Date: Tue, 28 Jul 2020 17:50:58 +0200
Subject: [PATCH 1/2] popupMenu: Ungrab when removing active menu
While we do have some handling for removing the active menu, it has
been a no-op for years. The bit that we really care about from the
PopupMenuManager's point of view is the existing grab though. Drop
that instead of calling _closeMenu() directly; ungrabbing will still
call the method indirectly, and it will still be a no-op :-)
https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3022
---
js/ui/popupMenu.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/js/ui/popupMenu.js b/js/ui/popupMenu.js
index d30c15788c..f62ea9db5d 100644
--- a/js/ui/popupMenu.js
+++ b/js/ui/popupMenu.js
@@ -1217,7 +1217,7 @@ var PopupMenuManager = class {
removeMenu(menu) {
if (menu == this.activeMenu)
- this._closeMenu(false, menu);
+ this._grabHelper.ungrab({ actor: menu.actor });
let position = this._findMenu(menu);
if (position == -1) // not a menu we manage
--
2.53.0
From a9e97a09d0fdeab7de434710440e041fa51ea386 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
Date: Tue, 28 Jul 2020 18:52:53 +0200
Subject: [PATCH 2/2] panelMenu: Destroy menu before chaining up
This avoid some (harmless but annoying) warnings, and is closer to
the original code prior to commit fc342fe8c5 and 557b232c896.
https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/3022
---
js/ui/panelMenu.js | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/js/ui/panelMenu.js b/js/ui/panelMenu.js
index bafafc11e6..eba1c7a1b0 100644
--- a/js/ui/panelMenu.js
+++ b/js/ui/panelMenu.js
@@ -186,10 +186,9 @@ var Button = GObject.registerClass({
}
_onDestroy() {
- super._onDestroy();
-
if (this.menu)
this.menu.destroy();
+ super._onDestroy();
}
});
--
2.53.0

View File

@ -0,0 +1,47 @@
diff --git a/js/portalHelper/main.js b/js/portalHelper/main.js
index e163d6574..c61f3b381 100644
--- a/js/portalHelper/main.js
+++ b/js/portalHelper/main.js
@@ -1,6 +1,13 @@
const Format = imports.format;
const Gettext = imports.gettext;
-const { Gio, GLib, GObject, Gtk, Pango, Soup, WebKit2: WebKit } = imports.gi;
+const { Gio, GLib, GObject, Gtk, Pango, Soup } = imports.gi;
+
+let WebKit;
+try {
+ WebKit = imports.gi.WebKit2;
+} catch {
+ WebKit = null;
+}
const _ = Gettext.gettext;
@@ -340,6 +346,11 @@ function initEnvironment() {
function main(argv) {
initEnvironment();
+ if (!WebKit) {
+ log('WebKit2 typelib is not installed, captive portal helper will be disabled');
+ return 1;
+ }
+
if (!WebKit.WebContext.new_ephemeral) {
log('WebKitGTK 2.16 is required for the portal-helper, see https://bugzilla.gnome.org/show_bug.cgi?id=780453');
return 1;
diff --git a/js/ui/status/network.js b/js/ui/status/network.js
index 421d2e7d2..13b6501e7 100644
--- a/js/ui/status/network.js
+++ b/js/ui/status/network.js
@@ -2010,7 +2010,9 @@ var NMApplet = class extends PanelMenu.SystemIndicator {
new PortalHelperProxy(Gio.DBus.session, 'org.gnome.Shell.PortalHelper',
'/org/gnome/Shell/PortalHelper', (proxy, error) => {
if (error) {
- log('Error launching the portal helper: ' + error);
+ // Timeout is expected if WebKit is unavailable
+ if (!error.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.TIMED_OUT))
+ log('Error launching the portal helper: ' + error);
return;
}

View File

@ -1,500 +0,0 @@
From 6238062c4be992e64c9aa227c8cb3b9385a9778f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
Date: Wed, 12 Jun 2024 13:13:41 +0200
Subject: [PATCH 1/3] network: Split out CaptivePortalHandler class
The handling of captive portals is going to be extended a bit,
so split out a proper class instead of mixing it in with the
indicator code.
---
js/ui/status/network.js | 154 ++++++++++++++++++++++------------------
1 file changed, 84 insertions(+), 70 deletions(-)
diff --git a/js/ui/status/network.js b/js/ui/status/network.js
index ef04f7f3dd..67e8f36397 100644
--- a/js/ui/status/network.js
+++ b/js/ui/status/network.js
@@ -1658,6 +1658,78 @@ var DeviceCategory = class extends PopupMenu.PopupMenuSection {
}
};
+class CaptivePortalHandler {
+ constructor(checkUri) {
+ this._checkUri = checkUri;
+ this._connectivityQueue = new Set();
+ this._portalHelperProxy = null;
+ }
+
+ addConnection(path) {
+ if (this._connectivityQueue.has(path))
+ return;
+
+ this._launchPortalHelper(path);
+ }
+
+ removeConnection(path) {
+ if (this._connectivityQueue.delete(path) && this._portalHelperProxy)
+ this._portalHelperProxy.CloseRemote(path);
+ }
+
+ _portalHelperDone(parameters) {
+ const [path, result] = parameters;
+
+ if (result === PortalHelperResult.CANCELLED) {
+ // Keep the connection in the queue, so the user is not
+ // spammed with more logins until we next flush the queue,
+ // which will happen once they choose a better connection
+ // or we get to full connectivity through other means
+ } else if (result === PortalHelperResult.COMPLETED) {
+ this.removeConnection(path);
+ } else if (result === PortalHelperResult.RECHECK) {
+ this.emit('recheck', path);
+ } else {
+ log(`Invalid result from portal helper: ${result}`);
+ }
+ }
+
+ _launchPortalHelper(path) {
+ const timestamp = global.get_current_time();
+ if (this._portalHelperProxy) {
+ this._portalHelperProxy.AuthenticateRemote(path, this._checkUri, timestamp);
+ } else {
+ new PortalHelperProxy(Gio.DBus.session,
+ 'org.gnome.Shell.PortalHelper',
+ '/org/gnome/Shell/PortalHelper',
+ (proxy, error) => {
+ if (error) {
+ log(`Error launching the portal helper: ${e.message}`);
+ return;
+ }
+
+ this._portalHelperProxy = proxy;
+ this._portalHelperProxy.connectSignal('Done',
+ (proxy, emitter, params) => {
+ this._portalHelperDone(params);
+ });
+ this._portalHelperProxy.AuthenticateRemote(path, this._checkUri, timestamp);
+ });
+ }
+
+ this._connectivityQueue.add(path);
+ }
+
+ clear() {
+ if (this._portalHelperProxy) {
+ for (const item of this._connectivityQueue)
+ this._portalHelperProxy.CloseRemote(item);
+ }
+ this._connectivityQueue.clear();
+ }
+}
+Signals.addSignalMethods(CaptivePortalHandler.prototype);
+
var NMApplet = class extends PanelMenu.SystemIndicator {
constructor() {
super();
@@ -1713,6 +1785,16 @@ var NMApplet = class extends PanelMenu.SystemIndicator {
this._vpnSection.connect('icon-changed', this._updateIcon.bind(this));
this.menu.addMenuItem(this._vpnSection.item);
+ const {connectivityCheckUri} = this._client;
+ this._portalHandler = new CaptivePortalHandler(connectivityCheckUri);
+ this._portalHandler.connect('recheck', async (o, path) => {
+ try {
+ const state = await this._client.check_connectivity_async(null);
+ if (state >= NM.ConnectivityState.FULL)
+ this._portalHandler.removeConnection(path);
+ } catch (e) { }
+ });
+
this._readConnections();
this._readDevices();
this._syncNMState();
@@ -2029,54 +2111,10 @@ var NMApplet = class extends PanelMenu.SystemIndicator {
this._syncConnectivity();
}
- _flushConnectivityQueue() {
- if (this._portalHelperProxy) {
- for (let item of this._connectivityQueue)
- this._portalHelperProxy.CloseRemote(item);
- }
-
- this._connectivityQueue = [];
- }
-
- _closeConnectivityCheck(path) {
- let index = this._connectivityQueue.indexOf(path);
-
- if (index >= 0) {
- if (this._portalHelperProxy)
- this._portalHelperProxy.CloseRemote(path);
-
- this._connectivityQueue.splice(index, 1);
- }
- }
-
- _portalHelperDone(proxy, emitter, parameters) {
- let [path, result] = parameters;
-
- if (result == PortalHelperResult.CANCELLED) {
- // Keep the connection in the queue, so the user is not
- // spammed with more logins until we next flush the queue,
- // which will happen once he chooses a better connection
- // or we get to full connectivity through other means
- } else if (result == PortalHelperResult.COMPLETED) {
- this._closeConnectivityCheck(path);
- return;
- } else if (result == PortalHelperResult.RECHECK) {
- this._client.check_connectivity_async(null, (client, result) => {
- try {
- let state = client.check_connectivity_finish(result);
- if (state >= NM.ConnectivityState.FULL)
- this._closeConnectivityCheck(path);
- } catch(e) { }
- });
- } else {
- log('Invalid result from portal helper: ' + result);
- }
- }
-
_syncConnectivity() {
if (this._mainConnection == null ||
this._mainConnection.state != NM.ActiveConnectionState.ACTIVATED) {
- this._flushConnectivityQueue();
+ this._portalHandler.clear();
return;
}
@@ -2091,31 +2129,7 @@ var NMApplet = class extends PanelMenu.SystemIndicator {
if (!isPortal || Main.sessionMode.isGreeter)
return;
- let path = this._mainConnection.get_path();
- for (let item of this._connectivityQueue) {
- if (item == path)
- return;
- }
-
- let timestamp = global.get_current_time();
- if (this._portalHelperProxy) {
- this._portalHelperProxy.AuthenticateRemote(path, '', timestamp);
- } else {
- new PortalHelperProxy(Gio.DBus.session, 'org.gnome.Shell.PortalHelper',
- '/org/gnome/Shell/PortalHelper', (proxy, error) => {
- if (error) {
- log('Error launching the portal helper: ' + error);
- return;
- }
-
- this._portalHelperProxy = proxy;
- proxy.connectSignal('Done', this._portalHelperDone.bind(this));
-
- proxy.AuthenticateRemote(path, '', timestamp);
- });
- }
-
- this._connectivityQueue.push(path);
+ this._portalHandler.addConnection(this._mainConnection.get_path());
}
_updateIcon() {
--
2.45.2
From c4cc99ff934e17b9c267022e6f4db25bb666df39 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
Date: Wed, 12 Jun 2024 13:13:41 +0200
Subject: [PATCH 2/3] status/network: Show notification when detecting captive
portal
When NetworkManager detects limited connectivity, we currently
pop up the portal helper window immediately. This can both be
disruptive when it happens unexpectedly, and unnoticeable
when it happens during screen lock.
In any case, it seems better to not pop up a window without
explicit user action, so instead show a notification that
launches the portal window when activated.
Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/7688
---
js/ui/status/network.js | 39 +++++++++++++++++++++++++++++++++++----
1 file changed, 35 insertions(+), 4 deletions(-)
diff --git a/js/ui/status/network.js b/js/ui/status/network.js
index 67e8f36397..3f3158aff8 100644
--- a/js/ui/status/network.js
+++ b/js/ui/status/network.js
@@ -1662,19 +1662,44 @@ class CaptivePortalHandler {
constructor(checkUri) {
this._checkUri = checkUri;
this._connectivityQueue = new Set();
+ this._notifications = new Map();
this._portalHelperProxy = null;
}
- addConnection(path) {
- if (this._connectivityQueue.has(path))
+ addConnection(name, path) {
+ if (this._connectivityQueue.has(path) || this._notifications.has(path))
return;
- this._launchPortalHelper(path);
+ const source = new MessageTray.Source(
+ _('System'),
+ 'emblem-system-symbolic');
+ Main.messageTray.add(source);
+
+ const notification = new MessageTray.Notification(
+ source, _('Sign Into WiFi Network'), name);
+ notification.connect('activated',
+ () => this._onNotificationActivated(path).catch(logError));
+ notification.connect('destroy',
+ () => this._notifications.delete(path));
+ this._notifications.set(path, notification);
+ source.notify(notification);
}
+
removeConnection(path) {
if (this._connectivityQueue.delete(path) && this._portalHelperProxy)
this._portalHelperProxy.CloseRemote(path);
+ const notification = this._notifications.get(path);
+ if (notification)
+ notification.destroy(MessageTray.NotificationDestroyedReason.SOURCE_CLOSED);
+ this._notifications.delete(path);
+ }
+
+ _onNotificationActivated(path) {
+ this._launchPortalHelper(path);
+
+ Main.overview.hide();
+ Main.panel.closeCalendar();
}
_portalHelperDone(parameters) {
@@ -1726,6 +1751,10 @@ class CaptivePortalHandler {
this._portalHelperProxy.CloseRemote(item);
}
this._connectivityQueue.clear();
+
+ for (const n of this._notifications.values())
+ n.destroy(MessageTray.NotificationDestroyedReason.SOURCE_CLOSED);
+ this._notifications.clear();
}
}
Signals.addSignalMethods(CaptivePortalHandler.prototype);
@@ -2129,7 +2158,9 @@ var NMApplet = class extends PanelMenu.SystemIndicator {
if (!isPortal || Main.sessionMode.isGreeter)
return;
- this._portalHandler.addConnection(this._mainConnection.get_path());
+ this._portalHandler.addConnection(
+ this._mainConnection.get_id(),
+ this._mainConnection.get_path());
}
_updateIcon() {
--
2.45.2
From 3928c3ba5cd79bdcd9092d699af6b086cf00e76f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
Date: Wed, 12 Jun 2024 13:13:41 +0200
Subject: [PATCH 3/3] build: Add option to disable portal-helper
The portal login window uses WebKit, which is a security-sensitive
component that not all vendors want to support.
Support that case with a build option, and update the captive
portal handler to use the user's default browser if the portal-helper
is disabled.
---
data/icons/meson.build | 10 +++++++++-
data/meson.build | 2 +-
js/meson.build | 14 ++++++++------
js/misc/config.js.in | 2 ++
js/misc/meson.build | 1 +
js/ui/status/network.js | 15 +++++++++++----
meson.build | 5 +++++
meson_options.txt | 6 ++++++
src/meson.build | 2 +-
9 files changed, 44 insertions(+), 13 deletions(-)
diff --git a/data/icons/meson.build b/data/icons/meson.build
index eff6e4b530..277df017b2 100644
--- a/data/icons/meson.build
+++ b/data/icons/meson.build
@@ -1 +1,9 @@
-install_subdir('hicolor', install_dir: icondir)
+excluded_icons=[]
+if not have_portal_helper
+ excluded_icons += [
+ 'scalable/apps/org.gnome.Shell.CaptivePortal.svg',
+ 'symbolic/apps/org.gnome.Shell.CaptivePortal-symbolic.svg',
+ ]
+endif
+install_subdir('hicolor',
+ install_dir: icondir, exclude_files: excluded_icons)
diff --git a/data/meson.build b/data/meson.build
index 33edb58c44..decc9fe091 100644
--- a/data/meson.build
+++ b/data/meson.build
@@ -4,7 +4,7 @@ desktop_files = [
]
service_files = []
-if have_networkmanager
+if have_portal_helper
desktop_files += 'org.gnome.Shell.PortalHelper.desktop'
service_files += 'org.gnome.Shell.PortalHelper.service'
endif
diff --git a/js/meson.build b/js/meson.build
index 4a572c53ff..ced1311805 100644
--- a/js/meson.build
+++ b/js/meson.build
@@ -7,12 +7,14 @@ js_resources = gnome.compile_resources(
dependencies: [config_js]
)
-portal_resources = gnome.compile_resources(
- 'portal-resources', 'portal-resources.gresource.xml',
- source_dir: ['.', meson.current_build_dir()],
- c_name: 'portal_js_resources',
- dependencies: [config_js]
-)
+if have_portal_helper
+ portal_resources = gnome.compile_resources(
+ 'portal-resources', 'portal-resources.gresource.xml',
+ source_dir: ['.', meson.current_build_dir()],
+ c_name: 'portal_js_resources',
+ dependencies: [config_js]
+ )
+endif
prefs_resources = gnome.compile_resources(
'prefs-resources', 'prefs-resources.gresource.xml',
diff --git a/js/misc/config.js.in b/js/misc/config.js.in
index 065d7a0a2a..dc14d6d095 100644
--- a/js/misc/config.js.in
+++ b/js/misc/config.js.in
@@ -8,6 +8,8 @@ var PACKAGE_VERSION = '@PACKAGE_VERSION@';
var HAVE_BLUETOOTH = @HAVE_BLUETOOTH@;
/* 1 if networkmanager is available, 0 otherwise */
var HAVE_NETWORKMANAGER = @HAVE_NETWORKMANAGER@;
+/* 1 if portal helper is enabled, 0 otherwise */
+var HAVE_PORTAL_HELPER = @HAVE_PORTAL_HELPER@;
/* gettext package */
var GETTEXT_PACKAGE = '@GETTEXT_PACKAGE@';
/* locale dir */
diff --git a/js/misc/meson.build b/js/misc/meson.build
index 5a4871762a..448a61556b 100644
--- a/js/misc/meson.build
+++ b/js/misc/meson.build
@@ -5,6 +5,7 @@ jsconf.set('GETTEXT_PACKAGE', meson.project_name())
jsconf.set('LIBMUTTER_API_VERSION', mutter_api_version)
jsconf.set10('HAVE_BLUETOOTH', bt_dep.found())
jsconf.set10('HAVE_NETWORKMANAGER', have_networkmanager)
+jsconf.set10('HAVE_PORTAL_HELPER', have_portal_helper)
jsconf.set('datadir', datadir)
jsconf.set('libexecdir', libexecdir)
jsconf.set('vpndir', vpndir)
diff --git a/js/ui/status/network.js b/js/ui/status/network.js
index 3f3158aff8..b2c6679119 100644
--- a/js/ui/status/network.js
+++ b/js/ui/status/network.js
@@ -4,6 +4,7 @@ const Mainloop = imports.mainloop;
const Signals = imports.signals;
const Animation = imports.ui.animation;
+const Config = imports.misc.config;
const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
@@ -1678,7 +1679,7 @@ class CaptivePortalHandler {
const notification = new MessageTray.Notification(
source, _('Sign Into WiFi Network'), name);
notification.connect('activated',
- () => this._onNotificationActivated(path).catch(logError));
+ () => this._onNotificationActivated(path));
notification.connect('destroy',
() => this._notifications.delete(path));
this._notifications.set(path, notification);
@@ -1696,7 +1697,13 @@ class CaptivePortalHandler {
}
_onNotificationActivated(path) {
- this._launchPortalHelper(path);
+ const context = global.create_app_launch_context(
+ global.get_current_time(), -1);
+
+ if (Config.HAVE_PORTAL_HELPER)
+ this._launchPortalHelper(path, context);
+ else
+ Gio.AppInfo.launch_default_for_uri(this._checkUri, context);
Main.overview.hide();
Main.panel.closeCalendar();
@@ -1719,8 +1726,8 @@ class CaptivePortalHandler {
}
}
- _launchPortalHelper(path) {
- const timestamp = global.get_current_time();
+ _launchPortalHelper(path, context) {
+ const {timestamp} = context;
if (this._portalHelperProxy) {
this._portalHelperProxy.AuthenticateRemote(path, this._checkUri, timestamp);
} else {
diff --git a/meson.build b/meson.build
index 2dd1bbc7a3..7a5e4eb603 100644
--- a/meson.build
+++ b/meson.build
@@ -121,6 +121,11 @@ else
have_networkmanager = false
endif
+have_portal_helper = get_option('portal_helper')
+if have_portal_helper and not have_networkmanager
+ error('Portal helper requires networkmanager support')
+endif
+
if get_option('systemd')
libsystemd_dep = dependency('libsystemd')
# XXX: see systemduserunitdir
diff --git a/meson_options.txt b/meson_options.txt
index 853ca98dce..1b8cd778ad 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -16,6 +16,12 @@ option('networkmanager',
description: 'Enable NetworkManager support'
)
+option('portal_helper',
+ type: 'boolean',
+ value: true,
+ description: 'Enable build-in network portal login'
+)
+
option('systemd',
type: 'boolean',
value: true,
diff --git a/src/meson.build b/src/meson.build
index 2b911d3476..83037af1f8 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -245,7 +245,7 @@ executable('gnome-shell-extension-prefs',
)
-if have_networkmanager
+if have_portal_helper
executable('gnome-shell-portal-helper',
'gnome-shell-portal-helper.c', portal_resources,
c_args: tools_cflags,
--
2.45.2

View File

@ -1,12 +1,6 @@
%if 0%{?rhel}
%global portal_helper 0
%else
%global portal_helper 1
%endif
Name: gnome-shell
Version: 3.32.2
Release: 60%{?dist}
Release: 55%{?dist}
Summary: Window management and application launching for GNOME
Group: User Interface/Desktops
@ -17,109 +11,106 @@ URL: https://wiki.gnome.org/Projects/GnomeShell
Source0: http://download.gnome.org/sources/gnome-shell/3.32/%{name}-%{version}.tar.xz
# Replace Epiphany with Firefox in the default favourite apps list
Patch1001: gnome-shell-favourite-apps-firefox.patch
Patch1002: gnome-shell-favourite-apps-yelp.patch
Patch1003: gnome-shell-favourite-apps-terminal.patch
Patch1: gnome-shell-favourite-apps-firefox.patch
Patch2: gnome-shell-favourite-apps-yelp.patch
Patch3: gnome-shell-favourite-apps-terminal.patch
# GDM/Lock stuff
Patch2001: 0001-screenShield-unblank-when-inserting-smartcard.patch
Patch2002: enforce-smartcard-at-unlock.patch
Patch2003: disable-unlock-entry-until-question.patch
Patch2004: allow-timed-login-with-no-user-list.patch
Patch2005: 0001-data-install-process-working.svg-to-filesystem.patch
Patch2006: 0001-loginDialog-make-info-messages-themed.patch
Patch2007: 0001-gdm-add-AuthList-control.patch
Patch2008: 0002-gdmUtil-enable-support-for-GDM-s-ChoiceList-PAM-exte.patch
Patch2009: wake-up-on-deactivate.patch
Patch2010: caps-lock-warning.patch
Patch2011: gdm-networking.patch
Patch2012: 0001-shellEntry-Disconnect-handler-on-destroy.patch
Patch2013: fix-login-lock-screen.patch
Patch2014: 0001-shellEntry-Determine-if-password-entry-from-content-.patch
Patch2015: 0002-shellEntry-Give-password-menu-item-text-when-it-s-cr.patch
Patch2016: 0003-shellEntry-Handle-password-item-from-dedication-func.patch
Patch2017: 0004-shellEntry-Support-lockdown-of-Show-Text-menu-in-pas.patch
Patch2018: 0005-shellEntry-Only-mask-text-in-password-entries.patch
Patch2019: 0001-gdm-loginDialog-Reset-the-greeter-proxy-on-connectio.patch
Patch12: 0001-screenShield-unblank-when-inserting-smartcard.patch
Patch13: enforce-smartcard-at-unlock.patch
Patch14: disable-unlock-entry-until-question.patch
Patch15: allow-timed-login-with-no-user-list.patch
Patch16: 0001-data-install-process-working.svg-to-filesystem.patch
Patch17: 0001-loginDialog-make-info-messages-themed.patch
Patch18: 0001-gdm-add-AuthList-control.patch
Patch19: 0002-gdmUtil-enable-support-for-GDM-s-ChoiceList-PAM-exte.patch
Patch20: wake-up-on-deactivate.patch
Patch21: caps-lock-warning.patch
Patch22: gdm-networking.patch
Patch23: 0001-shellEntry-Disconnect-handler-on-destroy.patch
Patch24: fix-login-lock-screen.patch
Patch25: 0001-shellEntry-Determine-if-password-entry-from-content-.patch
Patch26: 0002-shellEntry-Give-password-menu-item-text-when-it-s-cr.patch
Patch27: 0003-shellEntry-Handle-password-item-from-dedication-func.patch
Patch28: 0004-shellEntry-Support-lockdown-of-Show-Text-menu-in-pas.patch
Patch29: 0005-shellEntry-Only-mask-text-in-password-entries.patch
# Misc.
Patch3001: 0001-shellDBus-Add-a-DBus-method-to-load-a-single-extensi.patch
Patch3002: 0001-extensions-Add-a-SESSION_MODE-extension-type.patch
Patch3003: extension-updates.patch
Patch3004: 0001-panel-add-an-icon-to-the-ActivitiesButton.patch
Patch3005: 0001-app-Fall-back-to-window-title-instead-of-WM_CLASS.patch
Patch3006: 0001-windowMenu-Bring-back-workspaces-submenu-for-static-.patch
Patch3007: 0001-shell-app-Handle-workspace-from-startup-notification.patch
Patch3008: 0001-main-Dump-stack-on-segfaults-by-default.patch
Patch3009: 0001-appDisplay-Show-full-app-name-on-hover.patch
Patch3010: horizontal-workspace-support.patch
Patch3011: 0001-animation-fix-unintentional-loop-while-polkit-dialog.patch
Patch3012: 0001-workspacesView-Work-around-spurious-allocation-chang.patch
Patch3013: 0001-layout-Make-the-hot-corner-optional.patch
Patch3014: fix-app-view-leaks.patch
Patch3015: root-warning.patch
Patch3016: 0001-workspace-Pass-device-to-startDrag.patch
Patch3017: 0001-a11y-Change-HC-icon-theme-first.patch
Patch3018: perf-tool-wayland.patch
Patch3019: 0001-padOsd-Re-query-action-labels-after-mode-switches.patch
Patch3020: 0001-Do-not-change-Wacom-LEDs-through-g-s-d.patch
Patch3021: 0001-st-texture-cache-Cancel-pending-requests-on-icon-the.patch
Patch3022: introspect-backports.patch
Patch3023: 0001-popupMenu-Handle-keypress-if-numlock-is-enabled.patch
Patch3024: 0001-theme-Update-window-preview-style.patch
Patch3025: warn-less.patch
Patch3026: 0001-networkAgent-add-support-for-SAE-secrets.patch
Patch3027: 0001-main-Unset-the-right-prevFocus-actor-after-the-focus.patch
Patch3028: defend-against-corrupt-notifications.patch
Patch3029: 0001-status-volume-Hide-sliders-initially.patch
Patch3030: 0001-shell-recorder-Restore-cursor-recording.patch
Patch3031: 0001-st-bin-Disallow-st_bin_set_child-with-already-parent.patch
Patch3032: 0001-layout-Initialize-regions-unconditionally.patch
Patch3033: fix-nm-device-settings.patch
Patch3034: owe-support.patch
Patch3035: 0001-windowMenu-Ignore-release.patch
Patch3036: 0001-overview-Hide-the-overview-on-session-mode-hasOvervi.patch
Patch3037: 0001-st-theme-Reuse-stylesheets-if-possible.patch
Patch3038: fix-dropping-menu-grab.patch
Patch30: 0001-shellDBus-Add-a-DBus-method-to-load-a-single-extensi.patch
Patch31: 0001-extensions-Add-a-SESSION_MODE-extension-type.patch
Patch32: extension-updates.patch
Patch33: 0001-panel-add-an-icon-to-the-ActivitiesButton.patch
Patch34: 0001-app-Fall-back-to-window-title-instead-of-WM_CLASS.patch
Patch35: 0001-windowMenu-Bring-back-workspaces-submenu-for-static-.patch
Patch36: 0001-shell-app-Handle-workspace-from-startup-notification.patch
Patch37: 0001-main-Dump-stack-on-segfaults-by-default.patch
Patch38: 0001-appDisplay-Show-full-app-name-on-hover.patch
Patch39: horizontal-workspace-support.patch
Patch40: 0001-animation-fix-unintentional-loop-while-polkit-dialog.patch
Patch41: 0001-workspacesView-Work-around-spurious-allocation-chang.patch
Patch42: 0001-layout-Make-the-hot-corner-optional.patch
Patch43: fix-app-view-leaks.patch
Patch44: root-warning.patch
Patch45: 0001-workspace-Pass-device-to-startDrag.patch
Patch46: 0001-a11y-Change-HC-icon-theme-first.patch
Patch47: perf-tool-wayland.patch
Patch48: 0001-padOsd-Re-query-action-labels-after-mode-switches.patch
Patch49: 0001-Do-not-change-Wacom-LEDs-through-g-s-d.patch
Patch50: 0001-st-texture-cache-Cancel-pending-requests-on-icon-the.patch
Patch51: introspect-backports.patch
Patch52: 0001-popupMenu-Handle-keypress-if-numlock-is-enabled.patch
Patch53: 0001-theme-Update-window-preview-style.patch
Patch54: warn-less.patch
Patch55: 0001-networkAgent-add-support-for-SAE-secrets.patch
Patch56: 0001-main-Unset-the-right-prevFocus-actor-after-the-focus.patch
Patch57: defend-against-corrupt-notifications.patch
Patch58: 0001-status-volume-Hide-sliders-initially.patch
Patch59: 0001-shell-recorder-Restore-cursor-recording.patch
Patch60: 0001-st-bin-Disallow-st_bin_set_child-with-already-parent.patch
Patch61: 0001-layout-Initialize-regions-unconditionally.patch
Patch62: fix-nm-device-settings.patch
Patch63: owe-support.patch
Patch64: 0001-windowMenu-Ignore-release.patch
Patch65: 0001-overview-Hide-the-overview-on-session-mode-hasOvervi.patch
# Backport JS invalid access warnings (#1651894, #1663171, #1642482, #1637622)
Patch4001: fix-invalid-access-warnings.patch
Patch4002: more-spurious-allocation-warnings.patch
Patch4003: fix-some-js-warnings.patch
Patch4004: fix-double-disposed-backgrounds.patch
Patch70: fix-invalid-access-warnings.patch
Patch71: more-spurious-allocation-warnings.patch
Patch72: fix-some-js-warnings.patch
Patch73: fix-double-disposed-backgrounds.patch
# Backport performance fixes under load (#1820760)
Patch5001: 0001-environment-reduce-calls-to-g_time_zone_new_local.patch
Patch5002: 0002-environment-Fix-date-conversion.patch
Patch5003: 0003-shell-app-system-Monitor-for-icon-theme-changes.patch
Patch5004: 0004-global-force-fsync-to-worker-thread-when-saving-stat.patch
Patch5005: 0005-app-cache-add-ShellAppCache-for-GAppInfo-caching.patch
Patch5006: 0006-js-Always-use-AppSystem-to-lookup-apps.patch
Patch80: 0001-environment-reduce-calls-to-g_time_zone_new_local.patch
Patch81: 0002-environment-Fix-date-conversion.patch
Patch82: 0003-shell-app-system-Monitor-for-icon-theme-changes.patch
Patch83: 0004-global-force-fsync-to-worker-thread-when-saving-stat.patch
Patch84: 0005-app-cache-add-ShellAppCache-for-GAppInfo-caching.patch
Patch85: 0006-js-Always-use-AppSystem-to-lookup-apps.patch
# Stop screen recording on monitor changes (#1705392)
Patch6001: 0001-screencast-Stop-recording-when-screen-size-or-resour.patch
Patch90: 0001-screencast-Stop-recording-when-screen-size-or-resour.patch
# Backport OSK fixes (#1871041)
Patch7001: osk-fixes.patch
Patch7002: 0001-keyboard-Only-enable-keyboard-if-ClutterDeviceManage.patch
Patch95: osk-fixes.patch
Patch96: 0001-keyboard-Only-enable-keyboard-if-ClutterDeviceManage.patch
# suspend/resume fix on nvidia (#1663440)
Patch8001: 0001-background-refresh-after-suspend-on-wayland.patch
Patch8002: 0002-background-rebuild-background-not-just-animation-on-.patch
Patch8003: 0003-st-texture-cache-purge-on-resume.patch
Patch8004: 0004-background-refresh-background-on-gl-video-memory-pur.patch
Patch10001: 0001-background-refresh-after-suspend-on-wayland.patch
Patch10002: 0002-background-rebuild-background-not-just-animation-on-.patch
Patch10003: 0003-st-texture-cache-purge-on-resume.patch
Patch10004: 0004-background-refresh-background-on-gl-video-memory-pur.patch
# Allow login screen extensions (#1651378)
Patch9001: 0001-extensionSystem-Handle-added-or-removed-sessionMode-.patch
Patch9002: 0002-extensionSystem-Get-rid-of-_enabled-boolean-optimiza.patch
Patch9003: 0003-extensionSystem-Allow-extensions-to-run-on-the-login.patch
Patch9004: 0004-sessionMode-Allow-extensions-at-the-login-and-unlock.patch
Patch20001: 0001-extensionSystem-Handle-added-or-removed-sessionMode-.patch
Patch20002: 0002-extensionSystem-Get-rid-of-_enabled-boolean-optimiza.patch
Patch20003: 0003-extensionSystem-Allow-extensions-to-run-on-the-login.patch
Patch20004: 0004-sessionMode-Allow-extensions-at-the-login-and-unlock.patch
# CVE-2020-17489
Patch10001: 0001-loginDialog-Reset-auth-prompt-on-vt-switch-before-fa.patch
Patch30001: 0001-loginDialog-Reset-auth-prompt-on-vt-switch-before-fa.patch
# Disable captive portal helper if WebKitGTK is not installed (RHEL-10488)
Patch11001: portal-notify.patch
Patch40001: optional-portal-helper.patch
%define libcroco_version 0.6.8
%define eds_version 3.17.2
@ -180,7 +171,7 @@ Requires: gnome-bluetooth%{?_isa} >= %{gnome_bluetooth_version}
Requires: gnome-desktop3%{?_isa} >= %{gnome_desktop_version}
%if 0%{?rhel} != 7
# Disabled on RHEL 7 to allow logging into KDE session by default
Recommends: gnome-session-xsession
Requires: gnome-session-xsession
%endif
# wrapper script uses to restart old GNOME session if run --replace
# from the command line
@ -232,13 +223,7 @@ easy to use experience.
%autosetup -S git
%build
%meson \
%if %{portal_helper}
-Dportal_helper=true \
%else
-Dportal_helper=false \
%endif
%{nil}
%meson
%meson_build
%install
@ -267,10 +252,12 @@ desktop-file-validate %{buildroot}%{_datadir}/applications/evolution-calendar.de
%{_datadir}/applications/org.gnome.Shell.desktop
%{_datadir}/applications/gnome-shell-extension-prefs.desktop
%{_datadir}/applications/evolution-calendar.desktop
%{_datadir}/applications/org.gnome.Shell.PortalHelper.desktop
%{_datadir}/gnome-control-center/keybindings/50-gnome-shell-system.xml
%{_datadir}/gnome-shell/
%{_datadir}/dbus-1/services/org.gnome.Shell.CalendarServer.service
%{_datadir}/dbus-1/services/org.gnome.Shell.HotplugSniffer.service
%{_datadir}/dbus-1/services/org.gnome.Shell.PortalHelper.service
%{_datadir}/dbus-1/interfaces/org.gnome.Shell.Extensions.xml
%{_datadir}/dbus-1/interfaces/org.gnome.Shell.Introspect.xml
%{_datadir}/dbus-1/interfaces/org.gnome.Shell.PadOsd.xml
@ -292,6 +279,7 @@ desktop-file-validate %{buildroot}%{_datadir}/applications/evolution-calendar.de
%{_libexecdir}/gnome-shell-calendar-server
%{_libexecdir}/gnome-shell-perf-helper
%{_libexecdir}/gnome-shell-hotplug-sniffer
%{_libexecdir}/gnome-shell-portal-helper
%{_libexecdir}/gnome-shell-overrides-migration.sh
# Co own these directories instead of pulling in GConf
# after all, we are trying to get rid of GConf with these files
@ -300,34 +288,7 @@ desktop-file-validate %{buildroot}%{_datadir}/applications/evolution-calendar.de
%{_datadir}/GConf/gsettings/gnome-shell-overrides.convert
%{_mandir}/man1/%{name}.1.gz
%if %{portal_helper}
%{_datadir}/applications/org.gnome.Shell.PortalHelper.desktop
%{_datadir}/dbus-1/services/org.gnome.Shell.PortalHelper.service
%{_libexecdir}/gnome-shell-portal-helper
%endif
%changelog
* Wed Jun 17 2026 Joan Torres Lopez <joantolo@redhat.com> - 3.32.2-60
- Backport fix to recover userVerifier
Resolves: RHEL-185731
* Wed May 13 2026 Florian Müllner <fmuellner@redhat.com> - 3.32.2-59
- Fix dropping menu grab on destroy
Resolves: RHEL-171948
* Thu Aug 21 2025 Joan Torres Lopez <joantolo@redhat.com> - 3.32.2-58
- Don't hard depend on gnome-session-xsession to allow
using other session types, e.g. wayland
Resolves: RHEL-110531
* Thu May 15 2025 Florian Müllner <fmuellner@redhat.com> - 3.32.2-57
- Fix refcount issue in stylesheet tracking
Resolves: RHEL-91810
* Wed Jul 10 2024 Florian Müllner <fmuellner@redhat.com> - 3.32.2-56
- Only open portal login in response to user action
Resolves: RHEL-39097
* Thu Dec 21 2023 Florian Müllner <fmuellner@redhat.com> - 3.32.2-55
- Hide the overview on lock
Resolves: RHEL-17349