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:
@@ -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
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user