Files
noctalia-shell/Modules/MainScreen/BarTriggerZone.qml
T

80 lines
2.4 KiB
QML

import QtQuick
import Quickshell
import Quickshell.Wayland
import qs.Commons
import qs.Services.UI
/**
* BarTriggerZone - Thin invisible window at screen edge to reveal hidden bar
*
* This window is only active when the bar is in auto-hide mode and hidden.
* When the mouse enters this zone, it triggers the bar to show.
*/
PanelWindow {
id: root
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
readonly property bool barIsVertical: barPosition === "left" || barPosition === "right"
readonly property int triggerSize: 1
// Track if component is being destroyed to prevent signals during cleanup
property bool isBeingDestroyed: false
Component.onDestruction: isBeingDestroyed = true
// Invisible trigger zone
color: "transparent"
focusable: false
WlrLayershell.namespace: "noctalia-bar-trigger-" + (screen?.name || "unknown")
WlrLayershell.layer: WlrLayer.Top
WlrLayershell.exclusionMode: ExclusionMode.Ignore
// Anchor to bar's edge
anchors {
top: barPosition === "top" || barIsVertical
bottom: barPosition === "bottom" || barIsVertical
left: barPosition === "left" || !barIsVertical
right: barPosition === "right" || !barIsVertical
}
// Size based on orientation - thin strip at edge
implicitWidth: barIsVertical ? triggerSize : 0
implicitHeight: !barIsVertical ? triggerSize : 0
MouseArea {
id: triggerArea
anchors.fill: parent
hoverEnabled: true
// Default MouseArea only accepts left; right/middle would fall through to Qt Quick's
// Wayland context-menu delivery, which can SIGSEGV in contextMenuTargets/mapToScene.
acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
onPressed: function (mouse) {
if (mouse.button === Qt.RightButton || mouse.button === Qt.MiddleButton)
mouse.accepted = true;
}
onClicked: function (mouse) {
if (mouse.button === Qt.RightButton || mouse.button === Qt.MiddleButton)
mouse.accepted = true;
}
onEntered: {
if (root.isBeingDestroyed)
return;
// Signal hover - BarContentWindow will handle the show delay
BarService.setScreenHovered(root.screen?.name, true);
}
onExited: {
if (root.isBeingDestroyed)
return;
BarService.setScreenHovered(root.screen?.name, false);
}
}
Component.onCompleted: {
Logger.d("BarTriggerZone", "Created for screen:", screen?.name);
}
}