pragma Singleton import Quickshell import Quickshell.Hyprland import Quickshell.Wayland Singleton { readonly property string hyprlandSignature: Quickshell.env("HYPRLAND_INSTANCE_SIGNATURE") property var sortedTopLevels: { if (!ToplevelManager.toplevels || !ToplevelManager.toplevels.values) { return []; } const topLevels = Array.from(Hyprland.toplevels.values); const sortedHyprland = topLevels.sort((a, b) => { if (a.monitor && b.monitor) { const monitorCompare = a.monitor.name.localeCompare(b.monitor.name); if (monitorCompare !== 0) { return monitorCompare; } } if (a.workspace && b.workspace) { const workspaceCompare = a.workspace.id - b.workspace.id; if (workspaceCompare !== 0) { return workspaceCompare; } } if (a.lastIpcObject && b.lastIpcObject && a.lastIpcObject.at && b.lastIpcObject.at) { const aX = a.lastIpcObject.at[0]; const bX = b.lastIpcObject.at[0]; const aY = a.lastIpcObject.at[1]; const bY = b.lastIpcObject.at[1]; const xCompare = aX - bX; if (Math.abs(xCompare) > 10) { return xCompare; } return aY - bY; } if (a.lastIpcObject && !b.lastIpcObject) { return -1; } if (!a.lastIpcObject && b.lastIpcObject) { return 1; } if (a.title && b.title) { return a.title.localeCompare(b.title); } return 0; }); return sortedHyprland.filter(tl => tl.wayland !== null); } property var topLevelWorkspaces: { return sortedTopLevels.map(topLevel => topLevel.workspace); } property var sortedDesktopApplications: { const sortedWayland = sortedTopLevels.map(topLevel => topLevel.wayland).filter(wayland => wayland !== null); const desktopEntries = sortedWayland.map(topLevel => { return DesktopEntries.heuristicLookup(topLevel.appId); }); const workspace = sortedTopLevels.map(topLevel => { return topLevel.workspace.id; }); const workspaceDesktopEntries = new Map(); for (let i = 0; i < workspace.length; i++) { const key = workspace[i]; const value = desktopEntries[i]; if (workspaceDesktopEntries.has(key)) { workspaceDesktopEntries.get(key).push(value); } else { workspaceDesktopEntries.set(key, [value]); } } return workspaceDesktopEntries; } }