diff --git a/apps/macos/Sources/OpenClaw/NotifyOverlay.swift b/apps/macos/Sources/OpenClaw/NotifyOverlay.swift index d432f5a9a..280b7396a 100644 --- a/apps/macos/Sources/OpenClaw/NotifyOverlay.swift +++ b/apps/macos/Sources/OpenClaw/NotifyOverlay.swift @@ -61,9 +61,11 @@ final class NotifyOverlayController { self.ensureWindow() self.hostingView?.rootView = NotifyOverlayView(controller: self) let target = self.targetFrame() + let isFirst = !self.model.isVisible + if isFirst { self.model.isVisible = true } OverlayPanelFactory.present( window: self.window, - isVisible: &self.model.isVisible, + isFirstPresent: isFirst, target: target) { window in self.updateWindowFrame(animate: true) diff --git a/apps/macos/Sources/OpenClaw/OverlayPanelFactory.swift b/apps/macos/Sources/OpenClaw/OverlayPanelFactory.swift index 95f9ae863..53898cf27 100644 --- a/apps/macos/Sources/OpenClaw/OverlayPanelFactory.swift +++ b/apps/macos/Sources/OpenClaw/OverlayPanelFactory.swift @@ -64,15 +64,14 @@ enum OverlayPanelFactory { @MainActor static func present( window: NSWindow?, - isVisible: inout Bool, + isFirstPresent: Bool, target: NSRect, startOffsetY: CGFloat = -6, onFirstPresent: (() -> Void)? = nil, onAlreadyVisible: (NSWindow) -> Void) { guard let window else { return } - if !isVisible { - isVisible = true + if isFirstPresent { onFirstPresent?() let start = target.offsetBy(dx: 0, dy: startOffsetY) self.animatePresent(window: window, from: start, to: target) diff --git a/apps/macos/Sources/OpenClaw/TalkOverlay.swift b/apps/macos/Sources/OpenClaw/TalkOverlay.swift index f72871d28..660a615c7 100644 --- a/apps/macos/Sources/OpenClaw/TalkOverlay.swift +++ b/apps/macos/Sources/OpenClaw/TalkOverlay.swift @@ -30,9 +30,11 @@ final class TalkOverlayController { self.ensureWindow() self.hostingView?.rootView = TalkOverlayView(controller: self) let target = self.targetFrame() + let isFirst = !self.model.isVisible + if isFirst { self.model.isVisible = true } OverlayPanelFactory.present( window: self.window, - isVisible: &self.model.isVisible, + isFirstPresent: isFirst, target: target) { window in window.setFrame(target, display: true) diff --git a/apps/macos/Sources/OpenClaw/VoiceWakeOverlayController+Window.swift b/apps/macos/Sources/OpenClaw/VoiceWakeOverlayController+Window.swift index 9575dde52..23133811e 100644 --- a/apps/macos/Sources/OpenClaw/VoiceWakeOverlayController+Window.swift +++ b/apps/macos/Sources/OpenClaw/VoiceWakeOverlayController+Window.swift @@ -13,9 +13,11 @@ extension VoiceWakeOverlayController { self.ensureWindow() self.hostingView?.rootView = VoiceWakeOverlayView(controller: self) let target = self.targetFrame() + let isFirst = !self.model.isVisible + if isFirst { self.model.isVisible = true } OverlayPanelFactory.present( window: self.window, - isVisible: &self.model.isVisible, + isFirstPresent: isFirst, target: target, onFirstPresent: { self.logger.log(