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:
Giovanni Campagna 2012-11-04 01:53:43 +01:00
parent b150869b51
commit 4dc5bac72f

View File

@ -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,14 +539,8 @@ 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) {
// Try again finding the app, using the WM_CLASS from the tray icon
this._setSummaryIcon(this.trayIcon); this._setSummaryIcon(this.trayIcon);
this.useNotificationIcon = false; 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;