From 5da7da127a620b28c5883c07b420f9571bc32af9 Mon Sep 17 00:00:00 2001 From: Lawrence Chen Date: Sun, 15 Mar 2026 22:09:37 -0700 Subject: [PATCH] Narrow shortcut settings notifications --- Sources/AppDelegate.swift | 2 +- Sources/KeyboardShortcutSettings.swift | 23 +++++++++++++++++++- Sources/Update/UpdateTitlebarAccessory.swift | 2 +- Sources/cmuxApp.swift | 2 +- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index aaf0fe05..884b76e3 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -7810,7 +7810,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent private func installShortcutDefaultsObserver() { guard shortcutDefaultsObserver == nil else { return } shortcutDefaultsObserver = NotificationCenter.default.addObserver( - forName: UserDefaults.didChangeNotification, + forName: KeyboardShortcutSettings.didChangeNotification, object: nil, queue: .main ) { [weak self] _ in diff --git a/Sources/KeyboardShortcutSettings.swift b/Sources/KeyboardShortcutSettings.swift index f06c255b..26b41ea3 100644 --- a/Sources/KeyboardShortcutSettings.swift +++ b/Sources/KeyboardShortcutSettings.swift @@ -3,6 +3,9 @@ import SwiftUI /// Stores customizable keyboard shortcuts (definitions + persistence). enum KeyboardShortcutSettings { + static let didChangeNotification = Notification.Name("cmux.keyboardShortcutSettingsDidChange") + static let actionUserInfoKey = "action" + enum Action: String, CaseIterable, Identifiable { // Titlebar / primary UI case toggleSidebar @@ -198,16 +201,34 @@ enum KeyboardShortcutSettings { if let data = try? JSONEncoder().encode(shortcut) { UserDefaults.standard.set(data, forKey: action.defaultsKey) } + postDidChangeNotification(action: action) } static func resetShortcut(for action: Action) { UserDefaults.standard.removeObject(forKey: action.defaultsKey) + postDidChangeNotification(action: action) } static func resetAll() { for action in Action.allCases { - resetShortcut(for: action) + UserDefaults.standard.removeObject(forKey: action.defaultsKey) } + postDidChangeNotification() + } + + private static func postDidChangeNotification( + action: Action? = nil, + center: NotificationCenter = .default + ) { + var userInfo: [AnyHashable: Any] = [:] + if let action { + userInfo[actionUserInfoKey] = action.rawValue + } + center.post( + name: didChangeNotification, + object: nil, + userInfo: userInfo.isEmpty ? nil : userInfo + ) } // MARK: - Backwards-Compatible API (call-sites can migrate gradually) diff --git a/Sources/Update/UpdateTitlebarAccessory.swift b/Sources/Update/UpdateTitlebarAccessory.swift index 191cf68e..b08a8997 100644 --- a/Sources/Update/UpdateTitlebarAccessory.swift +++ b/Sources/Update/UpdateTitlebarAccessory.swift @@ -332,7 +332,7 @@ struct TitlebarControlsView: View { .onHover { hovering in isHoveringControls = hovering } - .onReceive(NotificationCenter.default.publisher(for: UserDefaults.didChangeNotification)) { _ in + .onReceive(NotificationCenter.default.publisher(for: KeyboardShortcutSettings.didChangeNotification)) { _ in shortcutRefreshTick &+= 1 } .onAppear { diff --git a/Sources/cmuxApp.swift b/Sources/cmuxApp.swift index 738faadb..db9e6a73 100644 --- a/Sources/cmuxApp.swift +++ b/Sources/cmuxApp.swift @@ -5419,7 +5419,7 @@ private struct ShortcutSettingRow: View { .onChange(of: shortcut) { newValue in KeyboardShortcutSettings.setShortcut(newValue, for: action) } - .onReceive(NotificationCenter.default.publisher(for: UserDefaults.didChangeNotification)) { _ in + .onReceive(NotificationCenter.default.publisher(for: KeyboardShortcutSettings.didChangeNotification)) { _ in let latest = KeyboardShortcutSettings.shortcut(for: action) if latest != shortcut { shortcut = latest