diff --git a/js/ui/components/telepathyClient.js b/js/ui/components/telepathyClient.js index 42317065e..26e19edf2 100644 --- a/js/ui/components/telepathyClient.js +++ b/js/ui/components/telepathyClient.js @@ -527,33 +527,32 @@ const ChatSource = new Lang.Class({ }, createSecondaryIcon: function() { - let iconBox = new St.Bin(); - iconBox.child = new St.Icon({ style_class: 'secondary-icon' }); + let iconName; let presenceType = this._contact.get_presence_type(); switch (presenceType) { case Tp.ConnectionPresenceType.AVAILABLE: - iconBox.child.icon_name = 'user-available'; + iconName = 'user-available'; break; case Tp.ConnectionPresenceType.BUSY: - iconBox.child.icon_name = 'user-busy'; + iconName = 'user-busy'; break; case Tp.ConnectionPresenceType.OFFLINE: - iconBox.child.icon_name = 'user-offline'; + iconName = 'user-offline'; break; case Tp.ConnectionPresenceType.HIDDEN: - iconBox.child.icon_name = 'user-invisible'; + iconName = 'user-invisible'; break; case Tp.ConnectionPresenceType.AWAY: - iconBox.child.icon_name = 'user-away'; + iconName = 'user-away'; break; case Tp.ConnectionPresenceType.EXTENDED_AWAY: - iconBox.child.icon_name = 'user-idle'; + iconName = 'user-idle'; break; default: - iconBox.child.icon_name = 'user-offline'; + iconName = 'user-offline'; } - return iconBox; + return new Gio.ThemedIcon({ name: iconName }); }, _updateAvatarIcon: function() { @@ -733,7 +732,7 @@ const ChatSource = new Lang.Class({ title = GLib.markup_escape_text(this.title, -1); - this._notification.update(this._notification.title, null, { customContent: true, secondaryIcon: this.createSecondaryIcon() }); + this._notification.update(this._notification.title, null, { customContent: true, secondaryGIcon: this.createSecondaryIcon() }); if (message) msg += ' (' + GLib.markup_escape_text(message, -1) + ')'; @@ -761,7 +760,7 @@ const ChatNotification = new Lang.Class({ Extends: MessageTray.Notification, _init: function(source) { - this.parent(source, source.title, null, { customContent: true, secondaryIcon: source.createSecondaryIcon() }); + this.parent(source, source.title, null, { customContent: true, secondaryGIcon: source.createSecondaryIcon() }); this.setResident(true); this._responseEntry = new St.Entry({ style_class: 'chat-response', diff --git a/js/ui/messageTray.js b/js/ui/messageTray.js index 40d5ee062..c41b492f9 100644 --- a/js/ui/messageTray.js +++ b/js/ui/messageTray.js @@ -35,8 +35,6 @@ const LONGER_SUMMARY_TIMEOUT = 4; const HIDE_TIMEOUT = 0.2; const LONGER_HIDE_TIMEOUT = 0.6; -const NOTIFICATION_ICON_SIZE = 24; - // We delay hiding of the tray if the mouse is within MOUSE_LEFT_ACTOR_THRESHOLD // range from the point where it left the tray. const MOUSE_LEFT_ACTOR_THRESHOLD = 20; @@ -291,9 +289,12 @@ function makeCloseButton() { // If @params contains a 'body' parameter, then that text will be added to // the content area (as with addBody()). // -// By default, the icon shown is created by calling -// source.createIcon(). However, if @params contains an 'icon' -// parameter, the passed in icon will be used. +// By default, the icon shown is the same as the source's. +// However, if @params contains a 'gicon' parameter, the passed in gicon +// will be used. +// +// You can add a secondary icon to the banner with 'secondaryGIcon'. There +// is no fallback for this icon. // // If @params contains a 'titleMarkup', 'bannerMarkup', or // 'bodyMarkup' parameter with the value %true, then the corresponding @@ -308,6 +309,8 @@ function makeCloseButton() { const Notification = new Lang.Class({ Name: 'Notification', + ICON_SIZE: 24, + IMAGE_SIZE: 125, _init: function(source, title, banner, params) { @@ -391,8 +394,8 @@ const Notification = new Lang.Class({ update: function(title, banner, params) { params = Params.parse(params, { customContent: false, body: null, - icon: null, - secondaryIcon: null, + gicon: null, + secondaryGIcon: null, titleMarkup: false, bannerMarkup: false, bodyMarkup: false, @@ -402,12 +405,12 @@ const Notification = new Lang.Class({ let oldFocus = global.stage.key_focus; - if (this._icon && (params.icon || params.clear)) { + if (this._icon && (params.gicon || params.clear)) { this._icon.destroy(); this._icon = null; } - if (this._secondaryIcon && (params.secondaryIcon || params.clear)) { + if (this._secondaryIcon && (params.secondaryGIcon || params.clear)) { this._secondaryIcon.destroy(); this._secondaryIcon = null; } @@ -437,8 +440,14 @@ const Notification = new Lang.Class({ if (!this._scrollArea && !this._actionArea && !this._imageBin) this._table.remove_style_class_name('multi-line-notification'); - if (!this._icon) { - this._icon = params.icon || this.source.createIcon(NOTIFICATION_ICON_SIZE); + if (params.gicon) { + this._icon = new St.Icon({ gicon: params.gicon, + icon_size: this.ICON_SIZE }); + } else { + this._icon = this.source.createIcon(this.ICON_SIZE); + } + + if (this._icon) { this._table.add(this._icon, { row: 0, col: 0, x_expand: false, @@ -447,11 +456,10 @@ const Notification = new Lang.Class({ y_align: St.Align.START }); } - if (!this._secondaryIcon) { - this._secondaryIcon = params.secondaryIcon; - - if (this._secondaryIcon) - this._bannerBox.add_actor(this._secondaryIcon); + if (params.secondaryGIcon) { + this._secondaryIcon = new St.Icon({ gicon: params.secondaryGIcon, + style_class: 'secondary-icon' }); + this._bannerBox.add_actor(this._secondaryIcon); } this.title = title; diff --git a/js/ui/notificationDaemon.js b/js/ui/notificationDaemon.js index 6d2fd6d89..ff421f6b5 100644 --- a/js/ui/notificationDaemon.js +++ b/js/ui/notificationDaemon.js @@ -356,12 +356,10 @@ const NotificationDaemon = new Lang.Class({ ndata.actions, ndata.hints, ndata.notification]; let gicon = this._iconForNotificationData(icon, hints); - let iconActor = new St.Icon({ gicon: gicon, - icon_size: MessageTray.NOTIFICATION_ICON_SIZE }); if (notification == null) { notification = new MessageTray.Notification(source, summary, body, - { icon: iconActor, + { gicon: gicon, bannerMarkup: true }); ndata.notification = notification; notification.connect('destroy', Lang.bind(this, @@ -386,7 +384,7 @@ const NotificationDaemon = new Lang.Class({ this._emitActionInvoked(ndata.id, actionId); })); } else { - notification.update(summary, body, { icon: iconActor, + notification.update(summary, body, { gicon: gicon, bannerMarkup: true, clear: true }); } diff --git a/js/ui/status/network.js b/js/ui/status/network.js index 4e4e155ce..ce46e5a59 100644 --- a/js/ui/status/network.js +++ b/js/ui/status/network.js @@ -1747,10 +1747,9 @@ const NMApplet = new Lang.Class({ or this._source will be cleared */ this._ensureSource(); - let icon = new St.Icon({ icon_name: iconName, - icon_size: MessageTray.NOTIFICATION_ICON_SIZE }); + let gicon = new Gio.ThemedIcon({ name: iconName }); device._notification = new MessageTray.Notification(this._source, title, text, - { icon: icon }); + { gicon: gicon }); device._notification.setUrgency(urgency); device._notification.setTransient(true); device._notification.connect('destroy', function() {