summaryrefslogtreecommitdiffstats
path: root/extensions/45/vertical-workspaces/lib/extensionsSearchProvider.js
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/45/vertical-workspaces/lib/extensionsSearchProvider.js')
-rw-r--r--extensions/45/vertical-workspaces/lib/extensionsSearchProvider.js406
1 files changed, 0 insertions, 406 deletions
diff --git a/extensions/45/vertical-workspaces/lib/extensionsSearchProvider.js b/extensions/45/vertical-workspaces/lib/extensionsSearchProvider.js
deleted file mode 100644
index 30d9960..0000000
--- a/extensions/45/vertical-workspaces/lib/extensionsSearchProvider.js
+++ /dev/null
@@ -1,406 +0,0 @@
-/**
-* V-Shell (Vertical Workspaces)
- * extensionsSearchProvider.js
- *
- * @author GdH <G-dH@github.com>
- * @copyright 2022 - 2023
- * @license GPL-3.0
- */
-
-'use strict';
-
-import GLib from 'gi://GLib';
-import St from 'gi://St';
-import Gio from 'gi://Gio';
-import Shell from 'gi://Shell';
-import GObject from 'gi://GObject';
-import Clutter from 'gi://Clutter';
-
-import * as Main from 'resource:///org/gnome/shell/ui/main.js';
-
-const ExtensionState = {
- 1: 'ENABLED',
- 2: 'DISABLED',
- 3: 'ERROR',
- 4: 'INCOMPATIBLE',
- 5: 'DOWNLOADING',
- 6: 'INITIALIZED',
- 7: 'DISABLING',
- 8: 'ENABLING',
-};
-
-let Me;
-let opt;
-// gettext
-let _;
-let _toggleTimeout;
-
-// prefix helps to eliminate results from other search providers
-// so it needs to be something less common
-// needs to be accessible from vw module
-export const PREFIX = 'eq//';
-
-export class ExtensionsSearchProviderModule {
- // export for other modules
- static _PREFIX = PREFIX;
- constructor(me) {
- Me = me;
- opt = Me.opt;
- _ = Me.gettext;
-
- this._firstActivation = true;
- this.moduleEnabled = false;
- this._extensionsSearchProvider = null;
- this._enableTimeoutId = 0;
- }
-
- cleanGlobals() {
- Me = null;
- opt = null;
- _ = null;
- }
-
- update(reset) {
- if (_toggleTimeout)
- GLib.source_remove(_toggleTimeout);
-
- this.moduleEnabled = opt.get('extensionsSearchProviderModule');
-
- reset = reset || !this.moduleEnabled;
-
- if (reset && !this._firstActivation) {
- this._disableModule();
- } else if (!reset) {
- this._firstActivation = false;
- this._activateModule();
- }
- if (reset && this._firstActivation)
- console.debug(' ExtensionsSearchProviderModule - Keeping untouched');
- }
-
- _activateModule() {
- // delay because Fedora had problem to register a new provider soon after Shell restarts
- this._enableTimeoutId = GLib.timeout_add(
- GLib.PRIORITY_DEFAULT,
- 2000,
- () => {
- if (!this._extensionsSearchProvider) {
- this._extensionsSearchProvider = new extensionsSearchProvider(opt);
- this._getOverviewSearchResult()._registerProvider(this._extensionsSearchProvider);
- }
- this._enableTimeoutId = 0;
- return GLib.SOURCE_REMOVE;
- }
- );
- console.debug(' ExtensionsSearchProviderModule - Activated');
- }
-
- _disableModule() {
- if (this._enableTimeoutId) {
- GLib.source_remove(this._enableTimeoutId);
- this._enableTimeoutId = 0;
- }
-
- if (this._extensionsSearchProvider) {
- this._getOverviewSearchResult()._unregisterProvider(this._extensionsSearchProvider);
- this._extensionsSearchProvider = null;
- }
-
-
- console.debug(' ExtensionsSearchProviderModule - Disabled');
- }
-
- _getOverviewSearchResult() {
- return Main.overview._overview.controls._searchController._searchResults;
- }
-}
-
-class extensionsSearchProvider {
- constructor() {
- this.id = 'extensions';
- const appSystem = Shell.AppSystem.get_default();
- let appInfo = appSystem.lookup_app('com.matjakeman.ExtensionManager.desktop')?.get_app_info();
- if (!appInfo)
- appInfo = appSystem.lookup_app('org.gnome.Extensions.desktop')?.get_app_info();
- if (!appInfo)
- appInfo = Gio.AppInfo.create_from_commandline('/usr/bin/gnome-extensions-app', 'Extensions', null);
- appInfo.get_description = () => _('Search extensions');
- appInfo.get_name = () => _('Extensions');
- appInfo.get_id = () => 'org.gnome.Extensions.desktop';
- appInfo.get_icon = () => Gio.icon_new_for_string('application-x-addon');
- appInfo.should_show = () => true;
-
- this.appInfo = appInfo;
- this.canLaunchSearch = true;
- this.isRemoteProvider = false;
- }
-
- getInitialResultSet(terms/* , callback*/) {
- const extensions = {};
- Main.extensionManager._extensions.forEach(
- e => {
- extensions[e.uuid] = e;
- }
- );
- this.extensions = extensions;
-
- return new Promise(resolve => resolve(this._getResultSet(terms)));
- }
-
- _getResultSet(terms) {
- // do not modify original terms
- let termsCopy = [...terms];
- // search for terms without prefix
- termsCopy[0] = termsCopy[0].replace(PREFIX, '');
-
- const candidates = this.extensions;
- const _terms = [].concat(termsCopy);
-
- const term = _terms.join(' ');
-
- const results = [];
- let m;
- for (let id in candidates) {
- const extension = this.extensions[id];
- const text = extension.metadata.name + (extension.state === 1 ? 'enabled' : '') + ([6, 2].includes(extension.state) ? 'disabled' : '');
- if (opt.SEARCH_FUZZY)
- m = Me.Util.fuzzyMatch(term, text);
- else
- m = Me.Util.strictMatch(term, text);
-
- if (m !== -1)
- results.push({ weight: m, id });
- }
-
- // sort alphabetically
- results.sort((a, b) => this.extensions[a.id].metadata.name.localeCompare(this.extensions[b.id].metadata.name));
- // enabled first
- // results.sort((a, b) => this.extensions[a.id].state !== 1 && this.extensions[b.id].state === 1);
- // incompatible last
- results.sort((a, b) => this.extensions[a.id].state === 4 && this.extensions[b.id].state !== 4);
-
- const resultIds = results.map(item => item.id);
- return resultIds;
- }
-
- getResultMetas(resultIds/* , callback = null*/) {
- const metas = resultIds.map(id => this.getResultMeta(id));
- return new Promise(resolve => resolve(metas));
- }
-
- getResultMeta(resultId) {
- const result = this.extensions[resultId];
-
- const versionName = result.metadata['version-name'] ?? '';
- let version = result.metadata['version'] ?? '';
- version = versionName && version ? `/${version}` : version;
- const versionStr = `${versionName}${version}`;
-
- return {
- 'id': resultId,
- 'name': `${result.metadata.name}`,
- 'version': versionStr,
- 'description': versionStr, // description will be updated in result object
- 'createIcon': size => {
- let icon = this.getIcon(result, size);
- return icon;
- },
- };
- }
-
- getIcon(extension, size) {
- let opacity = 0;
- let iconName = 'process-stop-symbolic';
-
- switch (extension.state) {
- case 1:
- if (extension.hasUpdate)
- iconName = 'software-update-available'; // 'software-update-available-symbolic';
- else
- iconName = 'object-select-symbolic';// 'object-select-symbolic';
-
- opacity = 255;
- break;
- case 3:
- if (Main.extensionManager._enabledExtensions.includes(extension.uuid))
- iconName = 'emblem-ok-symbolic';
- else
- iconName = 'dialog-error';
- opacity = 100;
- break;
- case 4:
- iconName = 'software-update-urgent'; // 'software-update-urgent-symbolic';
- opacity = 100;
- break;
- }
-
- if (extension.hasUpdate) {
- iconName = 'software-update-available'; // 'software-update-available-symbolic';
- opacity = 100;
- }
-
- const icon = new St.Icon({ icon_name: iconName, icon_size: size });
- icon.set({
- opacity,
- });
-
- return icon;
- }
-
- createResultObject(meta) {
- return new ListSearchResult(this, meta, this.extensions[meta.id]);
- }
-
- launchSearch(terms, timeStamp) {
- this.appInfo.launch([], global.create_app_launch_context(timeStamp, -1), null);
- }
-
- activateResult(resultId/* terms, timeStamp*/) {
- const extension = this.extensions[resultId];
- if (Me.Util.isShiftPressed())
- this._toggleExtension(extension);
- else if (extension.hasPrefs)
- Me.Util.openPreferences(extension.metadata);
- }
-
- filterResults(results /* , maxResults*/) {
- // return results.slice(0, maxResults);
- return results;
- }
-
- getSubsearchResultSet(previousResults, terms/* , callback*/) {
- return this.getInitialResultSet(terms);
- }
-
- getSubsearchResultSet42(terms, callback) {
- callback(this._getResultSet(terms));
- }
-}
-
-const ListSearchResult = GObject.registerClass(
-class ListSearchResult extends St.Button {
- _init(provider, metaInfo, extension) {
- this.provider = provider;
- this.metaInfo = metaInfo;
- this.extension = extension;
-
- super._init({
- reactive: true,
- can_focus: true,
- track_hover: true,
- });
-
- this.style_class = 'list-search-result';
-
- let content = new St.BoxLayout({
- style_class: 'list-search-result-content',
- vertical: false,
- x_align: Clutter.ActorAlign.START,
- x_expand: true,
- y_expand: true,
- });
- this.set_child(content);
-
- let titleBox = new St.BoxLayout({
- style_class: 'list-search-result-title',
- y_align: Clutter.ActorAlign.CENTER,
- });
-
- content.add_child(titleBox);
-
- // An icon for, or thumbnail of, content
- let icon = this.metaInfo['createIcon'](this.ICON_SIZE);
- let iconBox = new St.Button();
- iconBox.set_child(icon);
- titleBox.add(iconBox);
- iconBox.set_style('border: 1px solid rgba(200,200,200,0.2); padding: 2px; border-radius: 8px;');
- this._iconBox = iconBox;
- this.icon = icon;
-
- iconBox.connect('clicked', () => {
- this._toggleExtension();
- return Clutter.EVENT_STOP;
- });
-
- let title = new St.Label({
- text: this.metaInfo['name'],
- y_align: Clutter.ActorAlign.CENTER,
- opacity: extension.hasPrefs ? 255 : 150,
- });
- titleBox.add_child(title);
-
- this.label_actor = title;
-
- this._descriptionLabel = new St.Label({
- style_class: 'list-search-result-description',
- y_align: Clutter.ActorAlign.CENTER,
- });
- content.add_child(this._descriptionLabel);
-
- this._highlightTerms();
-
- this.connect('destroy', () => {
- if (_toggleTimeout) {
- GLib.source_remove(_toggleTimeout);
- _toggleTimeout = 0;
- }
- });
- }
-
- _toggleExtension() {
- const state = this.extension.state;
- if (![1, 2, 6, 3].includes(state) || this.extension.metadata.name.includes('vertical-workspaces'))
- return;
-
- if ([2, 6].includes(state))
- Main.extensionManager.enableExtension(this.extension.uuid);
- else if ([1, 3].includes(state))
- Main.extensionManager.disableExtension(this.extension.uuid);
-
- if (_toggleTimeout)
- GLib.source_remove(_toggleTimeout);
-
- _toggleTimeout = GLib.timeout_add(GLib.PRIORITY_LOW, 200,
- () => {
- if ([7, 8].includes(this.extension.state))
- return GLib.SOURCE_CONTINUE;
-
- this.icon?.destroy();
- this.icon = this.metaInfo['createIcon'](this.ICON_SIZE);
- this._iconBox.set_child(this.icon);
- this._highlightTerms();
-
- _toggleTimeout = 0;
- return GLib.SOURCE_REMOVE;
- }
- );
- }
-
- get ICON_SIZE() {
- return 24;
- }
-
- _highlightTerms() {
- const extension = this.extension;
- const state = extension.state === 4 ? ExtensionState[this.extension.state] : '';
- const error = extension.state === 3 ? ` ERROR: ${this.extension.error}` : '';
- const update = extension.hasUpdate ? ' | UPDATE PENDING' : '';
- const text = `${this.metaInfo.version} ${state}${error}${update}`;
- let markup = text;// this.metaInfo['description'].split('\n')[0];
- this._descriptionLabel.clutter_text.set_markup(markup);
- }
-
- vfunc_clicked() {
- this.activate();
- }
-
- activate() {
- this.provider.activateResult(this.metaInfo.id);
-
- if (this.metaInfo.clipboardText) {
- St.Clipboard.get_default().set_text(
- St.ClipboardType.CLIPBOARD, this.metaInfo.clipboardText);
- }
- Main.overview.toggle();
- }
-});