[gnome-shell/gbsneto/dont-create-so-many-icons-pretty-please: 2/6] allView, frequentView: Only create icons when necessary
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell/gbsneto/dont-create-so-many-icons-pretty-please: 2/6] allView, frequentView: Only create icons when necessary
- Date: Thu, 21 Nov 2019 22:29:08 +0000 (UTC)
commit 910037f014355ee9680c45f82a4aac2891c4074f
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 9a7b645214..838fef6077 100644
--- a/js/ui/appDisplay.js
+++ b/js/ui/appDisplay.js
@@ -491,10 +491,15 @@ var AllView = GObject.registerClass({
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);
});
@@ -947,8 +952,12 @@ 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]