Remap bar and background surfaces when their monitor moves
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 the bar and background keep rendering at the old offset until unmapped and remapped. Watch each screen's origin and briefly unmap the window when it moves so the compositor re-places the surface at the monitor's new origin. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
b538dd545a
commit
2daeaa7078
@@ -0,0 +1,43 @@
|
||||
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() }
|
||||
}
|
||||
}
|
||||
@@ -24,6 +24,7 @@ PanelSeparator 1.0 PanelSeparator.qml
|
||||
PanelSlider 1.0 PanelSlider.qml
|
||||
PanelToolTip 1.0 PanelToolTip.qml
|
||||
PointerMoveGate 1.0 PointerMoveGate.qml
|
||||
ScreenMoveRemap 1.0 ScreenMoveRemap.qml
|
||||
PopupCard 1.0 PopupCard.qml
|
||||
SearchableDropdown 1.0 SearchableDropdown.qml
|
||||
TextField 1.0 TextField.qml
|
||||
|
||||
Reference in New Issue
Block a user