diff options
| author | Don Williams <Don.e.williams@gmail.com> | 2026-07-11 20:50:52 -0400 |
|---|---|---|
| committer | Pinapelz <yukais@pinapelz.com> | 2026-08-29 21:40:34 -0700 |
| commit | 9dab91abe13fc6cf1c8e609f71131609ae9c64bb (patch) | |
| tree | d848f7b3c180aba0ae1576d1f7ede0f951e63f11 /config/quickshell/overview-backup/services/HyprlandData.qml | |
| parent | cfdf5b2c2c24d312b2f2ff3da8eb73f9dced8dcf (diff) | |
Using previous version of overview config seems to work better
Signed-off-by: Don Williams <Don.e.williams@gmail.com>
On branch development
Your branch is up to date with 'origin/development'.
Changes to be committed:
new file: overview-backup/README.md
renamed: overview/assets/Workspace_Wallpaper.png -> overview-backup/assets/Workspace_Wallpaper.png
new file: overview-backup/assets/image.png
new file: overview-backup/common/Appearance.qml
new file: overview-backup/common/Config.qml
new file: overview-backup/common/functions/ColorUtils.qml
new file: overview-backup/common/functions/qmldir
new file: overview-backup/common/qmldir
renamed: overview/common/widgets/RectangularShadow.qml -> overview-backup/common/widgets/RectangularShadow.qml
new file: overview-backup/common/widgets/StyledRectangularShadow.qml
new file: overview-backup/common/widgets/StyledText.qml
new file: overview-backup/common/widgets/StyledToolTip.qml
new file: overview-backup/common/widgets/StyledToolTipContent.qml
new file: overview-backup/common/widgets/qmldir
renamed: overview/config.example.json -> overview-backup/config.example.json
renamed: overview/config.json -> overview-backup/config.json
new file: overview-backup/modules/overview/Overview.qml
new file: overview-backup/modules/overview/OverviewWidget.qml
new file: overview-backup/modules/overview/OverviewWindow.qml
new file: overview-backup/modules/overview/qmldir
renamed: overview/quickshell-overview.qml -> overview-backup/quickshell-overview.qml
new file: overview-backup/services/GlobalStates.qml
new file: overview-backup/services/HyprlandData.qml
new file: overview-backup/services/qmldir
new file: overview-backup/shell.qml
modified: overview/README.md
modified: overview/assets/image.png
modified: overview/common/Appearance.qml
modified: overview/common/Config.qml
modified: overview/common/widgets/StyledRectangularShadow.qml
modified: overview/common/widgets/qmldir
modified: overview/modules/overview/Overview.qml
modified: overview/modules/overview/OverviewWidget.qml
modified: overview/modules/overview/OverviewWindow.qml
modified: overview/services/HyprlandData.qml
modified: overview/shell.qml
Diffstat (limited to 'config/quickshell/overview-backup/services/HyprlandData.qml')
| -rw-r--r-- | config/quickshell/overview-backup/services/HyprlandData.qml | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/config/quickshell/overview-backup/services/HyprlandData.qml b/config/quickshell/overview-backup/services/HyprlandData.qml new file mode 100644 index 00000000..6127e989 --- /dev/null +++ b/config/quickshell/overview-backup/services/HyprlandData.qml @@ -0,0 +1,209 @@ +pragma Singleton +pragma ComponentBehavior: Bound + +import QtQuick +import Quickshell +import Quickshell.Io +import Quickshell.Hyprland +import "../common" + +/** + * Provides access to some Hyprland data not available in Quickshell.Hyprland. + */ +Singleton { + id: root + property var windowList: [] + property var addresses: [] + property var windowByAddress: ({}) + property var workspaces: [] + property var allWorkspaces: [] + property var workspaceIds: [] + property var workspaceById: ({}) + property var activeWorkspace: null + property var monitors: [] + property var layers: ({}) + property bool pendingWindowsUpdate: false + property bool pendingMonitorsUpdate: false + property bool pendingLayersUpdate: false + property bool pendingWorkspacesUpdate: false + property bool pendingActiveWorkspaceUpdate: false + + function updateWindowList() { + getClients.running = true; + } + + function updateLayers() { + getLayers.running = true; + } + + function updateMonitors() { + getMonitors.running = true; + } + + function updateWorkspaces() { + getWorkspaces.running = true; + getActiveWorkspace.running = true; + } + + function updateAll() { + scheduleUpdates(true, true, true, true, true); + } + + function scheduleUpdates(windows, monitors, layers, workspaces, activeWorkspace) { + pendingWindowsUpdate = pendingWindowsUpdate || !!windows; + pendingMonitorsUpdate = pendingMonitorsUpdate || !!monitors; + pendingLayersUpdate = pendingLayersUpdate || !!layers; + pendingWorkspacesUpdate = pendingWorkspacesUpdate || !!workspaces; + pendingActiveWorkspaceUpdate = pendingActiveWorkspaceUpdate || !!activeWorkspace; + + const debounceMs = Math.max(0, Config.options.hacks.hyprlandEventDebounceMs); + if (debounceMs === 0) { + flushPendingUpdates(); + } else { + eventDebounceTimer.interval = debounceMs; + eventDebounceTimer.restart(); + } + } + + function flushPendingUpdates() { + if (pendingWindowsUpdate) { + pendingWindowsUpdate = false; + updateWindowList(); + } + if (pendingMonitorsUpdate) { + pendingMonitorsUpdate = false; + updateMonitors(); + } + if (pendingLayersUpdate) { + pendingLayersUpdate = false; + updateLayers(); + } + if (pendingWorkspacesUpdate) { + pendingWorkspacesUpdate = false; + getWorkspaces.running = true; + } + if (pendingActiveWorkspaceUpdate) { + pendingActiveWorkspaceUpdate = false; + getActiveWorkspace.running = true; + } + } + + function biggestWindowForWorkspace(workspaceId) { + const windowsInThisWorkspace = HyprlandData.windowList.filter(w => w.workspace.id == workspaceId); + return windowsInThisWorkspace.reduce((maxWin, win) => { + const maxArea = (maxWin?.size?.[0] ?? 0) * (maxWin?.size?.[1] ?? 0); + const winArea = (win?.size?.[0] ?? 0) * (win?.size?.[1] ?? 0); + return winArea > maxArea ? win : maxWin; + }, null); + } + + Component.onCompleted: { + scheduleUpdates(true, true, true, true, true); + flushPendingUpdates(); + } + + Connections { + target: Hyprland + + function onRawEvent(event) { + const eventName = `${event?.name ?? event?.event ?? event?.type ?? ""}`; + if (["openlayer", "closelayer", "screencast"].includes(eventName)) + return; + + if (eventName === "openwindow" || eventName === "closewindow" || eventName === "movewindow" || eventName === "movewindowv2" || eventName === "windowtitle") { + scheduleUpdates(true, false, false, true, false); + return; + } + + if (eventName === "workspace" || eventName === "workspacev2" || eventName === "focusedmon" || eventName === "focusedmonv2" || eventName === "activewindow" || eventName === "activewindowv2") { + scheduleUpdates(false, false, false, true, true); + return; + } + + if (eventName.startsWith("monitor") || eventName === "configreloaded") { + scheduleUpdates(true, true, false, true, true); + return; + } + + scheduleUpdates(true, true, true, true, true); + } + } + + Timer { + id: eventDebounceTimer + interval: Math.max(0, Config.options.hacks.hyprlandEventDebounceMs) + repeat: false + onTriggered: root.flushPendingUpdates() + } + + Process { + id: getClients + command: ["hyprctl", "clients", "-j"] + stdout: StdioCollector { + id: clientsCollector + onStreamFinished: { + root.windowList = JSON.parse(clientsCollector.text); + let tempWinByAddress = {}; + for (var i = 0; i < root.windowList.length; ++i) { + var win = root.windowList[i]; + tempWinByAddress[win.address] = win; + } + root.windowByAddress = tempWinByAddress; + root.addresses = root.windowList.map(win => win.address); + } + } + } + + Process { + id: getMonitors + command: ["hyprctl", "monitors", "-j"] + stdout: StdioCollector { + id: monitorsCollector + onStreamFinished: { + root.monitors = JSON.parse(monitorsCollector.text); + } + } + } + + Process { + id: getLayers + command: ["hyprctl", "layers", "-j"] + stdout: StdioCollector { + id: layersCollector + onStreamFinished: { + root.layers = JSON.parse(layersCollector.text); + } + } + } + + Process { + id: getWorkspaces + command: ["hyprctl", "workspaces", "-j"] + stdout: StdioCollector { + id: workspacesCollector + onStreamFinished: { + const rawWorkspaces = JSON.parse(workspacesCollector.text); + root.allWorkspaces = rawWorkspaces; + root.workspaces = rawWorkspaces.filter(ws => ws.id >= 1 && ws.id <= 100); + let tempWorkspaceById = {}; + for (var i = 0; i < root.workspaces.length; ++i) { + var ws = root.workspaces[i]; + tempWorkspaceById[ws.id] = ws; + } + root.workspaceById = tempWorkspaceById; + root.workspaceIds = root.workspaces.map(ws => ws.id); + } + } + } + + Process { + id: getActiveWorkspace + command: ["hyprctl", "activeworkspace", "-j"] + stdout: StdioCollector { + id: activeWorkspaceCollector + onStreamFinished: { + root.activeWorkspace = JSON.parse(activeWorkspaceCollector.text); + } + } + } +} |
