Skip to content

Commit 3f7ecc7

Browse files
nyanko3141592claude
andcommitted
fix: EventModifierFlagsをKeyEventCore.ModifierFlagに統一し、CustomTextFieldのEscapeキー処理を復元
- EventModifierFlags を削除し、既存の KeyEventCore.ModifierFlag を使用するよう統一 - KeyEventCore.ModifierFlag に Codable 準拠を追加 - PR #277 で追加された CustomTextField の onCancel/Escape キー処理を復元 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 8b00f03 commit 3f7ecc7

7 files changed

Lines changed: 55 additions & 36 deletions

File tree

Core/Sources/Core/Configs/KeyboardShortcut.swift

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import Foundation
33
/// キーボードショートカットを表す構造体
44
public struct KeyboardShortcut: Codable, Equatable, Hashable, Sendable {
55
public var key: String
6-
public var modifiers: EventModifierFlags
6+
public var modifiers: KeyEventCore.ModifierFlag
77

8-
public init(key: String, modifiers: EventModifierFlags) {
8+
public init(key: String, modifiers: KeyEventCore.ModifierFlag) {
99
self.key = key
1010
self.modifiers = modifiers
1111
}
@@ -37,21 +37,3 @@ public struct KeyboardShortcut: Codable, Equatable, Hashable, Sendable {
3737
return result
3838
}
3939
}
40-
41-
/// ModifierFlagsをCodable/Sendableにするためのラッパー(rawValueベース)
42-
public struct EventModifierFlags: Codable, Equatable, Hashable, Sendable {
43-
public var rawValue: UInt
44-
45-
public init(rawValue: UInt) {
46-
self.rawValue = rawValue
47-
}
48-
49-
public static let control = EventModifierFlags(rawValue: 1 << 18) // NSEvent.ModifierFlags.control.rawValue
50-
public static let option = EventModifierFlags(rawValue: 1 << 19) // NSEvent.ModifierFlags.option.rawValue
51-
public static let shift = EventModifierFlags(rawValue: 1 << 17) // NSEvent.ModifierFlags.shift.rawValue
52-
public static let command = EventModifierFlags(rawValue: 1 << 20) // NSEvent.ModifierFlags.command.rawValue
53-
54-
public func contains(_ other: EventModifierFlags) -> Bool {
55-
(rawValue & other.rawValue) == other.rawValue
56-
}
57-
}

Core/Sources/Core/InputUtils/KeyEventCore.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
public struct KeyEventCore: Sendable, Equatable {
2-
public struct ModifierFlag: OptionSet, Sendable, Hashable {
2+
public struct ModifierFlag: OptionSet, Codable, Sendable, Hashable {
33
public let rawValue: Int
44

55
public init(rawValue: Int) {
Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,39 @@
11
import Cocoa
22
import Core
33

4-
/// NSEvent.ModifierFlagsとの相互変換
5-
extension EventModifierFlags {
4+
/// NSEvent.ModifierFlagsとKeyEventCore.ModifierFlagの相互変換
5+
extension KeyEventCore.ModifierFlag {
66
public init(from nsModifiers: NSEvent.ModifierFlags) {
7-
// サポートするモディファイア(control, option, shift, command)のみを抽出
8-
let supportedMask: NSEvent.ModifierFlags = [.control, .option, .shift, .command]
9-
self.init(rawValue: nsModifiers.intersection(supportedMask).rawValue)
7+
var flags: KeyEventCore.ModifierFlag = []
8+
if nsModifiers.contains(.control) {
9+
flags.insert(.control)
10+
}
11+
if nsModifiers.contains(.option) {
12+
flags.insert(.option)
13+
}
14+
if nsModifiers.contains(.shift) {
15+
flags.insert(.shift)
16+
}
17+
if nsModifiers.contains(.command) {
18+
flags.insert(.command)
19+
}
20+
self = flags
1021
}
1122

1223
public var nsModifierFlags: NSEvent.ModifierFlags {
13-
NSEvent.ModifierFlags(rawValue: rawValue)
24+
var flags: NSEvent.ModifierFlags = []
25+
if contains(.control) {
26+
flags.insert(.control)
27+
}
28+
if contains(.option) {
29+
flags.insert(.option)
30+
}
31+
if contains(.shift) {
32+
flags.insert(.shift)
33+
}
34+
if contains(.command) {
35+
flags.insert(.command)
36+
}
37+
return flags
1438
}
1539
}

azooKeyMac/InputController/azooKeyMacInputController.swift

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,24 +79,19 @@ class azooKeyMacInputController: IMKInputController, NSMenuItemValidation { // s
7979
}
8080

8181
let key = characters.lowercased()
82-
83-
// 必要な修飾キーのみをマスクして取得
84-
let relevantModifiers: NSEvent.ModifierFlags = [.control, .option, .shift, .command]
85-
let eventModifiers = event.modifierFlags.intersection(relevantModifiers)
82+
let eventModifiers = KeyEventCore.ModifierFlag(from: event.modifierFlags)
8683

8784
// 修飾キーがない場合は早期リターン(通常の入力)
8885
if eventModifiers.isEmpty {
8986
return nil
9087
}
9188

9289
// キャッシュからショートカット付きのピン留めプロンプトを検索
93-
let pinnedWithShortcuts = self.pinnedPromptsCache.filter { $0.shortcut != nil }
94-
if let matched = pinnedWithShortcuts.first(where: { item in
90+
if let matched = self.pinnedPromptsCache.first(where: { item in
9591
guard let itemShortcut = item.shortcut else {
9692
return false
9793
}
98-
let shortcutModifiers = itemShortcut.modifiers.nsModifierFlags.intersection(relevantModifiers)
99-
return itemShortcut.key == key && eventModifiers == shortcutModifiers
94+
return itemShortcut.key == key && itemShortcut.modifiers == eventModifiers
10095
}) {
10196
return matched.prompt
10297
}

azooKeyMac/Windows/KeyboardShortcutRecorder.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ class ShortcutRecorderView: NSView {
101101
}
102102

103103
let key = characters.lowercased()
104-
let modifiers = EventModifierFlags(from: event.modifierFlags)
104+
let modifiers = KeyEventCore.ModifierFlag(from: event.modifierFlags)
105105

106106
guard modifiers.contains(.control) ||
107107
modifiers.contains(.option) ||

azooKeyMac/Windows/PromptInput/CustomTextField.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ struct CustomTextField: NSViewRepresentable {
99
var onSubmit: () -> Void
1010
var onDownArrow: () -> Void
1111
var onUpArrow: () -> Void
12+
var onCancel: () -> Void
1213

1314
func makeNSView(context: Context) -> NSTextField {
1415
let textField = KeyHandlingTextField()
@@ -28,6 +29,7 @@ struct CustomTextField: NSViewRepresentable {
2829
textField.onDownArrow = onDownArrow
2930
textField.onUpArrow = onUpArrow
3031
textField.onSubmit = onSubmit
32+
textField.onCancel = onCancel
3133

3234
return textField
3335
}
@@ -40,6 +42,7 @@ struct CustomTextField: NSViewRepresentable {
4042
keyTextField.onDownArrow = onDownArrow
4143
keyTextField.onUpArrow = onUpArrow
4244
keyTextField.onSubmit = onSubmit
45+
keyTextField.onCancel = onCancel
4346
}
4447

4548
// Handle focus changes
@@ -65,6 +68,14 @@ struct CustomTextField: NSViewRepresentable {
6568
parent.onSubmit()
6669
}
6770

71+
func control(_ control: NSControl, textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool {
72+
if commandSelector == #selector(NSResponder.cancelOperation(_:)) {
73+
parent.onCancel()
74+
return true
75+
}
76+
return false
77+
}
78+
6879
func controlTextDidChange(_ obj: Notification) {
6980
if let textField = obj.object as? NSTextField {
7081
parent.text = textField.stringValue
@@ -85,6 +96,7 @@ private final class KeyHandlingTextField: NSTextField {
8596
var onDownArrow: (() -> Void)?
8697
var onUpArrow: (() -> Void)?
8798
var onSubmit: (() -> Void)?
99+
var onCancel: (() -> Void)?
88100

89101
override func awakeFromNib() {
90102
super.awakeFromNib()
@@ -121,6 +133,9 @@ private final class KeyHandlingTextField: NSTextField {
121133
case 36: // Return key
122134
onSubmit?()
123135
return
136+
case 53: // Escape key
137+
onCancel?()
138+
return
124139
default:
125140
super.keyDown(with: event)
126141
}

azooKeyMac/Windows/PromptInput/PromptInputView.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,9 @@ struct PromptInputView: View {
120120
onUpArrow: {
121121
// Handle up arrow for history navigation
122122
navigateHistory(direction: .up)
123+
},
124+
onCancel: {
125+
onCancel()
123126
}
124127
)
125128
.onChange(of: isTextFieldFocused) { isFocused in

0 commit comments

Comments
 (0)