From 5991c8dca35829907864bdbccff8f301dcc51c06 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Mon, 23 Jul 2012 01:07:51 -0300 Subject: [PATCH] messageTray: Hook SourceActor up to source icon changes automatically Instead of manually tracking source icon changes, or requiring a manual call to _setSummaryIcon, add a way to emit a signal when we're guaranteed the icon has been changed, and then the source actor will automatically update the icon. _setSummaryIcon is still available for sources such as the notification daemon, that require special treatment for the summary icon (to be used with tray icons) https://bugzilla.gnome.org/show_bug.cgi?id=680426 --- js/ui/messageTray.js | 34 ++++++++++++++++++++++++---------- js/ui/notificationDaemon.js | 5 +++-- js/ui/screenShield.js | 2 -- js/ui/telepathyClient.js | 2 +- 4 files changed, 28 insertions(+), 15 deletions(-) diff --git a/js/ui/messageTray.js b/js/ui/messageTray.js index 2a736b68b..e135506a5 100644 --- a/js/ui/messageTray.js +++ b/js/ui/messageTray.js @@ -1042,6 +1042,7 @@ const SourceActor = new Lang.Class({ _init: function(source, size) { this._source = source; + this._size = size; this.actor = new Shell.GenericContainer(); this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth)); @@ -1067,10 +1068,14 @@ const SourceActor = new Lang.Class({ this._source.connect('count-updated', Lang.bind(this, this._updateCount)); this._updateCount(); + + this._source.connect('icon-updated', Lang.bind(this, this._updateIcon)); + this._updateIcon(); }, setIcon: function(icon) { this._iconBin.child = icon; + this._iconSet = true; }, _getPreferredWidth: function (actor, forHeight, alloc) { @@ -1108,13 +1113,21 @@ const SourceActor = new Lang.Class({ this._counterBin.allocate(childBox, flags); }, + _updateIcon: function() { + if (this._actorDestroyed) + return; + + if (!this._iconSet) + this._iconBin.child = this._source.createIcon(this._size); + }, + _updateCount: function() { if (this._actorDestroyed) return; this._counterBin.visible = this._source.countVisible; this._counterLabel.set_text(this._source.count.toString()); - }, + } }); const Source = new Lang.Class({ @@ -1175,16 +1188,12 @@ const Source = new Lang.Class({ icon_size: size }); }, - _ensureMainIcon: function(icon) { + _ensureMainIcon: function() { if (this._mainIcon) - return false; - - if (!icon) - icon = this.createIcon(this.ICON_SIZE); + return; this._mainIcon = new SourceActor(this, this.ICON_SIZE); - this._mainIcon.setIcon(icon); - return true; + return; }, // Unlike createIcon, this always returns the same actor; @@ -1236,10 +1245,15 @@ const Source = new Lang.Class({ return false; }, + iconUpdated: function() { + this.emit('icon-updated'); + }, + //// Protected methods //// _setSummaryIcon: function(icon) { - if (!this._ensureMainIcon(icon)) - this._mainIcon.setIcon(icon); + this._ensureMainIcon(); + this._mainIcon.setIcon(icon); + this.iconUpdated(); }, open: function(notification) { diff --git a/js/ui/notificationDaemon.js b/js/ui/notificationDaemon.js index 0eee59b87..6b1d80be8 100644 --- a/js/ui/notificationDaemon.js +++ b/js/ui/notificationDaemon.js @@ -557,7 +557,8 @@ const Source = new Lang.Class({ processNotification: function(notification, gicon) { if (gicon) this._gicon = gicon; - this._setSummaryIcon(this.createIcon(this.ICON_SIZE)); + if (!this.trayIcon) + this.iconUpdated(); let tracker = Shell.WindowTracker.get_default(); if (notification.resident && this.app && tracker.focus_app == this.app) @@ -625,7 +626,7 @@ const Source = new Lang.Class({ // notification-based icons (ie, not a trayicon) or if it was unset before if (!this.trayIcon) { this.useNotificationIcon = false; - this._setSummaryIcon(this.createIcon(this.ICON_SIZE)); + this.iconUpdated(); } }, diff --git a/js/ui/screenShield.js b/js/ui/screenShield.js index abd68bd70..e82386314 100644 --- a/js/ui/screenShield.js +++ b/js/ui/screenShield.js @@ -140,9 +140,7 @@ const NotificationsBox = new Lang.Class({ _makeNotificationSource: function(source) { let box = new St.BoxLayout({ style_class: 'screen-shield-notification-source' }); - let iconClone = source.createIcon(SUMMARY_ICON_SIZE); let sourceActor = new MessageTray.SourceActor(source, SUMMARY_ICON_SIZE); - sourceActor.setIcon(iconClone); box.add(sourceActor.actor, { y_fill: true }); let textBox = new St.BoxLayout({ vertical: true }); diff --git a/js/ui/telepathyClient.js b/js/ui/telepathyClient.js index 0ea8e7f9c..ffa84dd44 100644 --- a/js/ui/telepathyClient.js +++ b/js/ui/telepathyClient.js @@ -536,7 +536,7 @@ const ChatSource = new Lang.Class({ }, _updateAvatarIcon: function() { - this._setSummaryIcon(this.createIcon(this.ICON_SIZE)); + this.iconUpdated(); this._notification.update(this._notification.title, null, { customContent: true }); },