From 3fc7ed40889cf0c3b68217aa483bf90799b84916 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Tue, 6 Feb 2024 18:16:29 +0100 Subject: [PATCH] notification: Pass policy in the Source contructor Commit 932ccac1 changed Source to use a regular constructor instead of `_init()`. Unfortunately that results in ordering issues for subclasses that override `_createPolicy()`, if that method needs to access any properties that are set in the constructor (as `this` is only available after chaining up to the parent). We can fix that by simply setting the policy from the constructor, instead of relying on some overriden method being called. Part-of: --- js/ui/components/telepathyClient.js | 18 +++---- js/ui/extensionSystem.js | 21 ++++----- js/ui/notificationDaemon.js | 73 +++++++++++------------------ js/ui/windowAttentionHandler.js | 22 +++------ 4 files changed, 53 insertions(+), 81 deletions(-) diff --git a/js/ui/components/telepathyClient.js b/js/ui/components/telepathyClient.js index 04d6f3af7..9f1fa48df 100644 --- a/js/ui/components/telepathyClient.js +++ b/js/ui/components/telepathyClient.js @@ -307,13 +307,19 @@ class TelepathyClient extends Tp.BaseClient { const ChatSource = HAVE_TP ? GObject.registerClass( class ChatSource extends MessageTray.Source { - _init(account, conn, channel, contact, client) { + constructor(account, conn, channel, contact, client) { + const appId = account.protocol_name === 'irc' + ? 'org.gnome.Polari' + : 'empathy'; + const policy = + new MessageTray.NotificationApplicationPolicy(appId); + + super({policy}); + this._account = account; this._contact = contact; this._client = client; - super._init(); - this._pendingMessages = []; this._conn = conn; @@ -356,12 +362,6 @@ class ChatSource extends MessageTray.Source { this.pushNotification(this._notification); } - _createPolicy() { - if (this._account.protocol_name === 'irc') - return new MessageTray.NotificationApplicationPolicy('org.gnome.Polari'); - return new MessageTray.NotificationApplicationPolicy('empathy'); - } - createBanner() { this._banner = new ChatNotificationBanner(this._notification); diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js index b3e43b139..07be8066c 100644 --- a/js/ui/extensionSystem.js +++ b/js/ui/extensionSystem.js @@ -824,20 +824,19 @@ export class ExtensionManager extends Signals.EventEmitter { const ExtensionUpdateSource = GObject.registerClass( class ExtensionUpdateSource extends MessageTray.Source { - _init() { - let appSys = Shell.AppSystem.get_default(); - this._app = appSys.lookup_app('org.gnome.Extensions.desktop'); - if (!this._app) - this._app = appSys.lookup_app('com.mattjakeman.ExtensionManager.desktop'); + constructor() { + const appSys = Shell.AppSystem.get_default(); + const app = + appSys.lookup_app('org.gnome.Extensions.desktop') || + appSys.lookup_app('com.mattjakeman.ExtensionManager.desktop'); - super._init({ - title: this._app.get_name(), - icon: this._app.get_icon(), + super({ + title: app.get_name(), + icon: app.get_icon(), + policy: MessageTray.NotificationPolicy.newForApp(app), }); - } - _createPolicy() { - return new MessageTray.NotificationApplicationPolicy(this._app.id); + this._app = app; } open() { diff --git a/js/ui/notificationDaemon.js b/js/ui/notificationDaemon.js index 899a97516..703316f5f 100644 --- a/js/ui/notificationDaemon.js +++ b/js/ui/notificationDaemon.js @@ -306,18 +306,30 @@ class FdoNotificationDaemon { export const FdoNotificationDaemonSource = GObject.registerClass( class FdoNotificationDaemonSource extends MessageTray.Source { - _init(title, pid, sender, appId) { - this.pid = pid; - this.initialTitle = title; - this.app = this._getApp(appId); - this._appIcon = null; + constructor(title, pid, sender, appId) { + const appSys = Shell.AppSystem.get_default(); + let app; + + app = Shell.WindowTracker.get_default().get_app_from_pid(pid); + if (!app && appId) + app = appSys.lookup_app(`${appId}.desktop`); + + if (!app) + app = appSys.lookup_app(`${title}.desktop`); // Use app name as title if available, instead of whatever is provided // through libnotify (usually garbage) - super._init({ - title: this.app?.get_name() ?? title, + super({ + title: app?.get_name() ?? title, + policy: MessageTray.NotificationPolicy.newForApp(app), }); + this.pid = pid; + this.initialTitle = title; + this.app = app; + this._appIcon = null; + + if (sender) { this._nameWatcherId = Gio.DBus.session.watch_name(sender, Gio.BusNameWatcherFlags.NONE, @@ -328,15 +340,6 @@ class FdoNotificationDaemonSource extends MessageTray.Source { } } - _createPolicy() { - if (this.app && this.app.get_app_info()) { - let id = this.app.get_id().replace(/\.desktop$/, ''); - return new MessageTray.NotificationApplicationPolicy(id); - } else { - return new MessageTray.NotificationGenericPolicy(); - } - } - _onNameVanished() { // Destroy the notification source when its sender is removed from DBus. // Only do so if this.app is set to avoid removing "notify-send" sources, senders @@ -361,23 +364,6 @@ class FdoNotificationDaemonSource extends MessageTray.Source { this.showNotification(notification); } - _getApp(appId) { - const appSys = Shell.AppSystem.get_default(); - let app; - - app = Shell.WindowTracker.get_default().get_app_from_pid(this.pid); - if (app != null) - return app; - - if (appId) - app = appSys.lookup_app(`${appId}.desktop`); - - if (!app) - app = appSys.lookup_app(`${this.initialTitle}.desktop`); - - return app; - } - open() { this.openApp(); this.destroyNonResidentNotifications(); @@ -506,32 +492,29 @@ function InvalidAppError() {} export const GtkNotificationDaemonAppSource = GObject.registerClass( class GtkNotificationDaemonAppSource extends MessageTray.Source { - _init(appId) { - let objectPath = objectPathFromAppId(appId); + constructor(appId) { + const objectPath = objectPathFromAppId(appId); if (!GLib.Variant.is_object_path(objectPath)) throw new InvalidAppError(); - let app = Shell.AppSystem.get_default().lookup_app(`${appId}.desktop`); + const app = Shell.AppSystem.get_default().lookup_app(`${appId}.desktop`); if (!app) throw new InvalidAppError(); + super({ + title: app.get_name(), + icon: app.get_icon(), + policy: new MessageTray.NotificationApplicationPolicy(appId), + }); + this._appId = appId; this._app = app; this._objectPath = objectPath; - super._init({ - title: app.get_name(), - icon: app.get_icon(), - }); - this._notifications = {}; this._notificationPending = false; } - _createPolicy() { - return new MessageTray.NotificationApplicationPolicy(this._appId); - } - _createApp() { return new Promise((resolve, reject) => { new FdoApplicationProxy(Gio.DBus.session, diff --git a/js/ui/windowAttentionHandler.js b/js/ui/windowAttentionHandler.js index dfce5c1b9..1525dae29 100644 --- a/js/ui/windowAttentionHandler.js +++ b/js/ui/windowAttentionHandler.js @@ -56,15 +56,14 @@ export class WindowAttentionHandler { const WindowAttentionSource = GObject.registerClass( class WindowAttentionSource extends MessageTray.Source { - _init(app, window) { - this._window = window; - this._app = app; - - super._init({ - title: this._app.get_name(), - icon: this._app.get_icon(), + constructor(app, window) { + super({ + title: app.get_name(), + icon: app.get_icon(), + policy: MessageTray.NotificationPolicy.newForApp(app), }); + this._window = window; this._window.connectObject( 'notify::demands-attention', this._sync.bind(this), 'notify::urgent', this._sync.bind(this), @@ -78,15 +77,6 @@ class WindowAttentionSource extends MessageTray.Source { this.destroy(); } - _createPolicy() { - if (this._app && this._app.get_app_info()) { - let id = this._app.get_id().replace(/\.desktop$/, ''); - return new MessageTray.NotificationApplicationPolicy(id); - } else { - return new MessageTray.NotificationGenericPolicy(); - } - } - destroy(params) { this._window.disconnectObject(this);