[gnome-shell] userMenu: Don't update the presence icon immediately



commit f1ca96bbf0c56a5eaa135c777045bddb4290cebe
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Sat Sep 1 19:15:42 2012 -0300

    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 5c4a0b2..2e14c22 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 0476375..1cad7c8 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 bb3e1a5..ab35089 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');



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]