diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js index 6edf03c40..6ffe58b6c 100644 --- a/js/ui/appDisplay.js +++ b/js/ui/appDisplay.js @@ -2035,6 +2035,7 @@ var AppFolderPopup = GObject.registerClass({ var AppIcon = GObject.registerClass({ GTypeName: 'AppDisplay_AppIcon', + Implements: [Search.SearchResultInterface], Signals: { 'menu-state-changed': { param_types: [GObject.TYPE_BOOLEAN] }, 'sync-tooltip': {}, diff --git a/js/ui/search.js b/js/ui/search.js index 7e7645a3d..169ceab8a 100644 --- a/js/ui/search.js +++ b/js/ui/search.js @@ -1,5 +1,5 @@ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- -/* exported SearchResultsView */ +/* exported SearchResultsView, SearchResultInterface */ const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi; @@ -32,8 +32,17 @@ class MaxWidthBox extends St.BoxLayout { } }); -var SearchResult = GObject.registerClass( -class SearchResult extends St.Button { +var SearchResultInterface = GObject.registerClass({ + Requires: [Clutter.Actor], +}, class SearchResultInterface extends GObject.Interface { + activate() { + throw new GObject.NotImplementedError('activate in %s'.format(this.constructor.name)); + } +}); + +var SearchResult = GObject.registerClass({ + Implements: [SearchResultInterface] +}, class SearchResult extends St.Button { _init(provider, metaInfo, resultsView) { this.provider = provider; this.metaInfo = metaInfo; @@ -242,6 +251,8 @@ var SearchResultsBase = GObject.registerClass({ metasNeeded.forEach((resultId, i) => { let meta = metas[i]; let display = this._createResultDisplay(meta); + if (!(display instanceof SearchResultInterface)) + throw new Error(`${display} is not a valid search result`); display.connect('key-focus-in', this._keyFocusIn.bind(this)); this._resultDisplays[resultId] = display; });