diff options
author | Florian Müllner <fmuellner@gnome.org> | 2020-11-19 04:04:14 +0100 |
---|---|---|
committer | Florian Müllner <fmuellner@gnome.org> | 2020-11-20 23:04:37 +0100 |
commit | da50277fbbf21b07dff055818c9829543d64048c (patch) | |
tree | 86ea172f6c51e7b05397e54dcf3d35c69cf25d9c | |
parent | 44ad9e7212bb027491e57d6ec55e20bca7543da1 (diff) | |
download | gnome-shell-wip/fmuellner/appstream-mappings.tar.gz |
appDisplay/pageManager: Update layout when apps are renamedwip/fmuellner/appstream-mappings
Now that the app picker uses custom, user-defined positioning, it
makes sense to pick up renamed app IDs like we do for favorites.
-rw-r--r-- | js/ui/appDisplay.js | 52 |
1 files changed, 50 insertions, 2 deletions
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js index 322aa3cd7..c07a162a6 100644 --- a/js/ui/appDisplay.js +++ b/js/ui/appDisplay.js @@ -1,8 +1,8 @@ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- /* exported AppDisplay, AppSearchProvider */ -const { Clutter, Gio, GLib, GObject, Graphene, Meta, - Pango, Shell, St } = imports.gi; +const { AppStreamGlib: AppStream, Clutter, Gio, GLib, GObject, Graphene, + Meta, Pango, Shell, St } = imports.gi; const Signals = imports.signals; const AppFavorites = imports.ui.appFavorites; @@ -19,6 +19,8 @@ const SwipeTracker = imports.ui.swipeTracker; const Params = imports.misc.params; const SystemActions = imports.misc.systemActions; +Gio._promisify(AppStream.Store.prototype, 'load_async', 'load_finish'); + var MENU_POPUP_TIMEOUT = 600; var POPDOWN_DIALOG_TIMEOUT = 500; @@ -867,6 +869,52 @@ var PageManager = GObject.registerClass({ global.settings.connect('changed::app-picker-layout', this._loadPages.bind(this)); + + this._appDataStore = new AppStream.Store(); + this._appDataStore.connect('changed', + this._updateAppIds.bind(this)); + this._loadAppDataStore(); + } + + async _loadAppDataStore() { + try { + const loadFlags = + AppStream.StoreLoadFlags.APP_INFO_SYSTEM | + AppStream.StoreLoadFlags.APP_INFO_USER | + AppStream.StoreLoadFlags.FLATPAK_SYSTEM | + AppStream.StoreLoadFlags.FLATPAK_USER | + AppStream.StoreLoadFlags.APPDATA | + AppStream.StoreLoadFlags.DESKTOP; + // emits ::changed if successful + await this._appDataStore.load_async(loadFlags, null); + } catch (e) { + log('Failed to load AppData store: %s'.format(e.message)); + } + } + + _updateAppIds() { + const store = this._appDataStore; + + let updated = false; + for (let pageIndex = 0; pageIndex < this._pages.length; pageIndex++) { + const pageData = this._pages[pageIndex]; + + for (const appId of Object.keys(pageData)) { + const appData = + store.get_app_by_id_with_fallbacks(appId) || + store.get_app_by_provide(AppStream.ProvideKind.ID, appId); + const newId = appData?.get_id(); + + if (newId && newId !== appId) { + pageData[newId] = pageData[appId]; + delete pageData[appId]; + updated = true; + } + } + } + + if (updated) + this.pages = this._pages; } _loadPages() { |