160 lines
5.0 KiB
QML
160 lines
5.0 KiB
QML
import QtQuick
|
|
import Quickshell
|
|
import qs.Commons
|
|
import qs.Services.Compositor
|
|
|
|
Item {
|
|
id: root
|
|
|
|
property string name: I18n.tr("common.windows")
|
|
property var launcher: null
|
|
property bool handleSearch: Settings.data.appLauncher.enableWindowsSearch
|
|
property string supportedLayouts: "list"
|
|
property string iconMode: Settings.data.appLauncher.iconMode
|
|
|
|
function init() {
|
|
Logger.d("WindowsProvider", "Initialized");
|
|
}
|
|
|
|
// Check if this provider handles the command
|
|
function handleCommand(searchText) {
|
|
return searchText.startsWith(">win");
|
|
}
|
|
|
|
// Return available commands when user types ">"
|
|
function commands() {
|
|
return [
|
|
{
|
|
"name": ">win",
|
|
"description": I18n.tr("launcher.providers.windows-search-description"),
|
|
"icon": iconMode === "tabler" ? "app-window" : "preferences-system-windows",
|
|
"isTablerIcon": true,
|
|
"isImage": false,
|
|
"onActivate": function () {
|
|
launcher.setSearchText(">win ");
|
|
}
|
|
}
|
|
];
|
|
}
|
|
|
|
function getResults(query) {
|
|
if (!query)
|
|
return [];
|
|
|
|
var trimmed = query.trim();
|
|
|
|
// Handle command mode: ">win" or ">win <search>"
|
|
var isCommandMode = trimmed.startsWith(">win");
|
|
if (isCommandMode) {
|
|
// Extract search term after ">win "
|
|
var searchTerm = trimmed.substring(4).trim();
|
|
// In command mode, show all windows if no search term
|
|
if (searchTerm.length === 0) {
|
|
return getAllWindows();
|
|
}
|
|
trimmed = searchTerm;
|
|
} else {
|
|
// Regular search mode - require at least 2 chars
|
|
if (trimmed.length < 2)
|
|
return [];
|
|
}
|
|
|
|
var items = [];
|
|
|
|
// Collect all windows from CompositorService
|
|
for (var i = 0; i < CompositorService.windows.count; i++) {
|
|
var win = CompositorService.windows.get(i);
|
|
items.push({
|
|
"id": win.id,
|
|
"title": win.title || "",
|
|
"appId": win.appId || "",
|
|
"workspaceId": win.workspaceId,
|
|
"isFocused": win.isFocused,
|
|
"searchText": (win.title + " " + win.appId).toLowerCase()
|
|
});
|
|
}
|
|
|
|
// Fuzzy search on title and appId
|
|
var results = FuzzySort.go(trimmed, items, {
|
|
"keys": ["title", "appId"],
|
|
"limit": 10
|
|
});
|
|
|
|
// Map to launcher items
|
|
var launcherItems = [];
|
|
for (var j = 0; j < results.length; j++) {
|
|
var entry = results[j].obj;
|
|
var score = results[j].score;
|
|
|
|
// Get icon name from DesktopEntry if available, otherwise use appId
|
|
var iconName = entry.appId;
|
|
var appEntry = ThemeIcons.findAppEntry(entry.appId);
|
|
if (appEntry && appEntry.icon) {
|
|
iconName = appEntry.icon;
|
|
}
|
|
|
|
launcherItems.push({
|
|
"name": entry.title || entry.appId,
|
|
"description": entry.appId,
|
|
"icon": iconName || "application-x-executable",
|
|
"isTablerIcon": false,
|
|
"badgeIcon": "app-window",
|
|
"_score": score,
|
|
"provider": root,
|
|
"windowId": entry.id,
|
|
"onActivate": createActivateHandler(entry)
|
|
});
|
|
}
|
|
|
|
return launcherItems;
|
|
}
|
|
|
|
function getAllWindows() {
|
|
var launcherItems = [];
|
|
|
|
for (var i = 0; i < CompositorService.windows.count; i++) {
|
|
var win = CompositorService.windows.get(i);
|
|
|
|
var iconName = win.appId;
|
|
var appEntry = ThemeIcons.findAppEntry(win.appId);
|
|
if (appEntry && appEntry.icon) {
|
|
iconName = appEntry.icon;
|
|
}
|
|
|
|
launcherItems.push({
|
|
"name": win.title || win.appId,
|
|
"description": win.appId,
|
|
"icon": iconName || "application-x-executable",
|
|
"isTablerIcon": false,
|
|
"badgeIcon": "app-window",
|
|
"_score": 0,
|
|
"provider": root,
|
|
"windowId": win.id,
|
|
"onActivate": createActivateHandler({
|
|
"id": win.id
|
|
})
|
|
});
|
|
}
|
|
|
|
return launcherItems;
|
|
}
|
|
|
|
function createActivateHandler(windowEntry) {
|
|
return function () {
|
|
if (launcher)
|
|
launcher.close();
|
|
|
|
Qt.callLater(() => {
|
|
// Find the actual window object to pass to focusWindow
|
|
for (var i = 0; i < CompositorService.windows.count; i++) {
|
|
var win = CompositorService.windows.get(i);
|
|
if (win.id === windowEntry.id) {
|
|
CompositorService.focusWindow(win);
|
|
break;
|
|
}
|
|
}
|
|
});
|
|
};
|
|
}
|
|
}
|