From 6cf0df5fb94fef1e6ab1f06030a17c877550d804 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Fri, 19 May 2023 16:36:39 +0200 Subject: [PATCH] backgroundApps: Track apps instead of instances The background apps menu currently tracks instances rather than apps. That matches the behavior of `flatpak ps` and can be useful, for example when one particular instance runs out of control. But as we don't include any information that allows to actually distinguish between instances, multiple instances appear simply as duplicated app entries. Given that a menu is too limited for detailed information, stop representing individual instances, and track apps instead. https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6654 Part-of: --- js/ui/status/backgroundApps.js | 65 ++++++++++++++++------------------ 1 file changed, 31 insertions(+), 34 deletions(-) diff --git a/js/ui/status/backgroundApps.js b/js/ui/status/backgroundApps.js index 204d0e498..6fd22ea1e 100644 --- a/js/ui/status/backgroundApps.js +++ b/js/ui/status/backgroundApps.js @@ -24,9 +24,6 @@ var BackgroundAppMenuItem = GObject.registerClass({ 'app': GObject.ParamSpec.object('app', '', '', GObject.ParamFlags.READWRITE, Shell.App), - 'instance': GObject.ParamSpec.int64('instance', '', '', - GObject.ParamFlags.READWRITE, - -1, GLib.MAXINT64_BIGINT, -1), 'message': GObject.ParamSpec.string('message', '', '', GObject.ParamFlags.READWRITE, null), @@ -36,16 +33,13 @@ var BackgroundAppMenuItem = GObject.registerClass({ const message = params.message; delete params.message; - const instance = params.instance; - delete params.instance; - super._init(app.get_name(), app.get_icon(), { activate: false, reactive: false, ...params, }); - this.set({message, instance}); + this.set({message}); this.add_style_class_name('background-app-item'); this.label.add_style_class_name('title'); @@ -134,7 +128,7 @@ var BackgroundAppMenuItem = GObject.registerClass({ null); } catch (_error) { try { - Util.trySpawn(['flatpak', 'kill', this.instance]); + Util.trySpawn(['flatpak', 'kill', appId]); } catch (pidError) { logError(pidError, 'Failed to kill application'); } @@ -213,7 +207,35 @@ class BackgroundAppsToggle extends QuickToggle { const {BackgroundApps: backgroundApps} = this._proxy; - const nBackgroundApps = backgroundApps?.length ?? 0; + this._appsSection.removeAll(); + + const items = new Map(); + (backgroundApps ?? []) + .map(backgroundApp => { + const appId = backgroundApp.app_id.deepUnpack(); + const app = this._appSystem.lookup_app(`${appId}.desktop`); + const message = backgroundApp.message?.deepUnpack(); + + return {app, message}; + }) + .sort((a, b) => { + return a.app.get_name().localeCompare(b.app.get_name()); + }) + .forEach(backgroundApp => { + const {app, message} = backgroundApp; + + let item = items.get(app); + if (!item) { + item = new BackgroundAppMenuItem(app); + items.set(app, item); + this._appsSection.addMenuItem(item); + } + + if (message) + item.set({message}); + }); + + const nBackgroundApps = items.size; this.title = nBackgroundApps === 0 ? _('No Background Apps') : ngettext( @@ -221,31 +243,6 @@ class BackgroundAppsToggle extends QuickToggle { '%d Background Apps', nBackgroundApps).format(nBackgroundApps); this._listTitle.visible = nBackgroundApps > 0; - - this._appsSection.removeAll(); - - if (!backgroundApps) - return; - - backgroundApps - .map(backgroundApp => { - const appId = backgroundApp.app_id.deepUnpack(); - const app = this._appSystem.lookup_app(`${appId}.desktop`); - const message = backgroundApp.message?.deepUnpack(); - const instance = backgroundApp.instance.deepUnpack(); - - return {app, message, instance}; - }) - .sort((a, b) => { - return a.app.get_name().localeCompare(b.app.get_name()); - }) - .forEach(backgroundApp => { - const {app, message, instance} = backgroundApp; - - const item = new BackgroundAppMenuItem(app, - {instance, message}); - this._appsSection.addMenuItem(item); - }); } vfunc_clicked() {