From b4b3920bc3869184bb8adaca48d623eab5bdb92c Mon Sep 17 00:00:00 2001 From: Beingpax Date: Wed, 7 Jan 2026 09:40:29 +0545 Subject: [PATCH] Fix activation policy race condition and auto-restore accessory mode on window close --- VoiceInk/MenuBarManager.swift | 59 ++++++++++++++++++++++------------- VoiceInk/WindowManager.swift | 4 +-- 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/VoiceInk/MenuBarManager.swift b/VoiceInk/MenuBarManager.swift index 56d9ea2..c449342 100644 --- a/VoiceInk/MenuBarManager.swift +++ b/VoiceInk/MenuBarManager.swift @@ -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 diff --git a/VoiceInk/WindowManager.swift b/VoiceInk/WindowManager.swift index c7e1b6b..0ac4703 100644 --- a/VoiceInk/WindowManager.swift +++ b/VoiceInk/WindowManager.swift @@ -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 } }