From f1ca96bbf0c56a5eaa135c777045bddb4290cebe Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Sat, 1 Sep 2012 19:15:42 -0300 Subject: [PATCH] userMenu: Don't update the presence icon immediately If we don't freeze the presence icon, we can end up in a place where we'll be updating the icon before we fade out the panel indicators when coming back from the lock screen. https://bugzilla.gnome.org/show_bug.cgi?id=683156 --- js/ui/panel.js | 13 +++++++++++-- js/ui/panelMenu.js | 15 +++++++++++++++ js/ui/userMenu.js | 9 +++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/js/ui/panel.js b/js/ui/panel.js index 5c4a0b2e0..2e14c2277 100644 --- a/js/ui/panel.js +++ b/js/ui/panel.js @@ -1131,7 +1131,7 @@ const Panel = new Lang.Class({ }, _tweenAndUpdatePanel: function() { - this._closeIndicatorMenus(); + this._freezeAndCloseIndicators(); Tweener.addTween(this, { boxOpacity: 0, @@ -1140,6 +1140,7 @@ const Panel = new Lang.Class({ onCompleteScope: this, onComplete: function() { this._updatePanel(); + this._thawIndicators(); Tweener.addTween(this, { boxOpacity: 255, time: Overview.ANIMATION_TIME / 2, @@ -1153,13 +1154,21 @@ const Panel = new Lang.Class({ this._tweenAndUpdatePanel(); }, - _closeIndicatorMenus: function() { + _freezeAndCloseIndicators: function() { for (let role in this.statusArea) { let indicator = this.statusArea[role]; + indicator.freeze(); indicator.menu.close(); } }, + _thawIndicators: function() { + for (let role in this.statusArea) { + let indicator = this.statusArea[role]; + indicator.thaw(); + } + }, + _hideIndicators: function() { for (let role in PANEL_ITEM_IMPLEMENTATIONS) { let indicator = this.statusArea[role]; diff --git a/js/ui/panelMenu.js b/js/ui/panelMenu.js index 0476375f5..1cad7c894 100644 --- a/js/ui/panelMenu.js +++ b/js/ui/panelMenu.js @@ -113,6 +113,21 @@ const Button = new Lang.Class({ this.setMenu(new PopupMenu.PopupMenu(this.actor, menuAlignment, St.Side.TOP, 0)); this.setName(nameText); + this._frozenCount = 0; + }, + + freeze: function() { + this._frozenCount++; + }, + + thaw: function() { + this._frozenCount--; + if (this._frozenCount == 0) + this.emit('thawed'); + }, + + get frozen() { + return this._frozenCount > 0; }, setSensitive: function(sensitive) { diff --git a/js/ui/userMenu.js b/js/ui/userMenu.js index bb3e1a5d9..ab35089b6 100644 --- a/js/ui/userMenu.js +++ b/js/ui/userMenu.js @@ -574,6 +574,8 @@ const UserMenuButton = new Lang.Class({ Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated)); this._sessionUpdated(); + + this.connect('thawed', Lang.bind(this, this._onThawed)); }, _sessionUpdated: function() { @@ -666,6 +668,9 @@ const UserMenuButton = new Lang.Class({ }, _updatePresenceIcon: function(accountMgr, presence, status, message) { + if (this.frozen) + return; + if (Main.sessionMode.isLocked) this._iconBox.child = this._lockedIcon; else if (presence == Tp.ConnectionPresenceType.AVAILABLE) @@ -798,6 +803,10 @@ const UserMenuButton = new Lang.Class({ this._presence.status = status; }, + _onThawed: function() { + this._updatePresenceIcon(); + }, + _onMyAccountActivate: function() { Main.overview.hide(); let app = Shell.AppSystem.get_default().lookup_setting('gnome-user-accounts-panel.desktop');