From ebe1a4d303281f2ceb465dc1a76506a3976fc914 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Wed, 13 Dec 2023 01:11:52 +0100 Subject: [PATCH] dbusService: Exempt org.gnome.Shell from sender tracking If an interface has any signals, we don't want to auto-shutdown while a caller is still connected to a signal. Unfortunately we can't tell whether there are any signal connections, so we track all callers instead, and keep the service alive while any of them is still on the bus. For services that we call from gnome-shell itself - like screencasts or extensions - this has the unintended side effect of effectively disabling auto-shutdown. Address this by exempting the org.gnome.Shell name from sender tracking. Services that we expect to keep running for the lifetime of the shell already disable auto-shutdown, so the only downside is a small startup delay to resolve the well-known shell name. https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/7250 Part-of: --- js/dbusServices/dbusService.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/js/dbusServices/dbusService.js b/js/dbusServices/dbusService.js index 1b1f7c6e2..422ef60e2 100644 --- a/js/dbusServices/dbusService.js +++ b/js/dbusServices/dbusService.js @@ -21,6 +21,8 @@ export class ServiceImplementation { this._senders = new Map(); this._holdCount = 0; + this._shellName = this._getUniqueShellName(); + this._hasSignals = this._dbusImpl.get_info().signals.length > 0; this._shutdownTimeoutId = 0; @@ -115,6 +117,9 @@ export class ServiceImplementation { if (this._senders.has(sender)) return; + if (sender === this._shellName) + return; // don't track the shell + this.hold(); this._senders.set(sender, this._dbusImpl.get_connection().watch_name( @@ -148,6 +153,26 @@ export class ServiceImplementation { that._queueShutdownCheck(); }; } + + _getUniqueShellName() { + try { + const res = Gio.DBus.session.call_sync( + 'org.freedesktop.DBus', + '/org/freedesktop/DBus', + 'org.freedesktop.DBus', + 'GetNameOwner', + new GLib.Variant('(s)', ['org.gnome.Shell']), + null, + Gio.DBusCallFlags.NONE, + -1, + null); + const [name] = res.deepUnpack(); + return name; + } catch (e) { + console.warn(`Failed to resolve shell name: ${e.message}`); + return ''; + } + } } Signals.addSignalMethods(ServiceImplementation.prototype);