Fix command palette Open Settings action routing

This commit is contained in:
Lawrence Chen 2026-02-24 21:07:37 -08:00
parent 566eda80b5
commit cc06fb84e3
4 changed files with 68 additions and 4 deletions

View file

@ -3258,9 +3258,27 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent
)
}
@MainActor
static func presentPreferencesWindow(
sendShowSettingsAction: @MainActor () -> Bool = {
NSApp.sendAction(Selector(("showSettingsWindow:")), to: nil, from: nil)
},
showFallbackSettingsWindow: @MainActor () -> Void = {
SettingsWindowController.shared.show()
},
activateApplication: @MainActor () -> Void = {
NSApp.activate(ignoringOtherApps: true)
}
) {
let handledByResponderChain = sendShowSettingsAction()
if !handledByResponderChain {
showFallbackSettingsWindow()
}
activateApplication()
}
@objc func openPreferencesWindow() {
NSApp.sendAction(Selector(("showSettingsWindow:")), to: nil, from: nil)
NSApp.activate(ignoringOtherApps: true)
Self.presentPreferencesWindow()
}
func refreshMenuBarExtraForDebug() {

View file

@ -3923,7 +3923,7 @@ struct ContentView: View {
AppDelegate.shared?.jumpToLatestUnread()
}
registry.register(commandId: "palette.openSettings") {
NSApp.sendAction(Selector(("showSettingsWindow:")), to: nil, from: nil)
AppDelegate.presentPreferencesWindow()
}
registry.register(commandId: "palette.checkForUpdates") {
AppDelegate.shared?.checkForUpdates(nil)

View file

@ -1701,7 +1701,7 @@ private struct AcknowledgmentsView: View {
}
}
private final class SettingsWindowController: NSWindowController, NSWindowDelegate {
final class SettingsWindowController: NSWindowController, NSWindowDelegate {
static let shared = SettingsWindowController()
private init() {

View file

@ -417,6 +417,52 @@ final class AppDelegateShortcutRoutingTests: XCTestCase {
XCTAssertTrue(appDelegate.tabManager === firstManager, "Unresolved event window should not retarget active manager")
}
func testPresentPreferencesWindowUsesFallbackWhenResponderChainDoesNotHandleSettingsAction() {
var sendShowSettingsActionCallCount = 0
var showFallbackSettingsWindowCallCount = 0
var activateApplicationCallCount = 0
AppDelegate.presentPreferencesWindow(
sendShowSettingsAction: {
sendShowSettingsActionCallCount += 1
return false
},
showFallbackSettingsWindow: {
showFallbackSettingsWindowCallCount += 1
},
activateApplication: {
activateApplicationCallCount += 1
}
)
XCTAssertEqual(sendShowSettingsActionCallCount, 1)
XCTAssertEqual(showFallbackSettingsWindowCallCount, 1)
XCTAssertEqual(activateApplicationCallCount, 1)
}
func testPresentPreferencesWindowSkipsFallbackWhenResponderChainHandlesSettingsAction() {
var sendShowSettingsActionCallCount = 0
var showFallbackSettingsWindowCallCount = 0
var activateApplicationCallCount = 0
AppDelegate.presentPreferencesWindow(
sendShowSettingsAction: {
sendShowSettingsActionCallCount += 1
return true
},
showFallbackSettingsWindow: {
showFallbackSettingsWindowCallCount += 1
},
activateApplication: {
activateApplicationCallCount += 1
}
)
XCTAssertEqual(sendShowSettingsActionCallCount, 1)
XCTAssertEqual(showFallbackSettingsWindowCallCount, 0)
XCTAssertEqual(activateApplicationCallCount, 1)
}
private func makeKeyDownEvent(
key: String,
modifiers: NSEvent.ModifierFlags,