diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-08 16:02:53 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-08 16:02:53 +0000 |
commit | 4d8b071804d73b7a733f2b7696fde40caf8800bb (patch) | |
tree | 86aefc1c0ea9c596bab0ecbc0c054a2378d6cd13 /extensions/44/vertical-workspaces/lib/search.js | |
parent | Updating 44/no-overview to version 44 [68db01d]. (diff) | |
download | gnome-shell-extensions-extra-4d8b071804d73b7a733f2b7696fde40caf8800bb.tar.xz gnome-shell-extensions-extra-4d8b071804d73b7a733f2b7696fde40caf8800bb.zip |
Updating 44/vertical-workspaces to version 37+20231208 [0d82192].
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'extensions/44/vertical-workspaces/lib/search.js')
-rw-r--r-- | extensions/44/vertical-workspaces/lib/search.js | 247 |
1 files changed, 182 insertions, 65 deletions
diff --git a/extensions/44/vertical-workspaces/lib/search.js b/extensions/44/vertical-workspaces/lib/search.js index 8540626..618c5ed 100644 --- a/extensions/44/vertical-workspaces/lib/search.js +++ b/extensions/44/vertical-workspaces/lib/search.js @@ -9,92 +9,137 @@ */ 'use strict'; -const { Shell, Gio, St, Clutter } = imports.gi; -const Main = imports.ui.main; + +const Clutter = imports.gi.Clutter; +const Shell = imports.gi.Shell; +const St = imports.gi.St; const AppDisplay = imports.ui.appDisplay; +const IconGrid = imports.ui.iconGrid; +const Main = imports.ui.main; const Search = imports.ui.search; -const Me = imports.misc.extensionUtils.getCurrentExtension(); -const _Util = Me.imports.lib.util; - -const _ = Me.imports.lib.settings._; -const shellVersion = _Util.shellVersion; - +let Me; +// gettext +let _; let opt; -let _overrides; -let _firstRun = true; + let SEARCH_MAX_WIDTH; -function update(reset = false) { - opt = Me.imports.lib.settings.opt; - const moduleEnabled = opt.get('searchModule', true); - reset = reset || !moduleEnabled; +var SearchModule = class { + constructor(me) { + Me = me; + opt = Me.opt; + _ = Me.gettext; - // don't even touch this module if disabled - if (_firstRun && reset) - return; + this._firstActivation = true; + this.moduleEnabled = false; + this._overrides = null; + } - _firstRun = false; + cleanGlobals() { + Me = null; + opt = null; + _ = null; + } - if (_overrides) - _overrides.removeAll(); + update(reset) { + this.moduleEnabled = opt.get('searchModule'); + const conflict = false; - _updateSearchViewWidth(reset); + reset = reset || !this.moduleEnabled || conflict; - if (reset) { - Main.overview._overview._controls.layoutManager._searchController.y_align = Clutter.ActorAlign.FILL; - opt = null; - _overrides = null; - return; + // don't touch the original code if module disabled + if (reset && !this._firstActivation) { + this._disableModule(); + } else if (!reset) { + this._firstActivation = false; + this._activateModule(); + } + if (reset && this._firstActivation) + console.debug(' SearchModule - Keeping untouched'); + } + + _activateModule() { + this._updateSearchViewWidth(); + + if (!this._overrides) + this._overrides = new Me.Util.Overrides(); + + this._overrides.addOverride('AppSearchProvider', AppDisplay.AppSearchProvider.prototype, AppSearchProvider); + this._overrides.addOverride('SearchResult', Search.SearchResult.prototype, SearchResult); + this._overrides.addOverride('SearchResultsView', Search.SearchResultsView.prototype, SearchResultsView); + this._overrides.addOverride('ProviderInfo', Search.ProviderInfo.prototype, ProviderInfo); + + // Don't expand the search view vertically and align it to the top + // this is important in the static workspace mode when the search view bg is not transparent + // also the "Searching..." and "No Results" notifications will be closer to the search entry, with the distance given by margin-top in the stylesheet + Main.overview._overview._controls.layoutManager._searchController.y_align = Clutter.ActorAlign.START; + console.debug(' SearchModule - Activated'); } - _overrides = new _Util.Overrides(); + _disableModule() { + const reset = true; + this._updateSearchViewWidth(reset); - _overrides.addOverride('AppSearchProvider', AppDisplay.AppSearchProvider.prototype, AppSearchProvider); - _overrides.addOverride('SearchResult', Search.SearchResult.prototype, SearchResult); - _overrides.addOverride('SearchResultsView', Search.SearchResultsView.prototype, SearchResultsView); + if (this._overrides) + this._overrides.removeAll(); + this._overrides = null; + + Main.overview._overview._controls.layoutManager._searchController.y_align = Clutter.ActorAlign.FILL; - // Don't expand the search view vertically and align it to the top - // this is important in the static workspace mode when the search view bg is not transparent - // also the "Searching..." and "No Results" notifications will be closer to the search entry, with the distance given by margin-top in the stylesheet - Main.overview._overview._controls.layoutManager._searchController.y_align = Clutter.ActorAlign.START; -} -function _updateSearchViewWidth(reset = false) { - const searchContent = Main.overview._overview._controls.layoutManager._searchController._searchResults._content; - if (!SEARCH_MAX_WIDTH) { // just store original value; - const themeNode = searchContent.get_theme_node(); - const width = themeNode.get_max_width(); - SEARCH_MAX_WIDTH = width; + console.debug(' WorkspaceSwitcherPopupModule - Disabled'); } - if (reset) { - searchContent.set_style(''); - } else { - let width = Math.round(SEARCH_MAX_WIDTH * opt.SEARCH_VIEW_SCALE); - searchContent.set_style(`max-width: ${width}px;`); + _updateSearchViewWidth(reset = false) { + const searchContent = Main.overview._overview._controls.layoutManager._searchController._searchResults._content; + if (!SEARCH_MAX_WIDTH) { // just store original value; + const themeNode = searchContent.get_theme_node(); + const width = themeNode.get_max_width(); + SEARCH_MAX_WIDTH = width; + } + + if (reset) { + searchContent.set_style(''); + } else { + let width = Math.round(SEARCH_MAX_WIDTH * opt.SEARCH_VIEW_SCALE); + searchContent.set_style(`max-width: ${width}px;`); + } } -} +}; // AppDisplay.AppSearchProvider const AppSearchProvider = { - getInitialResultSet(terms, callback, _cancellable) { + getInitialResultSet(terms, callback, cancellable) { // Defer until the parental controls manager is initialized, so the // results can be filtered correctly. if (!this._parentalControlsManager.initialized) { - let initializedId = this._parentalControlsManager.connect('app-filter-changed', () => { - if (this._parentalControlsManager.initialized) { - this._parentalControlsManager.disconnect(initializedId); - this.getInitialResultSet(terms, callback, _cancellable); - } - }); - return; + if (Me.shellVersion < 43) { + let initializedId = this._parentalControlsManager.connect('app-filter-changed', () => { + if (this._parentalControlsManager.initialized) { + this._parentalControlsManager.disconnect(initializedId); + this.getInitialResultSet(terms, callback, cancellable); + } + }); + return null; + } else { + // callback has been removed in 43 + cancellable = callback; + return new Promise(resolve => { + let initializedId = this._parentalControlsManager.connect('app-filter-changed', async () => { + if (this._parentalControlsManager.initialized) { + this._parentalControlsManager.disconnect(initializedId); + resolve(await this.getInitialResultSet(terms, cancellable)); + } + }); + }); + } } - const pattern = terms.join(' '); + let appInfoList = Shell.AppSystem.get_default().get_installed(); let weightList = {}; @@ -113,22 +158,25 @@ const AppSearchProvider = { shouldShow = appInfo.should_show() && this._parentalControlsManager.shouldShowApp(appInfo); if (shouldShow) { + let id = appInfo.get_id().split('.'); + id = id[id.length - 2] || ''; + let baseName = appInfo.get_string('Name') || ''; let dispName = appInfo.get_display_name() || ''; let gName = appInfo.get_generic_name() || ''; let description = appInfo.get_description() || ''; let categories = appInfo.get_string('Categories') || ''; let keywords = appInfo.get_string('Keywords') || ''; - name = dispName; - string = `${dispName} ${gName} ${description} ${categories} ${keywords}`; + name = `${dispName} ${id}`; + string = `${dispName} ${gName} ${baseName} ${description} ${categories} ${keywords} ${id}`; } } let m = -1; if (shouldShow && opt.SEARCH_FUZZY) { - m = _Util.fuzzyMatch(pattern, name); - m = (m + _Util.strictMatch(pattern, string)) / 2; + m = Me.Util.fuzzyMatch(pattern, name); + m = (m + Me.Util.strictMatch(pattern, string)) / 2; } else if (shouldShow) { - m = _Util.strictMatch(pattern, string); + m = Me.Util.strictMatch(pattern, string); } if (m !== -1) @@ -143,16 +191,18 @@ const AppSearchProvider = { // sort apps by usage list appInfoList.sort((a, b) => usage.compare(a.get_id(), b.get_id())); // prefer apps where any word in their name starts with the pattern - appInfoList.sort((a, b) => _Util.isMoreRelevant(a.get_display_name(), b.get_display_name(), pattern)); + appInfoList.sort((a, b) => Me.Util.isMoreRelevant(a.get_display_name(), b.get_display_name(), pattern)); let results = appInfoList.map(app => app.get_id()); results = results.concat(this._systemActions.getMatchingActions(terms)); - if (shellVersion < 43) + if (Me.shellVersion < 43) { callback(results); - else + return null; + } else { return new Promise(resolve => resolve(results)); + } }, // App search result size @@ -181,12 +231,69 @@ const SearchResult = { St.ClipboardType.CLIPBOARD, this.metaInfo.clipboardText); } // don't close overview if Shift key is pressed - Shift moves windows to the workspace - if (!_Util.isShiftPressed()) + if (!Me.Util.isShiftPressed()) Main.overview.toggle(); }, }; const SearchResultsView = { + _doSearch() { + if (!this._doProviderSearch) { + this._doSearchLegacy(); + return; + } + this._startingSearch = false; + + let previousResults = this._results; + this._results = {}; + + this._providers.forEach(provider => { + const onlyVShellProviders = this._terms.includes('wq//') || this._terms.includes('fq//'); + if (!onlyVShellProviders || (onlyVShellProviders && (provider.id.includes('open-windows') || provider.id.includes('recent-files')))) { + let previousProviderResults = previousResults[provider.id]; + this._doProviderSearch(provider, previousProviderResults); + } + }); + + this._updateSearchProgress(); + + this._clearSearchTimeout(); + }, + + _doSearchLegacy() { + this._startingSearch = false; + + let previousResults = this._results; + this._results = {}; + + this._providers.forEach(provider => { + const onlyVShellProviders = this._terms.includes('wq//') || this._terms.includes('fq//'); + if (!onlyVShellProviders || (onlyVShellProviders && (provider.id.includes('open-windows') || provider.id.includes('recent-files')))) { + provider.searchInProgress = true; + + let previousProviderResults = previousResults[provider.id]; + if (this._isSubSearch && previousProviderResults) { + provider.getSubsearchResultSet(previousProviderResults, + this._terms, + results => { + this._gotResults(results, provider); + }, + this._cancellable); + } else { + provider.getInitialResultSet(this._terms, + results => { + this._gotResults(results, provider); + }, + this._cancellable); + } + } + }); + + this._updateSearchProgress(); + + this._clearSearchTimeout(); + }, + _updateSearchProgress() { let haveResults = this._providers.some(provider => { let display = provider.display; @@ -204,3 +311,13 @@ const SearchResultsView = { } }, }; + +// fixes app is null error if search provider id is not a desktop app id. +const ProviderInfo = { + animateLaunch() { + let appSys = Shell.AppSystem.get_default(); + let app = appSys.lookup_app(this.provider.appInfo.get_id()); + if (app && app.state === Shell.AppState.STOPPED) + IconGrid.zoomOutActor(this._content); + }, +}; |