1 Commits
Author SHA1 Message Date
TZGyn 8d795d0a28 Give up focus when opening a tray menu
Closing the panel was not enough: SimpleTopBar stayed frontmost, so
Spotlight's search field never appeared. Deactivate the app when a tray
item is selected so transient panels can take focus, and allow a little
more time before the bar re-hides.

💘 Generated with Crush

Assisted-by: Crush:deepseek-v4.1-flash
2026-09-27 10:30:20 +08:00
4 changed files with 13 additions and 8 deletions
+2 -2
View File
@@ -142,8 +142,8 @@ preferred position controls where the hidden/kept boundary lands:
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 - `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 popover **and** `NSApp.deactivate()`. Closing alone left our app frontmost, so
leave menus (e.g. Spotlight) stranded behind it. transient items (Spotlight's search field) still would not appear.
- **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
+7 -2
View File
@@ -133,11 +133,16 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
) )
self.popover = popover self.popover = popover
// Selecting a tray item must dismiss our panel, otherwise it stays on // Selecting a tray item must dismiss our panel and give up focus,
// top of the menu that opens (and can strand menus behind it). // otherwise the panel stays on top of the menu and our app stays
// frontmost, which stops transient items (Spotlight's search field)
// from appearing at all.
Task { @MainActor [weak self] in Task { @MainActor [weak self] in
MenuBarItemManager.shared.onWillPress = { MenuBarItemManager.shared.onWillPress = {
self?.popover?.performClose(nil) self?.popover?.performClose(nil)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) {
NSApp.deactivate()
}
} }
} }
} }
+3 -3
View File
@@ -127,11 +127,11 @@ final class MenuBarItemManager: ObservableObject {
return return
} }
hider.suspend() hider.suspend()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) {
_ = self.performPress(item) _ = self.performPress(item)
// The menu is its own window, positioned at the item's on-screen // The menu is its own window, positioned at the item's on-screen
// spot, so the bar can be re-hidden almost immediately. // spot, so the bar can be re-hidden shortly after.
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) {
hider.resume() hider.resume()
} }
} }
+1 -1
View File
@@ -2,7 +2,7 @@
set -euo pipefail set -euo pipefail
cd "$(dirname "$0")" cd "$(dirname "$0")"
VERSION="${1:-0.4.3}" VERSION="${1:-0.4.4}"
swift build -c release swift build -c release