aboutsummaryrefslogtreecommitdiffstats
path: root/desktop/island/StatusPill.qml
diff options
context:
space:
mode:
Diffstat (limited to 'desktop/island/StatusPill.qml')
-rw-r--r--desktop/island/StatusPill.qml17
1 files changed, 15 insertions, 2 deletions
diff --git a/desktop/island/StatusPill.qml b/desktop/island/StatusPill.qml
index 915807b..99f1512 100644
--- a/desktop/island/StatusPill.qml
+++ b/desktop/island/StatusPill.qml
@@ -38,8 +38,17 @@ Capsule {
signal openHeadphones()
signal closePanel()
signal openDrawer()
- // Emitted just before a tray menu opens; the menu cannot report its close.
+ // A tray menu opening and closing. display() reports no close, so menus
+ // open through a QsMenuAnchor, whose closed fires on any dismissal: an
+ // entry picked (Quit included), Escape or a click elsewhere.
signal menuShown()
+ signal menuClosed()
+
+ QsMenuAnchor {
+ id: menuAnchor
+ anchor.window: pill.window
+ onClosed: pill.menuClosed()
+ }
expanded: panel === "sound" || panel === "headphones"
restWidth: restRow.implicitWidth + 24
@@ -100,8 +109,12 @@ Capsule {
if (!wantsMenu) { item.activate(); return; }
if (!item.hasMenu) return;
const p = trayIcon.mapToItem(null, 0, trayIcon.height + 6);
+ if (menuAnchor.visible) menuAnchor.close();
+ menuAnchor.menu = item.menu;
+ menuAnchor.anchor.rect.x = p.x;
+ menuAnchor.anchor.rect.y = p.y;
pill.menuShown();
- item.display(pill.window, p.x, p.y);
+ menuAnchor.open();
}
}
}