notificationDaemon: Clean up icon/image handling
Make the logic for this clearer and easier to see. https://bugzilla.gnome.org/show_bug.cgi?id=680414
This commit is contained in:
parent
1bd349485f
commit
bd383888de
@ -139,15 +139,21 @@ const NotificationDaemon = new Lang.Class({
|
|||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
|
|
||||||
_iconForNotificationData: function(icon, hints) {
|
_fallbackIconForNotificationData: function(hints) {
|
||||||
// If an icon is not specified, we use 'image-data' or 'image-path' hint for an icon
|
let stockIcon;
|
||||||
// and don't show a large image. There are currently many applications that use
|
switch (hints.urgency) {
|
||||||
// notify_notification_set_icon_from_pixbuf() from libnotify, which in turn sets
|
case Urgency.LOW:
|
||||||
// the 'image-data' hint. These applications don't typically pass in 'app_icon'
|
case Urgency.NORMAL:
|
||||||
// argument to Notify() and actually expect the pixbuf to be shown as an icon.
|
stockIcon = 'gtk-dialog-info';
|
||||||
// So the logic here does the right thing for this case. If both an icon and either
|
break;
|
||||||
// one of 'image-data' or 'image-path' are specified, we show both an icon and
|
case Urgency.CRITICAL:
|
||||||
// a large image.
|
stockIcon = 'gtk-dialog-error';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return new Gio.ThemedIcon({ name: stockIcon });
|
||||||
|
},
|
||||||
|
|
||||||
|
_iconForNotificationData: function(icon) {
|
||||||
if (icon) {
|
if (icon) {
|
||||||
if (icon.substr(0, 7) == 'file://')
|
if (icon.substr(0, 7) == 'file://')
|
||||||
return new Gio.FileIcon({ file: Gio.File.new_for_uri(icon) });
|
return new Gio.FileIcon({ file: Gio.File.new_for_uri(icon) });
|
||||||
@ -155,21 +161,8 @@ const NotificationDaemon = new Lang.Class({
|
|||||||
return new Gio.FileIcon({ file: Gio.File.new_for_path(icon) });
|
return new Gio.FileIcon({ file: Gio.File.new_for_path(icon) });
|
||||||
else
|
else
|
||||||
return new Gio.ThemedIcon({ name: icon });
|
return new Gio.ThemedIcon({ name: icon });
|
||||||
} else if (hints['image-data'] || hints['image-path']) {
|
|
||||||
return this._imageForNotificationData(hints);
|
|
||||||
} else {
|
|
||||||
let stockIcon;
|
|
||||||
switch (hints.urgency) {
|
|
||||||
case Urgency.LOW:
|
|
||||||
case Urgency.NORMAL:
|
|
||||||
stockIcon = 'gtk-dialog-info';
|
|
||||||
break;
|
|
||||||
case Urgency.CRITICAL:
|
|
||||||
stockIcon = 'gtk-dialog-error';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return new Gio.ThemedIcon({ name: stockIcon });
|
|
||||||
}
|
}
|
||||||
|
return null;
|
||||||
},
|
},
|
||||||
|
|
||||||
_lookupSource: function(title, pid, trayIcon) {
|
_lookupSource: function(title, pid, trayIcon) {
|
||||||
@ -362,8 +355,6 @@ const NotificationDaemon = new Lang.Class({
|
|||||||
[ndata.id, ndata.icon, ndata.summary, ndata.body,
|
[ndata.id, ndata.icon, ndata.summary, ndata.body,
|
||||||
ndata.actions, ndata.hints, ndata.notification];
|
ndata.actions, ndata.hints, ndata.notification];
|
||||||
|
|
||||||
let gicon = this._iconForNotificationData(icon, hints);
|
|
||||||
|
|
||||||
if (notification == null) {
|
if (notification == null) {
|
||||||
notification = new MessageTray.Notification(source);
|
notification = new MessageTray.Notification(source);
|
||||||
ndata.notification = notification;
|
ndata.notification = notification;
|
||||||
@ -390,18 +381,32 @@ const NotificationDaemon = new Lang.Class({
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let gicon = this._iconForNotificationData(icon, hints);
|
||||||
|
let gimage = this._imageForNotificationData(hints);
|
||||||
|
|
||||||
|
let image = null;
|
||||||
|
|
||||||
|
// If an icon is not specified, we use 'image-data' or 'image-path' hint for an icon
|
||||||
|
// and don't show a large image. There are currently many applications that use
|
||||||
|
// notify_notification_set_icon_from_pixbuf() from libnotify, which in turn sets
|
||||||
|
// the 'image-data' hint. These applications don't typically pass in 'app_icon'
|
||||||
|
// argument to Notify() and actually expect the pixbuf to be shown as an icon.
|
||||||
|
// So the logic here does the right thing for this case. If both an icon and either
|
||||||
|
// one of 'image-data' or 'image-path' are specified, we show both an icon and
|
||||||
|
// a large image.
|
||||||
|
if (gicon && gimage)
|
||||||
|
image = new St.Icon({ gicon: gimage });
|
||||||
|
else if (!gicon && gimage)
|
||||||
|
gicon = gimage;
|
||||||
|
else if (!gicon)
|
||||||
|
gicon = this._fallbackIconForNotificationData(hints);
|
||||||
|
|
||||||
|
notification.setImage(image);
|
||||||
|
|
||||||
notification.update(summary, body, { gicon: gicon,
|
notification.update(summary, body, { gicon: gicon,
|
||||||
bannerMarkup: true,
|
bannerMarkup: true,
|
||||||
clear: true });
|
clear: true });
|
||||||
|
|
||||||
// We only display a large image if an icon is also specified.
|
|
||||||
let image;
|
|
||||||
if (icon && (hints['image-data'] || hints['image-path']))
|
|
||||||
image = new St.Icon({ gicon: this._imageForNotificationData(hints) });
|
|
||||||
else
|
|
||||||
image = null;
|
|
||||||
notification.setImage(image);
|
|
||||||
|
|
||||||
if (actions.length) {
|
if (actions.length) {
|
||||||
notification.setUseActionIcons(hints['action-icons'] == true);
|
notification.setUseActionIcons(hints['action-icons'] == true);
|
||||||
for (let i = 0; i < actions.length - 1; i += 2) {
|
for (let i = 0; i < actions.length - 1; i += 2) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user