[gnome-shell] Only do redisplay when mapped



commit 94bd6f17180f0a8cbdbf2a66a47469fce601a9e1
Author: Colin Walters <walters verbum org>
Date:   Sat Oct 24 12:43:56 2009 -0400

    Only do redisplay when mapped
    
    If we're not mapped, only queue up a redisplay.  This avoids
    e.g. changes in recent documents such as saving a file in GEdit
    causing a lot of blocking I/O in the shell (we need to make
    recent loading async as well).
    
    https://bugzilla.gnome.org/show_bug.cgi?id=599560

 js/ui/genericDisplay.js |   18 +++++++++++++++++-
 1 files changed, 17 insertions(+), 1 deletions(-)
---
diff --git a/js/ui/genericDisplay.js b/js/ui/genericDisplay.js
index 9dafd33..4744669 100644
--- a/js/ui/genericDisplay.js
+++ b/js/ui/genericDisplay.js
@@ -314,7 +314,7 @@ GenericDisplayItem.prototype = {
         // For some reason, we are not getting leave-event signal when we are dragging an item,
         // so we should remove the link manually.
         this._informationButton.actor.hide();
-    } 
+    }
 };
 
 Signals.addSignalMethods(GenericDisplayItem.prototype);
@@ -342,6 +342,9 @@ GenericDisplay.prototype = {
             this._updateDisplayControl(false);
         }));
 
+        this._pendingRedisplay = RedisplayFlags.NONE;
+        this._list.connect('notify::mapped', Lang.bind(this, this._onMappedNotify));
+
         // map<itemId, Object> where Object represents the item info
         this._allItems = {};
         // set<itemId>
@@ -642,6 +645,11 @@ GenericDisplay.prototype = {
      *  FULL - Indicates that we need recreate all displayed items; implies RESET_CONTROLS as well
      */
     _redisplay: function(flags) {
+        if (!this._list.mapped) {
+            this._pendingRedisplay |= flags;
+            return;
+        }
+
         let isSubSearch = (flags & RedisplayFlags.SUBSEARCH) > 0;
         let fullReload = (flags & RedisplayFlags.FULL) > 0;
         let resetPage = (flags & RedisplayFlags.RESET_CONTROLS) > 0 || fullReload;
@@ -852,6 +860,14 @@ GenericDisplay.prototype = {
         let item = this._findDisplayedByIndex(index);
         item.markSelected(true);
         this.emit('selected');
+    },
+
+    _onMappedNotify: function () {
+        let mapped = this._list.mapped;
+        if (mapped && this._pendingRedisplay > RedisplayFlags.NONE)
+            this._redisplay(this._pendingRedisplay);
+
+        this._pendingRedisplay = RedisplayFlags.NONE;
     }
 };
 



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