feat: open providers with Command-P and dismiss pickers with Escape

This commit is contained in:
2026-10-18 00:34:15 +02:00
parent 86632f1d86
commit f12ef7e7a1
6 changed files with 42 additions and 10 deletions
@@ -308,6 +308,9 @@ final class ApplicationActionsController: NSViewController, NSSearchFieldDelegat
func handle(_ selector: Selector) -> Bool {
switch selector {
case #selector(NSResponder.cancelOperation(_:)):
guard isShown else { return false }
close()
case #selector(NSResponder.insertNewline(_:)):
if let selectedEntry { chooseAction(at: selectedEntry) }
case #selector(NSResponder.moveUp(_:)): moveSelection(by: -1)
+11 -4
View File
@@ -97,6 +97,7 @@ final class LauncherWindowController: NSWindowController, NSWindowDelegate, NSSe
}
window.usesTextNavigation = { [weak self] in self?.notes != nil }
window.dismiss = { [weak self] in self?.dismiss() }
window.escape = { [weak self] in self?.handleEscape() }
window.canUseNumberShortcuts = { [weak self] in
guard let self else { return false }
return !self.isLaunching && self.calculation == nil && self.resultCount > 0
@@ -115,8 +116,7 @@ final class LauncherWindowController: NSWindowController, NSWindowDelegate, NSSe
actions.closed = { [weak self] in
guard let self else { return }
self.openButton.keyEquivalent = "\r"
if NSApp.isActive { self.window?.makeFirstResponder(self.searchField) }
else { self.dismiss(restoringFocus: false) }
self.window?.makeFirstResponder(self.searchField)
}
currency.changed = { [weak self] in self?.updateResults(preservingSelection: true) }
restorePosition()
@@ -494,9 +494,15 @@ final class LauncherWindowController: NSWindowController, NSWindowDelegate, NSSe
updateResults()
}
private func handleEscape() {
let selector = #selector(NSResponder.cancelOperation(_:))
if actions.handle(selector) || translation?.handle(selector) == true || emojiPicker?.handle(selector) == true { return }
dismiss()
}
func control(_ control: NSControl, textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool {
if commandSelector == #selector(NSResponder.cancelOperation(_:)) {
dismiss()
handleEscape()
return true
}
if let emojiPicker { return emojiPicker.handle(commandSelector) }
@@ -1163,6 +1169,7 @@ final class LauncherPanel: NSPanel {
override var canBecomeMain: Bool { true }
var navigateSelection: ((Int) -> Void)?
var dismiss: (() -> Void)?
var escape: (() -> Void)?
var dragEnded: (() -> Void)?
var canUseNumberShortcuts: (() -> Bool)?
var numberHintsChanged: (() -> Void)?
@@ -1293,7 +1300,7 @@ final class LauncherPanel: NSPanel {
}
override func cancelOperation(_ sender: Any?) {
dismiss?()
if let escape { escape() } else { dismiss?() }
}
override func performClose(_ sender: Any?) {
@@ -68,6 +68,9 @@ final class TranslationController: NSViewController {
providerButton.setAccessibilityLabel("Translation provider")
providerButton.target = self
providerButton.action = #selector(showProviders)
providerButton.keyEquivalent = "p"
providerButton.keyEquivalentModifierMask = .command
providerButton.toolTip = "Choose translation provider (Command-P)"
providerButton.isBordered = false
providerButton.font = .systemFont(ofSize: 12, weight: .medium)
providerButton.contentTintColor = SunsetPalette.text
+1
View File
@@ -124,6 +124,7 @@ public final class GlobalShortcuts {
case "z": return "Undo"
case "m": return "Minimize"
case "k": return "entry actions"
case "p": return "translation provider selection"
case "return", "enter": return "Open, Copy, Translate, or confirm uninstall"
case "1"..."9" where key.utf8.count == 1: return "numbered application launching"
default: break