diff --git a/apps/macos/Sources/Clawdis/AppState.swift b/apps/macos/Sources/Clawdis/AppState.swift index b17873434..e96401baf 100644 --- a/apps/macos/Sources/Clawdis/AppState.swift +++ b/apps/macos/Sources/Clawdis/AppState.swift @@ -106,6 +106,7 @@ final class AppState: ObservableObject { @Published var isWorking: Bool = false @Published var earBoostActive: Bool = false + @Published var blinkTick: Int = 0 @Published var heartbeatsEnabled: Bool { didSet { UserDefaults.standard.set(self.heartbeatsEnabled, forKey: heartbeatsEnabledKey) @@ -228,6 +229,10 @@ final class AppState: ObservableObject { self.earBoostActive = false } + func blinkOnce() { + self.blinkTick &+= 1 + } + func setVoiceWakeEnabled(_ enabled: Bool) async { guard voiceWakeSupported else { self.swabbleEnabled = false diff --git a/apps/macos/Sources/Clawdis/MenuBar.swift b/apps/macos/Sources/Clawdis/MenuBar.swift index 52f6ce21e..b66c905bb 100644 --- a/apps/macos/Sources/Clawdis/MenuBar.swift +++ b/apps/macos/Sources/Clawdis/MenuBar.swift @@ -26,6 +26,7 @@ struct ClawdisApp: App { isPaused: self.state.isPaused, isWorking: self.state.isWorking, earBoostActive: self.state.earBoostActive, + blinkTick: self.state.blinkTick, relayStatus: self.relayManager.status, animationsEnabled: self.state.iconAnimationsEnabled) } @@ -344,6 +345,7 @@ private struct CritterStatusLabel: View { var isPaused: Bool var isWorking: Bool var earBoostActive: Bool + var blinkTick: Int var relayStatus: RelayProcessManager.Status var animationsEnabled: Bool @@ -400,16 +402,17 @@ private struct CritterStatusLabel: View { self.nextEarWiggle = now.addingTimeInterval(Double.random(in: 7.0...14.0)) } - if self.isWorking { - self.scurry() - } + if self.isWorking { + self.scurry() } - .onChange(of: self.isPaused) { _, _ in self.resetMotion() } - .onChange(of: self.animationsEnabled) { _, enabled in - if enabled { - self.scheduleRandomTimers(from: Date()) - } else { - self.resetMotion() + } + .onChange(of: self.isPaused) { _, _ in self.resetMotion() } + .onChange(of: self.blinkTick) { _, _ in self.blink() } + .onChange(of: self.animationsEnabled) { _, enabled in + if enabled { + self.scheduleRandomTimers(from: Date()) + } else { + self.resetMotion() } } } diff --git a/apps/macos/Sources/Clawdis/VoiceWakeOverlay.swift b/apps/macos/Sources/Clawdis/VoiceWakeOverlay.swift index b5f84c1a6..b7c2c2dc1 100644 --- a/apps/macos/Sources/Clawdis/VoiceWakeOverlay.swift +++ b/apps/macos/Sources/Clawdis/VoiceWakeOverlay.swift @@ -139,6 +139,9 @@ final class VoiceWakeOverlayController: ObservableObject { window.orderOut(nil) self.model.isVisible = false self.model.level = 0 + if outcome == .empty { + AppStateStore.shared.blinkOnce() + } AppStateStore.shared.stopVoiceEars() } }