44 lines
1.4 KiB
QML
44 lines
1.4 KiB
QML
import QtQuick
|
|
|
|
// Hyprland leaves an already-mapped layer surface at its old global position
|
|
// when its monitor moves within the layout: undocking disables the internal
|
|
// panel, the external monitor shifts to x=0, and long-lived surfaces such as
|
|
// the bar and background keep rendering at the old offset — or entirely
|
|
// off-screen — until they are unmapped and remapped. Watch the screen's
|
|
// origin and pulse `remapping` when it moves; the owning window folds that
|
|
// into its `visible` binding so the compositor re-places the surface at the
|
|
// monitor's new origin.
|
|
Item {
|
|
id: root
|
|
|
|
required property var window
|
|
readonly property var screen: window ? window.screen : null
|
|
|
|
// Fold into the window's binding: visible: <shown> && !guard.remapping
|
|
property bool remapping: false
|
|
|
|
visible: false
|
|
|
|
// A layout reshuffle can move the monitor more than once before it lands.
|
|
// Let the positions settle before the single remap pulse.
|
|
Timer {
|
|
id: settleTimer
|
|
interval: 200
|
|
onTriggered: root.remapping = true
|
|
}
|
|
|
|
// Hold the surface unmapped for a beat so the compositor processes the
|
|
// unmap before the remap instead of coalescing them into a no-op.
|
|
Timer {
|
|
interval: 50
|
|
running: root.remapping
|
|
onTriggered: root.remapping = false
|
|
}
|
|
|
|
Connections {
|
|
target: root.screen
|
|
function onXChanged() { settleTimer.restart() }
|
|
function onYChanged() { settleTimer.restart() }
|
|
}
|
|
}
|