Fix activation policy race condition and auto-restore accessory mode on window close
This commit is contained in:
parent
18464df195
commit
b4b3920bc3
@ -16,6 +16,26 @@ class MenuBarManager: ObservableObject {
|
||||
init() {
|
||||
self.isMenuBarOnly = UserDefaults.standard.bool(forKey: "IsMenuBarOnly")
|
||||
updateAppActivationPolicy()
|
||||
|
||||
NotificationCenter.default.addObserver(
|
||||
self,
|
||||
selector: #selector(windowDidClose),
|
||||
name: NSWindow.willCloseNotification,
|
||||
object: nil
|
||||
)
|
||||
}
|
||||
|
||||
@objc private func windowDidClose(_ notification: Notification) {
|
||||
guard isMenuBarOnly else { return }
|
||||
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
|
||||
let hasVisibleWindows = NSApplication.shared.windows.contains {
|
||||
$0.isVisible && $0.level == .normal && !$0.styleMask.contains(.nonactivatingPanel)
|
||||
}
|
||||
if !hasVisibleWindows {
|
||||
NSApplication.shared.setActivationPolicy(.accessory)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func configure(modelContainer: ModelContainer, whisperState: WhisperState) {
|
||||
@ -32,11 +52,9 @@ class MenuBarManager: ObservableObject {
|
||||
}
|
||||
|
||||
func focusMainWindow() {
|
||||
applyActivationPolicy()
|
||||
DispatchQueue.main.async {
|
||||
if WindowManager.shared.showMainWindow() == nil {
|
||||
print("MenuBarManager: Unable to locate main window to focus")
|
||||
}
|
||||
NSApplication.shared.setActivationPolicy(.regular)
|
||||
if WindowManager.shared.showMainWindow() == nil {
|
||||
print("MenuBarManager: Unable to locate main window to focus")
|
||||
}
|
||||
}
|
||||
|
||||
@ -63,25 +81,21 @@ class MenuBarManager: ObservableObject {
|
||||
func openMainWindowAndNavigate(to destination: String) {
|
||||
print("MenuBarManager: Navigating to \(destination)")
|
||||
|
||||
DispatchQueue.main.async { [weak self] in
|
||||
guard let self = self else { return }
|
||||
NSApplication.shared.setActivationPolicy(.regular)
|
||||
|
||||
self.applyActivationPolicy()
|
||||
guard WindowManager.shared.showMainWindow() != nil else {
|
||||
print("MenuBarManager: Unable to show main window for navigation")
|
||||
return
|
||||
}
|
||||
|
||||
guard WindowManager.shared.showMainWindow() != nil else {
|
||||
print("MenuBarManager: Unable to show main window for navigation")
|
||||
return
|
||||
}
|
||||
|
||||
// Post a notification to navigate to the desired destination
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
|
||||
NotificationCenter.default.post(
|
||||
name: .navigateToDestination,
|
||||
object: nil,
|
||||
userInfo: ["destination": destination]
|
||||
)
|
||||
print("MenuBarManager: Posted navigation notification for \(destination)")
|
||||
}
|
||||
// Post a notification to navigate to the desired destination
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
|
||||
NotificationCenter.default.post(
|
||||
name: .navigateToDestination,
|
||||
object: nil,
|
||||
userInfo: ["destination": destination]
|
||||
)
|
||||
print("MenuBarManager: Posted navigation notification for \(destination)")
|
||||
}
|
||||
}
|
||||
|
||||
@ -91,6 +105,7 @@ class MenuBarManager: ObservableObject {
|
||||
print("MenuBarManager: Dependencies not configured")
|
||||
return
|
||||
}
|
||||
NSApplication.shared.setActivationPolicy(.regular)
|
||||
HistoryWindowController.shared.showHistoryWindow(
|
||||
modelContainer: modelContainer,
|
||||
whisperState: whisperState
|
||||
|
||||
@ -107,13 +107,13 @@ class WindowManager: NSObject {
|
||||
if let window = mainWindow {
|
||||
return window
|
||||
}
|
||||
|
||||
|
||||
if let window = NSApplication.shared.windows.first(where: { $0.identifier == Self.mainWindowIdentifier }) {
|
||||
mainWindow = window
|
||||
window.delegate = self
|
||||
return window
|
||||
}
|
||||
|
||||
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user