diff options
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 + } + } +} |