aboutsummaryrefslogtreecommitdiffstats
path: root/vm-manager/VmPanel.qml
diff options
context:
space:
mode:
Diffstat (limited to 'vm-manager/VmPanel.qml')
-rw-r--r--vm-manager/VmPanel.qml35
1 files changed, 34 insertions, 1 deletions
diff --git a/vm-manager/VmPanel.qml b/vm-manager/VmPanel.qml
index 7aecaab..cf224d6 100644
--- a/vm-manager/VmPanel.qml
+++ b/vm-manager/VmPanel.qml
@@ -78,6 +78,20 @@ Scope {
else Virsh.act(vm, action);
}
+ // Quickshell exits once no window is visible, and the drawer is closed
+ // most of the time, so a 1x1 transparent window holds the process open.
+ // Without it the shell quits and the keybind, which reaches it over IPC,
+ // has nothing left to talk to.
+ PanelWindow {
+ visible: true
+ implicitWidth: 1
+ implicitHeight: 1
+ color: "transparent"
+ exclusionMode: ExclusionMode.Ignore
+ mask: Region {}
+ WlrLayershell.keyboardFocus: WlrKeyboardFocus.None
+ }
+
LazyLoader {
active: root.open
@@ -102,7 +116,26 @@ Scope {
MouseArea { anchors.fill: parent; onClicked: root.close() }
}
- Keys.onEscapePressed: root.confirming ? root.confirming = null : root.close()
+ // Keys reach an item, not the window, so something inside has to
+ // hold focus. The TextInput in a delete confirmation takes it when
+ // it appears; this takes it back whenever that is gone.
+ Item {
+ id: keyCatcher
+ anchors.fill: parent
+ focus: true
+
+ Keys.onEscapePressed: {
+ if (root.confirming) root.confirming = null;
+ else root.close();
+ }
+
+ Connections {
+ target: root
+ function onConfirmingChanged() {
+ if (!root.confirming) keyCatcher.forceActiveFocus();
+ }
+ }
+ }
Rectangle {
id: drawer