mirror of
https://github.com/end-4/dots-hyprland.git
synced 2026-06-15 03:04:31 +10:00
78 lines
2.7 KiB
QML
78 lines
2.7 KiB
QML
pragma ComponentBehavior: Bound
|
|
import qs
|
|
import qs.services
|
|
import qs.modules.common
|
|
import qs.modules.common.functions
|
|
import qs.modules.common.panels.lock
|
|
import QtQuick
|
|
import Quickshell
|
|
import Quickshell.Hyprland
|
|
|
|
LockScreen {
|
|
id: root
|
|
|
|
// Monitor name -> workspace id to restore on unlock (set when locking)
|
|
property var savedWorkspaces: ({})
|
|
|
|
Timer {
|
|
id: restoreTimer
|
|
interval: 150
|
|
repeat: false
|
|
onTriggered: {
|
|
var batch = ""
|
|
for (var j = 0; j < Quickshell.screens.length; ++j) {
|
|
var monName = Quickshell.screens[j].name
|
|
var wsId = root.savedWorkspaces[monName]
|
|
if (wsId !== undefined) {
|
|
batch += "dispatch focusmonitor " + monName + "; dispatch workspace " + wsId + "; "
|
|
}
|
|
}
|
|
if (batch.length > 0) {
|
|
Quickshell.execDetached(["hyprctl", "--batch", batch + "reload"])
|
|
}
|
|
}
|
|
}
|
|
|
|
lockSurface: LockSurface {
|
|
context: root.context
|
|
}
|
|
|
|
// Single batch for lock and unlock so we don't race multiple hyprctl calls
|
|
Connections {
|
|
target: GlobalStates
|
|
function onScreenLockedChanged() {
|
|
if (GlobalStates.screenLocked) {
|
|
// Lock: save workspace per monitor and move all to temp workspace in one batch
|
|
var next = {}
|
|
var batch = "keyword animation workspaces,1,7,menu_decel,slidevert; "
|
|
for (var i = 0; i < Quickshell.screens.length; ++i) {
|
|
var mon = Quickshell.screens[i].name
|
|
var mData = HyprlandData.monitors.find(m => m.name === mon)
|
|
if (mData?.activeWorkspace == undefined) {
|
|
return;
|
|
}
|
|
var ws = (mData?.activeWorkspace?.id ?? 1)
|
|
next[mon] = ws
|
|
batch += "dispatch focusmonitor " + mon + "; dispatch workspace " + (2147483647 - ws) + "; "
|
|
}
|
|
root.savedWorkspaces = next
|
|
Quickshell.execDetached(["hyprctl", "--batch", batch + "reload"])
|
|
} else {
|
|
restoreTimer.start()
|
|
}
|
|
}
|
|
}
|
|
|
|
// Push everything down (visual only; workspace switch is in Connections above)
|
|
Variants {
|
|
model: Quickshell.screens
|
|
delegate: Scope {
|
|
required property ShellScreen modelData
|
|
property bool shouldPush: GlobalStates.screenLocked
|
|
property string targetMonitorName: modelData.name
|
|
property int verticalMovementDistance: modelData.height
|
|
property int horizontalSqueeze: modelData.width * 0.2
|
|
}
|
|
}
|
|
}
|