From 7dafd25ef468e1de6f5cb2247c0225c6f8e41ada Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Thu, 24 Sep 2020 13:36:40 -0300 Subject: [PATCH] appDisplay: Don't emit 'apps-changed' when deleting folder To delete a folder, FolderView needs to reset all keys under that particular folder's GSettings path. That generates 5 'changed' signals, all of which end up calling AppDisplay._redisplay(), which is costly. Don't emit 'apps-changed' when deleting a folder. https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1447 --- js/ui/appDisplay.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js index 66a4557bb..8979d7e57 100644 --- a/js/ui/appDisplay.js +++ b/js/ui/appDisplay.js @@ -1639,6 +1639,7 @@ class FolderView extends BaseAppView { action.connect('pan', this._onPan.bind(this)); this._scrollView.add_action(action); + this._deletingFolder = false; this._appIds = []; this._redisplay(); } @@ -1809,6 +1810,8 @@ class FolderView extends BaseAppView { // Remove the folder if this is the last app icon; otherwise, // just remove the icon if (folderApps.length == 0) { + this._deletingFolder = true; + // Resetting all keys deletes the relocatable schema let keys = this._folder.settings_schema.list_keys(); for (const key of keys) @@ -1818,6 +1821,8 @@ class FolderView extends BaseAppView { let folders = settings.get_strv('folder-children'); folders.splice(folders.indexOf(this._id), 1); settings.set_strv('folder-children', folders); + + this._deletingFolder = false; } else { // If this is a categories-based folder, also add it to // the list of excluded apps @@ -1831,6 +1836,10 @@ class FolderView extends BaseAppView { this._folder.set_strv('apps', folderApps); } } + + get deletingFolder() { + return this._deletingFolder; + } }); var FolderIcon = GObject.registerClass({ @@ -1972,6 +1981,9 @@ var FolderIcon = GObject.registerClass({ } _sync() { + if (this.view.deletingFolder) + return; + this.emit('apps-changed'); this._updateName(); this.visible = this.view.getAllItems().length > 0;