diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js index 5d845e635..28c820c8f 100644 --- a/js/ui/appDisplay.js +++ b/js/ui/appDisplay.js @@ -312,13 +312,18 @@ const AppSearchProvider = new Lang.Class({ this._appSys = Shell.AppSystem.get_default(); }, - getResultMeta: function(app) { - return { 'id': app, - 'name': app.get_name(), - 'createIcon': function(size) { - return app.create_icon_texture(size); - } - }; + getResultMetas: function(apps) { + let metas = []; + for (let i = 0; i < apps.length; i++) { + let app = apps[i]; + metas.push({ 'id': app, + 'name': app.get_name(), + 'createIcon': function(size) { + return app.create_icon_texture(size); + } + }); + } + return metas; }, getInitialResultSet: function(terms) { @@ -369,13 +374,18 @@ const SettingsSearchProvider = new Lang.Class({ this._gnomecc = this._appSys.lookup_app('gnome-control-center.desktop'); }, - getResultMeta: function(pref) { - return { 'id': pref, - 'name': pref.get_name(), - 'createIcon': function(size) { - return pref.create_icon_texture(size); - } - }; + getResultMetas: function(prefs) { + let metas = []; + for (let i = 0; i < prefs.length; i++) { + let pref = prefs[i]; + metas.push({ 'id': pref, + 'name': pref.get_name(), + 'createIcon': function(size) { + return pref.create_icon_texture(size); + } + }); + } + return metas; }, getInitialResultSet: function(terms) { diff --git a/js/ui/contactDisplay.js b/js/ui/contactDisplay.js index ed213d411..e501d801c 100644 --- a/js/ui/contactDisplay.js +++ b/js/ui/contactDisplay.js @@ -149,14 +149,18 @@ const ContactSearchProvider = new Lang.Class({ this._contactSys = Shell.ContactSystem.get_default(); }, - getResultMeta: function(id) { - let contact = new Contact(id); - return { 'id': id, - 'name': contact.alias, - 'createIcon': function(size) { - return contact.createIcon(size); - } - }; + getResultMetas: function(ids) { + let metas = []; + for (let i = 0; i < ids.length; i++) { + let contact = new Contact(ids[i]); + metas.push({ 'id': ids[i], + 'name': contact.alias, + 'createIcon': function(size) { + return contact.createIcon(size); + } + }); + } + return metas; }, getInitialResultSet: function(terms) { diff --git a/js/ui/docDisplay.js b/js/ui/docDisplay.js index b331d0365..dc840dafe 100644 --- a/js/ui/docDisplay.js +++ b/js/ui/docDisplay.js @@ -14,16 +14,21 @@ const DocSearchProvider = new Lang.Class({ this._docManager = DocInfo.getDocManager(); }, - getResultMeta: function(resultId) { - let docInfo = this._docManager.lookupByUri(resultId); - if (!docInfo) - return null; - return { 'id': resultId, - 'name': docInfo.name, - 'createIcon': function(size) { - return docInfo.createIcon(size); - } - }; + getResultMetas: function(resultIds) { + let metas = []; + for (let i = 0; i < resultIds.length; i++) { + let docInfo = this._docManager.lookupByUri(resultIds[i]); + if (!docInfo) + metas.push(null); + else + metas.push({ 'id': resultIds[i], + 'name': docInfo.name, + 'createIcon': function(size) { + return docInfo.createIcon(size); + } + }); + } + return metas; }, activateResult: function(id, params) { diff --git a/js/ui/placeDisplay.js b/js/ui/placeDisplay.js index 334cdab97..9c1352c40 100644 --- a/js/ui/placeDisplay.js +++ b/js/ui/placeDisplay.js @@ -367,16 +367,21 @@ const PlaceSearchProvider = new Lang.Class({ this.parent(_("PLACES & DEVICES")); }, - getResultMeta: function(resultId) { - let placeInfo = Main.placesManager.lookupPlaceById(resultId); - if (!placeInfo) - return null; - return { 'id': resultId, - 'name': placeInfo.name, - 'createIcon': function(size) { - return placeInfo.iconFactory(size); - } - }; + getResultMetas: function(resultIds) { + let metas = []; + for (let i = 0; i < resultIds.length; i++) { + let placeInfo = Main.placesManager.lookupPlaceById(resultIds[i]); + if (!placeInfo) + metas.push(null); + else + metas.push({ 'id': resultIds[i], + 'name': placeInfo.name, + 'createIcon': function(size) { + return placeInfo.iconFactory(size); + } + }); + } + return metas; }, activateResult: function(id, params) { diff --git a/js/ui/search.js b/js/ui/search.js index 52cd7a86a..86173c67e 100644 --- a/js/ui/search.js +++ b/js/ui/search.js @@ -190,14 +190,14 @@ const SearchProvider = new Lang.Class({ }, /** - * getResultMeta: - * @id: Result identifier string + * getResultMetas: + * @ids: Result identifier strings * - * Return an object with 'id', 'name', (both strings) and 'createIcon' - * (function(size) returning a Clutter.Texture) properties which describe - * the given search result. + * Return an array of objects with 'id', 'name', (both strings) and + * 'createIcon' (function(size) returning a Clutter.Texture) properties + * with the same number of members as @ids */ - getResultMeta: function(id) { + getResultMetas: function(ids) { throw new Error('Not implemented'); }, diff --git a/js/ui/searchDisplay.js b/js/ui/searchDisplay.js index 57478b76f..85a063150 100644 --- a/js/ui/searchDisplay.js +++ b/js/ui/searchDisplay.js @@ -126,10 +126,13 @@ const GridSearchResults = new Lang.Class({ let canDisplay = this._grid.childrenInRow(this._width) * MAX_SEARCH_RESULTS_ROWS - this._grid.visibleItemsCount(); - for (let i = Math.min(this._notDisplayedResult.length, canDisplay); i > 0; i--) { - let result = this._notDisplayedResult.shift(); - let meta = this.provider.getResultMeta(result); - let display = new SearchResult(this.provider, meta, this._terms); + let numResults = Math.min(this._notDisplayedResult.length, canDisplay); + if (numResults == 0) + return; + let results = this._notDisplayedResult.splice(0, numResults); + let metas = this.provider.getResultMetas(results); + for (let i = 0; i < metas.length; i++) { + let display = new SearchResult(this.provider, metas[i], this._terms); this._grid.addItem(display.actor); } }, diff --git a/js/ui/wanda.js b/js/ui/wanda.js index 9deb448fb..632b251ac 100644 --- a/js/ui/wanda.js +++ b/js/ui/wanda.js @@ -168,22 +168,23 @@ const WandaSearchProvider = new Lang.Class({ this.parent(_("Your favorite Easter Egg")); }, - getResultMeta: function(fish) { - return { 'id': fish, - 'name': capitalize(fish), - 'createIcon': function(iconSize) { - // for DND only (maybe could be improved) - // DON'T use St.Icon here, it crashes the shell - // (dnd.js code assumes it can query the actor size - // without parenting it, while StWidget accesses - // StThemeNode in get_preferred_width/height, which - // triggers an assertion failure) - return St.TextureCache.get_default().load_icon_name(null, - 'face-smile', - St.IconType.FULLCOLOR, - iconSize); - } - }; + getResultMetas: function(fish) { + return [{ 'id': fish[0], // there may be many fish in the sea, but + // only one which speaks the truth! + 'name': capitalize(fish[0]), + 'createIcon': function(iconSize) { + // for DND only (maybe could be improved) + // DON'T use St.Icon here, it crashes the shell + // (dnd.js code assumes it can query the actor size + // without parenting it, while StWidget accesses + // StThemeNode in get_preferred_width/height, which + // triggers an assertion failure) + return St.TextureCache.get_default().load_icon_name(null, + 'face-smile', + St.IconType.FULLCOLOR, + iconSize); + } + }]; }, getInitialResultSet: function(terms) {