mirror of
https://github.com/FBukovina/Atoll.git
synced 2026-10-27 15:14:33 +00:00
Fix: Shortcut interference
This commit is contained in:
parent
317ac585ed
commit
872d8965a3
1 changed files with 109 additions and 60 deletions
|
|
@ -107,6 +107,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
|
||||||
private var onboardingWindowController: NSWindowController?
|
private var onboardingWindowController: NSWindowController?
|
||||||
private var cancellables = Set<AnyCancellable>()
|
private var cancellables = Set<AnyCancellable>()
|
||||||
private var windowsHiddenForLock = false
|
private var windowsHiddenForLock = false
|
||||||
|
private var optionalShortcutHandlersRegistered = false
|
||||||
|
|
||||||
// Debouncing mechanism for window size updates
|
// Debouncing mechanism for window size updates
|
||||||
private var windowSizeUpdateWorkItem: DispatchWorkItem?
|
private var windowSizeUpdateWorkItem: DispatchWorkItem?
|
||||||
|
|
@ -433,8 +434,36 @@ class AppDelegate: NSObject, NSApplicationDelegate {
|
||||||
}
|
}
|
||||||
.store(in: &cancellables)
|
.store(in: &cancellables)
|
||||||
|
|
||||||
Defaults.publisher(.enableShortcuts, options: []).sink { change in
|
Defaults.publisher(.enableShortcuts, options: []).sink { [weak self] change in
|
||||||
KeyboardShortcuts.isEnabled = change.newValue
|
Task { @MainActor [weak self] in
|
||||||
|
guard let self else { return }
|
||||||
|
KeyboardShortcuts.isEnabled = change.newValue
|
||||||
|
self.updateFeatureShortcutAvailability()
|
||||||
|
}
|
||||||
|
}.store(in: &cancellables)
|
||||||
|
|
||||||
|
Defaults.publisher(.enableTimerFeature, options: []).sink { [weak self] _ in
|
||||||
|
Task { @MainActor [weak self] in
|
||||||
|
self?.updateFeatureShortcutAvailability()
|
||||||
|
}
|
||||||
|
}.store(in: &cancellables)
|
||||||
|
|
||||||
|
Defaults.publisher(.enableClipboardManager, options: []).sink { [weak self] _ in
|
||||||
|
Task { @MainActor [weak self] in
|
||||||
|
self?.updateFeatureShortcutAvailability()
|
||||||
|
}
|
||||||
|
}.store(in: &cancellables)
|
||||||
|
|
||||||
|
Defaults.publisher(.enableColorPickerFeature, options: []).sink { [weak self] _ in
|
||||||
|
Task { @MainActor [weak self] in
|
||||||
|
self?.updateFeatureShortcutAvailability()
|
||||||
|
}
|
||||||
|
}.store(in: &cancellables)
|
||||||
|
|
||||||
|
Defaults.publisher(.enableScreenAssistant, options: []).sink { [weak self] _ in
|
||||||
|
Task { @MainActor [weak self] in
|
||||||
|
self?.updateFeatureShortcutAvailability()
|
||||||
|
}
|
||||||
}.store(in: &cancellables)
|
}.store(in: &cancellables)
|
||||||
|
|
||||||
// Observe minimalistic UI setting changes - trigger window resize
|
// Observe minimalistic UI setting changes - trigger window resize
|
||||||
|
|
@ -519,7 +548,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
|
||||||
self, selector: #selector(onScreenUnlocked(_:)),
|
self, selector: #selector(onScreenUnlocked(_:)),
|
||||||
name: NSNotification.Name(rawValue: "com.apple.screenIsUnlocked"), object: nil)
|
name: NSNotification.Name(rawValue: "com.apple.screenIsUnlocked"), object: nil)
|
||||||
|
|
||||||
_ = KeyboardShortcuts.onKeyDown(for: .toggleSneakPeek) { [weak self] in
|
KeyboardShortcuts.onKeyDown(for: .toggleSneakPeek) { [weak self] in
|
||||||
guard let self = self else { return }
|
guard let self = self else { return }
|
||||||
guard Defaults[.enableShortcuts] else { return }
|
guard Defaults[.enableShortcuts] else { return }
|
||||||
|
|
||||||
|
|
@ -530,7 +559,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
_ = KeyboardShortcuts.onKeyDown(for: .toggleNotchOpen) { [weak self] in
|
KeyboardShortcuts.onKeyDown(for: .toggleNotchOpen) { [weak self] in
|
||||||
guard let self = self else { return }
|
guard let self = self else { return }
|
||||||
guard Defaults[.enableShortcuts] else { return }
|
guard Defaults[.enableShortcuts] else { return }
|
||||||
|
|
||||||
|
|
@ -567,74 +596,9 @@ class AppDelegate: NSObject, NSApplicationDelegate {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_ = KeyboardShortcuts.onKeyDown(for: .startDemoTimer) {
|
|
||||||
guard Defaults[.enableShortcuts] else { return }
|
|
||||||
guard Defaults[.enableTimerFeature] else { return }
|
|
||||||
TimerManager.shared.startDemoTimer(duration: 300)
|
|
||||||
}
|
|
||||||
|
|
||||||
_ = KeyboardShortcuts.onKeyDown(for: .clipboardHistoryPanel) { [weak self] in
|
|
||||||
guard let self = self else { return }
|
|
||||||
guard Defaults[.enableShortcuts] else { return }
|
|
||||||
guard Defaults[.enableClipboardManager] else { return }
|
|
||||||
|
|
||||||
if !ClipboardManager.shared.isMonitoring {
|
|
||||||
ClipboardManager.shared.startMonitoring()
|
|
||||||
}
|
|
||||||
|
|
||||||
switch Defaults[.clipboardDisplayMode] {
|
|
||||||
case .panel:
|
|
||||||
ClipboardPanelManager.shared.toggleClipboardPanel()
|
|
||||||
case .popover:
|
|
||||||
if self.vm.notchState == .closed {
|
|
||||||
self.vm.open()
|
|
||||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
|
|
||||||
NotificationCenter.default.post(name: NSNotification.Name("ToggleClipboardPopover"), object: nil)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
NotificationCenter.default.post(name: NSNotification.Name("ToggleClipboardPopover"), object: nil)
|
|
||||||
}
|
|
||||||
case .separateTab:
|
|
||||||
if self.vm.notchState == .closed {
|
|
||||||
self.vm.open()
|
|
||||||
self.coordinator.currentView = .notes
|
|
||||||
} else {
|
|
||||||
if self.coordinator.currentView == .notes {
|
|
||||||
self.vm.close()
|
|
||||||
} else {
|
|
||||||
self.coordinator.currentView = .notes
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_ = KeyboardShortcuts.onKeyDown(for: .colorPickerPanel) {
|
|
||||||
guard Defaults[.enableShortcuts] else { return }
|
|
||||||
guard Defaults[.enableColorPickerFeature] else { return }
|
|
||||||
ColorPickerPanelManager.shared.toggleColorPickerPanel()
|
|
||||||
}
|
|
||||||
|
|
||||||
_ = KeyboardShortcuts.onKeyDown(for: .screenAssistantPanel) { [weak self] in
|
|
||||||
guard let self = self else { return }
|
|
||||||
guard Defaults[.enableShortcuts] else { return }
|
|
||||||
guard Defaults[.enableScreenAssistant] else { return }
|
|
||||||
|
|
||||||
switch Defaults[.screenAssistantDisplayMode] {
|
|
||||||
case .panel:
|
|
||||||
ScreenAssistantPanelManager.shared.toggleScreenAssistantPanel()
|
|
||||||
case .popover:
|
|
||||||
if self.vm.notchState == .closed {
|
|
||||||
self.vm.open()
|
|
||||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
|
|
||||||
NotificationCenter.default.post(name: NSNotification.Name("ToggleScreenAssistantPopover"), object: nil)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
NotificationCenter.default.post(name: NSNotification.Name("ToggleScreenAssistantPopover"), object: nil)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
KeyboardShortcuts.isEnabled = Defaults[.enableShortcuts]
|
KeyboardShortcuts.isEnabled = Defaults[.enableShortcuts]
|
||||||
|
registerOptionalShortcutHandlers()
|
||||||
|
updateFeatureShortcutAvailability()
|
||||||
|
|
||||||
if !Defaults[.showOnAllDisplays] {
|
if !Defaults[.showOnAllDisplays] {
|
||||||
let viewModel = self.vm
|
let viewModel = self.vm
|
||||||
|
|
@ -670,6 +634,91 @@ class AppDelegate: NSObject, NSApplicationDelegate {
|
||||||
// Ensure the reminder widget mirrors live activity snapshots as soon as they exist.
|
// Ensure the reminder widget mirrors live activity snapshots as soon as they exist.
|
||||||
_ = LockScreenReminderWidgetManager.shared
|
_ = LockScreenReminderWidgetManager.shared
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func registerOptionalShortcutHandlers() {
|
||||||
|
guard !optionalShortcutHandlersRegistered else { return }
|
||||||
|
optionalShortcutHandlersRegistered = true
|
||||||
|
|
||||||
|
KeyboardShortcuts.onKeyDown(for: .startDemoTimer) {
|
||||||
|
guard Defaults[.enableShortcuts], Defaults[.enableTimerFeature] else { return }
|
||||||
|
TimerManager.shared.startDemoTimer(duration: 300)
|
||||||
|
}
|
||||||
|
|
||||||
|
KeyboardShortcuts.onKeyDown(for: .clipboardHistoryPanel) { [weak self] in
|
||||||
|
guard let self else { return }
|
||||||
|
guard Defaults[.enableShortcuts], Defaults[.enableClipboardManager] else { return }
|
||||||
|
|
||||||
|
if !ClipboardManager.shared.isMonitoring {
|
||||||
|
ClipboardManager.shared.startMonitoring()
|
||||||
|
}
|
||||||
|
|
||||||
|
switch Defaults[.clipboardDisplayMode] {
|
||||||
|
case .panel:
|
||||||
|
ClipboardPanelManager.shared.toggleClipboardPanel()
|
||||||
|
case .popover:
|
||||||
|
if vm.notchState == .closed {
|
||||||
|
vm.open()
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
|
||||||
|
NotificationCenter.default.post(name: NSNotification.Name("ToggleClipboardPopover"), object: nil)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
NotificationCenter.default.post(name: NSNotification.Name("ToggleClipboardPopover"), object: nil)
|
||||||
|
}
|
||||||
|
case .separateTab:
|
||||||
|
if vm.notchState == .closed {
|
||||||
|
vm.open()
|
||||||
|
coordinator.currentView = .notes
|
||||||
|
} else {
|
||||||
|
if coordinator.currentView == .notes {
|
||||||
|
vm.close()
|
||||||
|
} else {
|
||||||
|
coordinator.currentView = .notes
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
KeyboardShortcuts.onKeyDown(for: .colorPickerPanel) {
|
||||||
|
guard Defaults[.enableShortcuts], Defaults[.enableColorPickerFeature] else { return }
|
||||||
|
ColorPickerPanelManager.shared.toggleColorPickerPanel()
|
||||||
|
}
|
||||||
|
|
||||||
|
KeyboardShortcuts.onKeyDown(for: .screenAssistantPanel) { [weak self] in
|
||||||
|
guard let self else { return }
|
||||||
|
guard Defaults[.enableShortcuts], Defaults[.enableScreenAssistant] else { return }
|
||||||
|
|
||||||
|
switch Defaults[.screenAssistantDisplayMode] {
|
||||||
|
case .panel:
|
||||||
|
ScreenAssistantPanelManager.shared.toggleScreenAssistantPanel()
|
||||||
|
case .popover:
|
||||||
|
if vm.notchState == .closed {
|
||||||
|
vm.open()
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
|
||||||
|
NotificationCenter.default.post(name: NSNotification.Name("ToggleScreenAssistantPopover"), object: nil)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
NotificationCenter.default.post(name: NSNotification.Name("ToggleScreenAssistantPopover"), object: nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@MainActor
|
||||||
|
private func updateFeatureShortcutAvailability() {
|
||||||
|
updateShortcut(.startDemoTimer, isEnabled: Defaults[.enableShortcuts] && Defaults[.enableTimerFeature])
|
||||||
|
updateShortcut(.clipboardHistoryPanel, isEnabled: Defaults[.enableShortcuts] && Defaults[.enableClipboardManager])
|
||||||
|
updateShortcut(.colorPickerPanel, isEnabled: Defaults[.enableShortcuts] && Defaults[.enableColorPickerFeature])
|
||||||
|
updateShortcut(.screenAssistantPanel, isEnabled: Defaults[.enableShortcuts] && Defaults[.enableScreenAssistant])
|
||||||
|
}
|
||||||
|
|
||||||
|
@MainActor
|
||||||
|
private func updateShortcut(_ name: KeyboardShortcuts.Name, isEnabled: Bool) {
|
||||||
|
if isEnabled {
|
||||||
|
KeyboardShortcuts.enable(name)
|
||||||
|
} else {
|
||||||
|
KeyboardShortcuts.disable(name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func playWelcomeSound() {
|
func playWelcomeSound() {
|
||||||
let audioPlayer = AudioPlayer()
|
let audioPlayer = AudioPlayer()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue