Oreon-Lime-R2/arcmenu/arc-menu-27/searchProviders/openWindows.js

94 lines
3.2 KiB
JavaScript
Raw Permalink Normal View History

const { Meta, Gio, St, Shell } = imports.gi;
const Main = imports.ui.main;
const { getWindows } = imports.ui.altTab;
const Me = imports.misc.extensionUtils.getCurrentExtension();
const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']);
const _ = Gettext.gettext;
function createIcon(app, size) {
return app
? app.create_icon_texture(size)
: new St.Icon({ icon_name: 'icon-missing', icon_size: size });
}
var OpenWindowSearchProvider = class {
constructor() {
this.id = 'arcmenu.open-windows';
this.isRemoteProvider = true;
this.canLaunchSearch = false;
this._appWindows = [];
this._windowTracker = Shell.WindowTracker.get_default();
this.appInfo = {
get_description: () => _('List of open windows across all workspaces'),
get_name: () => _('Open Windows'),
get_id: () => 'arcmenu.open-windows',
get_icon: () => Gio.icon_new_for_string('focus-windows-symbolic'),
}
}
getResultMetas(winIds, callback) {
const metas = winIds.map(winId => {
const aw = this._getAppWindow(winId);
return aw ? {
id: winId,
name: aw.window.title ?? aw.app.get_name(),
description: aw.window.get_workspace() ? _("'%s' on Workspace %d").format(aw.app.get_name(), aw.window.get_workspace().index() + 1) : aw.app.get_name(),
createIcon: (size) => createIcon(aw.app, size),
} : undefined;
}).filter(m => m?.name !== undefined && m?.name !== null);
callback(metas);
}
filterResults(results, maxNumber) {
return results.slice(0, maxNumber);
}
getInitialResultSet(terms, callback, _cancellable) {
this._appWindows = getWindows(null).map(window => {
return {
window,
app: this._windowTracker.get_window_app(window),
}
});
callback(this._getFilteredWindowIds(terms, this._appWindows));
}
getSubsearchResultSet(previousResults, terms, callback, _cancellable) {
const appWindows = previousResults.map(winId => this._getAppWindow(winId)).filter(aw => aw !== undefined);
callback(this._getFilteredWindowIds(terms, appWindows));
}
activateResult(winId, _terms) {
const window = this._getAppWindow(winId)?.window;
if (window)
Main.activateWindow(window);
}
launchSearch() {
}
_getFilteredWindowIds(terms, appWindows) {
terms = terms.map(term => term.toLowerCase());
appWindows = appWindows.filter(aw => {
const title = aw.window.title?.toLowerCase();
const appName = aw.app.get_name()?.toLowerCase();
const appDescription = aw.app.get_description()?.toLowerCase();
return terms.some(term => title?.includes(term) || appName?.includes(term) || appDescription?.includes(term));
});
return appWindows.map(aw => aw.window.get_id().toString());
}
_getAppWindow(winId) {
winId = typeof winId === "string" ? parseInt(winId) : winId;
return this._appWindows.find(aw => aw.window.get_id() === winId);
}
}