Prevent UI stuck state when switching between mini and notch recorders

This commit is contained in:
Beingpax 2025-11-01 10:14:17 +05:45
parent b02a22cb95
commit 4bff63dc00
5 changed files with 22 additions and 13 deletions

View File

@ -32,17 +32,17 @@ class MiniWindowManager: ObservableObject {
} }
func show() { func show() {
if isVisible { return } if isVisible { return }
let activeScreen = NSApp.keyWindow?.screen ?? NSScreen.main ?? NSScreen.screens[0] let activeScreen = NSApp.keyWindow?.screen ?? NSScreen.main ?? NSScreen.screens[0]
initializeWindow(screen: activeScreen) initializeWindow(screen: activeScreen)
self.isVisible = true self.isVisible = true
miniPanel?.show() miniPanel?.show()
} }
func hide() { func hide() {
guard isVisible else { return } guard isVisible else { return }
self.isVisible = false self.isVisible = false
self.miniPanel?.hide { [weak self] in self.miniPanel?.hide { [weak self] in
guard let self = self else { return } guard let self = self else { return }
@ -70,6 +70,7 @@ class MiniWindowManager: ObservableObject {
} }
private func deinitializeWindow() { private func deinitializeWindow() {
miniPanel?.orderOut(nil)
windowController?.close() windowController?.close()
windowController = nil windowController = nil
miniPanel = nil miniPanel = nil

View File

@ -69,9 +69,7 @@ class NotchRecorderPanel: KeyablePanel {
// Make window transparent to mouse events except for the content // Make window transparent to mouse events except for the content
self.ignoresMouseEvents = false self.ignoresMouseEvents = false
self.isMovable = false self.isMovable = false
print("NotchRecorderPanel initialized")
NotificationCenter.default.addObserver( NotificationCenter.default.addObserver(
self, self,
selector: #selector(handleScreenParametersChange), selector: #selector(handleScreenParametersChange),

View File

@ -41,11 +41,9 @@ class NotchWindowManager: ObservableObject {
func hide() { func hide() {
guard isVisible else { return } guard isVisible else { return }
// Remove animation for instant state change
self.isVisible = false self.isVisible = false
// Don't wait for animation, clean up immediately
self.notchPanel?.hide { [weak self] in self.notchPanel?.hide { [weak self] in
guard let self = self else { return } guard let self = self else { return }
self.deinitializeWindow() self.deinitializeWindow()
@ -72,6 +70,7 @@ class NotchWindowManager: ObservableObject {
} }
private func deinitializeWindow() { private func deinitializeWindow() {
notchPanel?.orderOut(nil)
windowController?.close() windowController?.close()
windowController = nil windowController = nil
notchPanel = nil notchPanel = nil

View File

@ -12,13 +12,11 @@ extension WhisperState {
if recorderType == "notch" { if recorderType == "notch" {
if notchWindowManager == nil { if notchWindowManager == nil {
notchWindowManager = NotchWindowManager(whisperState: self, recorder: recorder) notchWindowManager = NotchWindowManager(whisperState: self, recorder: recorder)
logger.info("Created new notch window manager")
} }
notchWindowManager?.show() notchWindowManager?.show()
} else { } else {
if miniWindowManager == nil { if miniWindowManager == nil {
miniWindowManager = MiniWindowManager(whisperState: self, recorder: recorder) miniWindowManager = MiniWindowManager(whisperState: self, recorder: recorder)
logger.info("Created new mini window manager")
} }
miniWindowManager?.show() miniWindowManager?.show()
} }

View File

@ -31,6 +31,19 @@ class WhisperState: NSObject, ObservableObject {
@Published var recorderType: String = UserDefaults.standard.string(forKey: "RecorderType") ?? "mini" { @Published var recorderType: String = UserDefaults.standard.string(forKey: "RecorderType") ?? "mini" {
didSet { didSet {
if isMiniRecorderVisible {
if oldValue == "notch" {
notchWindowManager?.hide()
notchWindowManager = nil
} else {
miniWindowManager?.hide()
miniWindowManager = nil
}
Task { @MainActor in
try? await Task.sleep(nanoseconds: 50_000_000)
showRecorderPanel()
}
}
UserDefaults.standard.set(recorderType, forKey: "RecorderType") UserDefaults.standard.set(recorderType, forKey: "RecorderType")
} }
} }