Close the panel when a tray item is selected

Selecting a tile opened the app's menu while SimpleTopBar's own panel
stayed on top of it, and could leave menus such as Spotlight stranded
behind it. Dismiss the panel first so the selected menu is unobstructed.

💘 Generated with Crush

Assisted-by: Crush:deepseek-v4.1-flash
This commit is contained in:
2026-09-27 10:26:09 +08:00
parent 29157c77fb
commit e465acba12
4 changed files with 19 additions and 1 deletions
+3
View File
@@ -141,6 +141,9 @@ preferred position controls where the hidden/kept boundary lands:
(`kAXPressAction`, then `kAXShowMenuAction`), and `resume()`s ~0.1s later. The (`kAXPressAction`, then `kAXShowMenuAction`), and `resume()`s ~0.1s later. The
menu is its own window anchored at the item's on-screen spot, so it survives menu is its own window anchored at the item's on-screen spot, so it survives
re-hiding. re-hiding.
- `press` first calls `onWillPress`, which `AppDelegate` wires to close the
popover. Without it the panel stays open on top of the menu that opens and can
leave menus (e.g. Spotlight) stranded behind it.
- **Cannot reveal a single icon.** The spacer hides a contiguous block to its - **Cannot reveal a single icon.** The spacer hides a contiguous block to its
left, so a press can only reveal the whole block. Isolating one item would left, so a press can only reveal the whole block. Isolating one item would
need either per-item ordering control (not available) or covering the icons need either per-item ordering control (not available) or covering the icons
+8
View File
@@ -132,6 +132,14 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
) )
) )
self.popover = popover self.popover = popover
// Selecting a tray item must dismiss our panel, otherwise it stays on
// top of the menu that opens (and can strand menus behind it).
Task { @MainActor [weak self] in
MenuBarItemManager.shared.onWillPress = {
self?.popover?.performClose(nil)
}
}
} }
@objc private func togglePopover() { @objc private func togglePopover() {
+7
View File
@@ -30,6 +30,9 @@ final class MenuBarItemManager: ObservableObject {
private var observers: [NSObjectProtocol] = [] private var observers: [NSObjectProtocol] = []
/// Called just before pressing an item so the owner can close its panel.
var onWillPress: (() -> Void)?
private init() {} private init() {}
func start() { func start() {
@@ -113,6 +116,10 @@ final class MenuBarItemManager: ObservableObject {
/// hide again shortly after. The reveal is momentary rather than lasting the /// hide again shortly after. The reveal is momentary rather than lasting the
/// whole time the panel is open. /// whole time the panel is open.
func press(_ item: MenuBarItem) { func press(_ item: MenuBarItem) {
// Close our own panel first, otherwise it stays open on top of the
// menu that is about to appear (and can leave menus behind it).
onWillPress?()
let hider = MenuBarHider.shared let hider = MenuBarHider.shared
let needsReveal = hider.isHiding let needsReveal = hider.isHiding
guard needsReveal else { guard needsReveal else {
+1 -1
View File
@@ -2,7 +2,7 @@
set -euo pipefail set -euo pipefail
cd "$(dirname "$0")" cd "$(dirname "$0")"
VERSION="${1:-0.4.2}" VERSION="${1:-0.4.3}"
swift build -c release swift build -c release