Make the menu bar icon visible on a full menu bar
New status items land leftmost, which on a notched Mac lands under the
notch and is invisible, so the app appeared broken. Replace MenuBarExtra
with a managed status item that carries an autosave name and a persisted
preferred position, and add a diagnostic dump to verify placement.
💘 Generated with Crush
Assisted-by: Crush:deepseek-v4.1-flash
This commit is contained in:
@@ -5,10 +5,12 @@ executable SwiftPM package, no external dependencies (all Apple frameworks).
|
||||
|
||||
## Architecture
|
||||
|
||||
- `Sources/SimpleTopBar/App.swift` — `@main` entry. `MenuBarExtra` with
|
||||
`.menuBarExtraStyle(.window)` hosting `TopBarView`. `AppDelegate` handles the
|
||||
`--self-test` flag and the single-instance guard. `LoginItem` wraps
|
||||
`SMAppService`.
|
||||
- `Sources/SimpleTopBar/App.swift` — `@main` entry using a bare
|
||||
`Settings { EmptyView() }` scene, because the app owns its status item
|
||||
manually instead of using `MenuBarExtra`. `AppDelegate.setupStatusItem()`
|
||||
creates the `NSStatusItem`, sets `autosaveName = "SimpleTopBar"`, and shows
|
||||
`TopBarView` inside an `NSPopover`. Handles `--self-test`, `--dump-items`,
|
||||
`--diag`, and the single-instance guard. `LoginItem` wraps `SMAppService`.
|
||||
- `Sources/SimpleTopBar/AppListModel.swift` — `@MainActor` `ObservableObject`
|
||||
singleton. `refresh()` reads `NSWorkspace.shared.runningApplications` and
|
||||
splits them by `activationPolicy` into `regularApps` and `backgroundApps`
|
||||
@@ -93,6 +95,23 @@ wants it in the final answer every time. Keep it to the cask upgrade commands
|
||||
(see the README release section for the exact block), because the app is
|
||||
installed through the tap.
|
||||
|
||||
## Status item placement (why not MenuBarExtra)
|
||||
|
||||
On a full menu bar, a newly created status item is placed leftmost, which on a
|
||||
notched MacBook is under the notch and therefore invisible. `MenuBarExtra` gives
|
||||
no control over this, so the app creates its own `NSStatusItem` and:
|
||||
|
||||
- Sets `autosaveName = "SimpleTopBar"`.
|
||||
- On first run, writes `"NSStatusItem Preferred Position SimpleTopBar" = 100`
|
||||
into `UserDefaults.standard`. This private-ish key is what macOS reads to
|
||||
place the item, and 100 lands it at the visible right side. Because it is only
|
||||
written when absent, the user's own ⌘-drag wins and persists via the autosave
|
||||
name.
|
||||
|
||||
`--diag` runs full startup and writes every status item's AX position to
|
||||
`/tmp/simpletopbar-items.txt`; use it to verify the icon is not under the notch
|
||||
(x should be ~1200, not ~765).
|
||||
|
||||
## Gotchas
|
||||
|
||||
- `AppListModel` is `@MainActor`; the `NSWorkspace` observers hop back with
|
||||
|
||||
Reference in New Issue
Block a user