diff options
| author | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-08-24 14:14:30 +1000 |
|---|---|---|
| committer | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-08-24 14:14:30 +1000 |
| commit | d1e5f484461e27133317c78b81347d05dc3a2760 (patch) | |
| tree | 7e84f152a66b69366d6abb67af63ec7306fca7bd /services/Hypr.qml | |
| parent | [CI] chore: update flake (diff) | |
| download | caelestia-shell-d1e5f484461e27133317c78b81347d05dc3a2760.tar.gz caelestia-shell-d1e5f484461e27133317c78b81347d05dc3a2760.tar.bz2 caelestia-shell-d1e5f484461e27133317c78b81347d05dc3a2760.zip | |
internal: rename Hyprland -> Hypr
Prevent shadowing
Fixes window info not changing on switching to an empty workspace
Diffstat (limited to 'services/Hypr.qml')
| -rw-r--r-- | services/Hypr.qml | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/services/Hypr.qml b/services/Hypr.qml new file mode 100644 index 0000000..0f31453 --- /dev/null +++ b/services/Hypr.qml @@ -0,0 +1,69 @@ +pragma Singleton + +import Quickshell +import Quickshell.Hyprland +import Quickshell.Io +import QtQuick + +Singleton { + id: root + + readonly property var toplevels: Hyprland.toplevels + readonly property var workspaces: Hyprland.workspaces + readonly property var monitors: Hyprland.monitors + + readonly property HyprlandToplevel activeToplevel: { + const t = Hyprland.activeToplevel; + if (t?.workspace?.focused || t?.workspace?.name.startsWith("special:")) + return t; + return null; + } + readonly property HyprlandWorkspace focusedWorkspace: Hyprland.focusedWorkspace + readonly property HyprlandMonitor focusedMonitor: Hyprland.focusedMonitor + + readonly property int activeWsId: focusedWorkspace?.id ?? 1 + readonly property string kbLayout: kbLayoutFull.slice(0, 2).toLowerCase() + property string kbLayoutFull: "?" + + function dispatch(request: string): void { + Hyprland.dispatch(request); + } + + function monitorFor(screen: ShellScreen): HyprlandMonitor { + return Hyprland.monitorFor(screen); + } + + Connections { + target: Hyprland + + function onRawEvent(event: HyprlandEvent): void { + const n = event.name; + if (n.endsWith("v2")) + return; + + if (n === "activelayout") { + root.kbLayoutFull = event.parse(2)[1]; + } else if (["workspace", "moveworkspace", "activespecial", "focusedmon"].includes(n)) { + Hyprland.refreshWorkspaces(); + Hyprland.refreshMonitors(); + } else if (["openwindow", "closewindow", "movewindow"].includes(n)) { + Hyprland.refreshToplevels(); + Hyprland.refreshWorkspaces(); + } else if (n.includes("mon")) { + Hyprland.refreshMonitors(); + } else if (n.includes("workspace")) { + Hyprland.refreshWorkspaces(); + } else if (n.includes("window") || n.includes("group") || ["pin", "fullscreen", "changefloatingmode", "minimize"].includes(n)) { + Hyprland.refreshToplevels(); + } + } + } + + Process { + running: true + command: ["hyprctl", "-j", "devices"] + stdout: StdioCollector { + onStreamFinished: root.kbLayoutFull = JSON.parse(text).keyboards.find(k => k.main).active_keymap + } + } +} |