NotificationDaemon: improve associating sources with applications
Try harder to find a ShellApp for a notification source, by looking at the PID, tray icon wm_class and desktop-entry libnotify hint. https://bugzilla.gnome.org/show_bug.cgi?id=685926
This commit is contained in:
parent
b150869b51
commit
4dc5bac72f
@ -213,7 +213,7 @@ const NotificationDaemon = new Lang.Class({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let source = new Source(title, pid, sender, trayIcon);
|
let source = new Source(title, pid, sender, trayIcon, ndata ? ndata.hints['desktop-entry'] : null);
|
||||||
source.setTransient(isForTransientNotification);
|
source.setTransient(isForTransientNotification);
|
||||||
|
|
||||||
if (!isForTransientNotification) {
|
if (!isForTransientNotification) {
|
||||||
@ -515,12 +515,22 @@ const Source = new Lang.Class({
|
|||||||
Name: 'NotificationDaemonSource',
|
Name: 'NotificationDaemonSource',
|
||||||
Extends: MessageTray.Source,
|
Extends: MessageTray.Source,
|
||||||
|
|
||||||
_init: function(title, pid, sender, trayIcon) {
|
_init: function(title, pid, sender, trayIcon, appId) {
|
||||||
|
// Need to set the app before chaining up, so
|
||||||
|
// methods called from the parent constructor can find it
|
||||||
|
this.trayIcon = trayIcon;
|
||||||
|
this.pid = pid;
|
||||||
|
this.app = this._getApp(appId);
|
||||||
|
|
||||||
this.parent(title);
|
this.parent(title);
|
||||||
|
|
||||||
this.initialTitle = title;
|
this.initialTitle = title;
|
||||||
|
|
||||||
this.pid = pid;
|
if (this.app)
|
||||||
|
this.title = this.app.get_name();
|
||||||
|
else
|
||||||
|
this.useNotificationIcon = true;
|
||||||
|
|
||||||
if (sender)
|
if (sender)
|
||||||
this._nameWatcherId = Gio.DBus.session.watch_name(sender,
|
this._nameWatcherId = Gio.DBus.session.watch_name(sender,
|
||||||
Gio.BusNameWatcherFlags.NONE,
|
Gio.BusNameWatcherFlags.NONE,
|
||||||
@ -529,16 +539,10 @@ const Source = new Lang.Class({
|
|||||||
else
|
else
|
||||||
this._nameWatcherId = 0;
|
this._nameWatcherId = 0;
|
||||||
|
|
||||||
this._setApp();
|
|
||||||
if (this.app)
|
|
||||||
this.title = this.app.get_name();
|
|
||||||
else
|
|
||||||
this.useNotificationIcon = true;
|
|
||||||
|
|
||||||
this.trayIcon = trayIcon;
|
|
||||||
if (this.trayIcon) {
|
if (this.trayIcon) {
|
||||||
this._setSummaryIcon(this.trayIcon);
|
// Try again finding the app, using the WM_CLASS from the tray icon
|
||||||
this.useNotificationIcon = false;
|
this._setSummaryIcon(this.trayIcon);
|
||||||
|
this.useNotificationIcon = false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -588,7 +592,7 @@ const Source = new Lang.Class({
|
|||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
_getApp: function() {
|
_getApp: function(appId) {
|
||||||
let app;
|
let app;
|
||||||
|
|
||||||
app = Shell.WindowTracker.get_default().get_app_from_pid(this.pid);
|
app = Shell.WindowTracker.get_default().get_app_from_pid(this.pid);
|
||||||
@ -596,7 +600,13 @@ const Source = new Lang.Class({
|
|||||||
return app;
|
return app;
|
||||||
|
|
||||||
if (this.trayIcon) {
|
if (this.trayIcon) {
|
||||||
app = Shell.AppSystem.get_default().lookup_wmclass(this.trayIcon.wmclass);
|
app = Shell.AppSystem.get_default().lookup_wmclass(this.trayIcon.wm_class);
|
||||||
|
if (app != null)
|
||||||
|
return app;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (appId) {
|
||||||
|
app = Shell.AppSystem.get_default().lookup_app(appId + '.desktop');
|
||||||
if (app != null)
|
if (app != null)
|
||||||
return app;
|
return app;
|
||||||
}
|
}
|
||||||
@ -604,11 +614,11 @@ const Source = new Lang.Class({
|
|||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
|
|
||||||
_setApp: function() {
|
_setApp: function(appId) {
|
||||||
if (this.app)
|
if (this.app)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this.app = this._getApp();
|
this.app = this._getApp(appId);
|
||||||
if (!this.app)
|
if (!this.app)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user