[gnome-shell/gnome-3-34] allView, frequentView: Only create icons when necessary



commit d08cd1f523b809a5e955e73128afe6766bb3263d
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Thu Nov 21 17:57:17 2019 -0300

    allView, frequentView: Only create icons when necessary
    
    The views (AllView and FrequentView) build a list of all applications
    they contain. BaseView then diffs between what's currently added, and
    what needs to be added, and removed.
    
    This approach has a problem though: creating an AppIcon or a FolderIcon
    connects to various signals, and we confuse the garbage collector.
    
    When building the list of applications, instead of always creating new
    icons, try to use already existing icons first.
    
    Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/1610
    Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/1694

 js/ui/appDisplay.js | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)
---
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
index cc946f01c7..917532b8c1 100644
--- a/js/ui/appDisplay.js
+++ b/js/ui/appDisplay.js
@@ -463,10 +463,15 @@ var AllView = class AllView extends BaseAppView {
         let favoritesWritable = global.settings.is_writable('favorite-apps');
 
         apps.forEach(appId => {
-            let app = appSys.lookup_app(appId);
+            let icon = this._items[appId];
+            if (!icon) {
+                let app = appSys.lookup_app(appId);
+
+                icon = new AppIcon(app, {
+                    isDraggable: favoritesWritable,
+                });
+            }
 
-            let icon = new AppIcon(app,
-                                   { isDraggable: favoritesWritable });
             newApps.push(icon);
         });
 
@@ -918,8 +923,12 @@ var FrequentView = class FrequentView extends BaseAppView {
         for (let i = 0; i < mostUsed.length; i++) {
             if (!mostUsed[i].get_app_info().should_show())
                 continue;
-            let appIcon = new AppIcon(mostUsed[i],
-                                      { isDraggable: favoritesWritable });
+            let appIcon = this._items[mostUsed[i].get_id()];
+            if (!appIcon) {
+                appIcon = new AppIcon(mostUsed[i], {
+                    isDraggable: favoritesWritable,
+                });
+            }
             apps.push(appIcon);
         }
 


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