[gnome-shell/wip/carlosg/less-get-all-calls: 59/61] appDisplay: Reduce g_app_info_get_all() calls
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell/wip/carlosg/less-get-all-calls: 59/61] appDisplay: Reduce g_app_info_get_all() calls
- Date: Sat, 26 Jan 2019 13:32:49 +0000 (UTC)
commit aa7abc5446f43e701bbc9d0d331fe9d4065f7c38
Author: Carlos Garnacho <carlosg gnome org>
Date: Mon Dec 3 13:18:19 2018 +0100
appDisplay: Reduce g_app_info_get_all() calls
Whenever the AllView needs (re)populating, we used to do one general
g_app_info_get_all() to get all GAppInfo, plus one per app folder in order
to check the ones that fall within that category. This calls results in a
fair amount of I/O blocking the main loop.
In order to ease this, keep the GAppInfo list around in AllView, and make
the AppFolders use it when figuring out the contained apps. Since reloading
the AllView results in AppFolders regenerated from scratch, the app info
list is ensured to be up-to-date for any later change within the AppFolder
(eg. through the GSettings key changing).
As the list was already filtered in the first place, we can also remove
the try{}catch() in AppFolder in order to discard desktop files with
invalid encoding.
Related: https://gitlab.gnome.org/GNOME/gnome-shell/issues/832
js/ui/appDisplay.js | 25 +++++++++++++++----------
1 file changed, 15 insertions(+), 10 deletions(-)
---
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
index 8b9429762..92d7c4fec 100644
--- a/js/ui/appDisplay.js
+++ b/js/ui/appDisplay.js
@@ -487,15 +487,21 @@ var AllView = class AllView extends BaseAppView {
});
}
+ _getAppInfoList() {
+ return this._appInfoList;
+ },
+
_loadApps() {
- let apps = Gio.AppInfo.get_all().filter(appInfo => {
+ this._appInfoList = Gio.AppInfo.get_all().filter(appInfo => {
try {
let id = appInfo.get_id(); // catch invalid file encodings
} catch(e) {
return false;
}
return appInfo.should_show();
- }).map(app => app.get_id());
+ });
+
+ let apps = this._appInfoList.map(app => app.get_id());
let appSys = Shell.AppSystem.get_default();
@@ -1254,8 +1260,10 @@ var FolderIcon = class FolderIcon {
this._popup.popdown();
});
- this._folder.connect('changed', this._redisplay.bind(this));
- this._redisplay();
+ this._folder.connect('changed', () => {
+ this._redisplay(this._parentView._getAppInfoList());
+ });
+ this._redisplay(this._parentView._getAppInfoList());
}
getAppIds() {
@@ -1272,7 +1280,7 @@ var FolderIcon = class FolderIcon {
this.emit('name-changed');
}
- _redisplay() {
+ _redisplay(appInfoList) {
this._updateName();
this.view.removeAll();
@@ -1298,15 +1306,12 @@ var FolderIcon = class FolderIcon {
folderApps.forEach(addAppId);
let folderCategories = this._folder.get_strv('categories');
- Gio.AppInfo.get_all().forEach(appInfo => {
+ appInfoList.forEach(appInfo => {
let appCategories = _getCategories(appInfo);
if (!_listsIntersect(folderCategories, appCategories))
return;
- try {
- addAppId(appInfo.get_id()); // catch invalid file encodings
- } catch(e) {
- }
+ addAppId(appInfo.get_id());
});
this.actor.visible = this.view.getAllItems().length > 0;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]