mirror of
https://github.com/noctalia-dev/noctalia-shell.git
synced 2026-05-11 17:08:27 +08:00
80 lines
2.4 KiB
QML
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);
|
|
}
|
|
}
|