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: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3170>
This commit is contained in:

committed by
Marge Bot

parent
810391f41e
commit
3fc7ed4088
@ -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,
|
||||
|
Reference in New Issue
Block a user