KeyParser // Nomenclatural regulations for keyCodes.

This commit is contained in:
ShikiSuen 2022-04-05 11:25:03 +08:00
parent 1c13ac8ca5
commit 62cd4e56e0
1 changed files with 89 additions and 54 deletions

View File

@ -28,33 +28,66 @@ import Cocoa
// Use KeyCodes as much as possible since its recognition won't be affected by macOS Base Keyboard Layouts. // Use KeyCodes as much as possible since its recognition won't be affected by macOS Base Keyboard Layouts.
// KeyCodes: https://eastmanreference.com/complete-list-of-applescript-key-codes // KeyCodes: https://eastmanreference.com/complete-list-of-applescript-key-codes
// Also: HIToolbox.framework/Versions/A/Headers/Events.h
@objc enum KeyCode: UInt16 { @objc enum KeyCode: UInt16 {
case none = 0 case kNone = 0
case space = 49 case kCarriageReturn = 36 // Renamed from "kReturn" to avoid nomenclatural confusions.
case backSpace = 51 case kTab = 48
case esc = 53 case kSpace = 49
case tab = 48 case kSymbolMenuPhysicalKey = 50 // vChewing Specific
case enterLF = 76 case kBackSpace = 51 // Renamed from "kDelete" to avoid nomenclatural confusions.
case enterCR = 36 case kEscape = 53
case up = 126 case kCommand = 55
case down = 125 case kShift = 56
case left = 123 case kCapsLock = 57
case right = 124 case kOption = 58
case pageUp = 116 case kControl = 59
case pageDown = 121 case kRightShift = 60
case home = 115 case kRightOption = 61
case end = 119 case kRightControl = 62
case delete = 117 case kFunction = 63
case leftShift = 56 case kF17 = 64
case rightShift = 60 case kVolumeUp = 72
case capsLock = 57 case kVolumeDown = 73
case symbolMenuPhysicalKey = 50 case kMute = 74
case kLineFeed = 76 // Another keyCode to identify the Enter Key.
case kF18 = 79
case kF19 = 80
case kF20 = 90
case kF5 = 96
case kF6 = 97
case kF7 = 98
case kF3 = 99
case kF8 = 100
case kF9 = 101
case kF11 = 103
case kF13 = 105
case kF16 = 106
case kF14 = 107
case kF10 = 109
case kF12 = 111
case kF15 = 113
case kHelp = 114
case kHome = 115
case kPageUp = 116
case kWindowDelete = 117 // Renamed from "kForwardDelete" to avoid nomenclatural confusions.
case kF4 = 118
case kEnd = 119
case kF2 = 120
case kPageDown = 121
case kF1 = 122
case kLeftArrow = 123
case kRightArrow = 124
case kDownArrow = 125
case kUpArrow = 126
} }
// CharCodes: https://theasciicode.com.ar/ascii-control-characters/horizontal-tab-ascii-code-9.html // CharCodes: https://theasciicode.com.ar/ascii-control-characters/horizontal-tab-ascii-code-9.html
enum CharCode: UInt /*16*/ { enum CharCode: UInt /*16*/ {
case yajuusenpai = 1_145_141_919_810_893 case yajuusenpai = 114_514_19_19_810_893
// - CharCode is not reliable at all. KeyCode is the most accurate. KeyCode doesn't give a phuque about the character sent through macOS keyboard layouts but only focuses on which physical key is pressed. // CharCode is not reliable at all. KeyCode is the most appropriate choice due to its accuracy.
// KeyCode doesn't give a phuque about the character sent through macOS keyboard layouts ...
// ... but only focuses on which physical key is pressed.
} }
class keyParser: NSObject { class keyParser: NSObject {
@ -82,19 +115,20 @@ class keyParser: NSObject {
inputTextIgnoringModifiers ?? inputText) inputTextIgnoringModifiers ?? inputText)
self.inputText = inputText self.inputText = inputText
self.inputTextIgnoringModifiers = inputTextIgnoringModifiers self.inputTextIgnoringModifiers = inputTextIgnoringModifiers
self.keyCode = keyCode
self.charCode = AppleKeyboardConverter.cnvApple2ABC(charCode)
self.flags = flags self.flags = flags
self.isFlagChanged = false self.isFlagChanged = false
useVerticalMode = isVerticalMode useVerticalMode = isVerticalMode
self.keyCode = keyCode
self.charCode = AppleKeyboardConverter.cnvApple2ABC(charCode)
emacsKey = EmacsKeyHelper.detect( emacsKey = EmacsKeyHelper.detect(
charCode: AppleKeyboardConverter.cnvApple2ABC(charCode), flags: flags) charCode: AppleKeyboardConverter.cnvApple2ABC(charCode), flags: flags)
cursorForwardKey = useVerticalMode ? .down : .right // Define Arrow Keys
cursorBackwardKey = useVerticalMode ? .up : .left cursorForwardKey = useVerticalMode ? .kDownArrow : .kRightArrow
extraChooseCandidateKey = useVerticalMode ? .left : .down cursorBackwardKey = useVerticalMode ? .kUpArrow : .kLeftArrow
extraChooseCandidateKeyReverse = useVerticalMode ? .right : .up extraChooseCandidateKey = useVerticalMode ? .kLeftArrow : .kDownArrow
absorbedArrowKey = useVerticalMode ? .right : .up extraChooseCandidateKeyReverse = useVerticalMode ? .kRightArrow : .kUpArrow
verticalModeOnlyChooseCandidateKey = useVerticalMode ? absorbedArrowKey : .none absorbedArrowKey = useVerticalMode ? .kRightArrow : .kUpArrow
verticalModeOnlyChooseCandidateKey = useVerticalMode ? absorbedArrowKey : .kNone
super.init() super.init()
} }
@ -115,13 +149,14 @@ class keyParser: NSObject {
}() }()
self.charCode = AppleKeyboardConverter.cnvApple2ABC(charCode) self.charCode = AppleKeyboardConverter.cnvApple2ABC(charCode)
emacsKey = EmacsKeyHelper.detect( emacsKey = EmacsKeyHelper.detect(
charCode: AppleKeyboardConverter.cnvApple2ABC(charCode), flags: event.modifierFlags) charCode: AppleKeyboardConverter.cnvApple2ABC(charCode), flags: flags)
cursorForwardKey = useVerticalMode ? .down : .right // Define Arrow Keys in the same way above.
cursorBackwardKey = useVerticalMode ? .up : .left cursorForwardKey = useVerticalMode ? .kDownArrow : .kRightArrow
extraChooseCandidateKey = useVerticalMode ? .left : .down cursorBackwardKey = useVerticalMode ? .kUpArrow : .kLeftArrow
extraChooseCandidateKeyReverse = useVerticalMode ? .right : .up extraChooseCandidateKey = useVerticalMode ? .kLeftArrow : .kDownArrow
absorbedArrowKey = useVerticalMode ? .right : .up extraChooseCandidateKeyReverse = useVerticalMode ? .kRightArrow : .kUpArrow
verticalModeOnlyChooseCandidateKey = useVerticalMode ? absorbedArrowKey : .none absorbedArrowKey = useVerticalMode ? .kRightArrow : .kUpArrow
verticalModeOnlyChooseCandidateKey = useVerticalMode ? absorbedArrowKey : .kNone
super.init() super.init()
} }
@ -174,64 +209,64 @@ class keyParser: NSObject {
guard let code = KeyCode(rawValue: keyCode) else { guard let code = KeyCode(rawValue: keyCode) else {
return false return false
} }
return code.rawValue != KeyCode.none.rawValue return code.rawValue != KeyCode.kNone.rawValue
} }
@objc var isTab: Bool { @objc var isTab: Bool {
KeyCode(rawValue: keyCode) == KeyCode.tab KeyCode(rawValue: keyCode) == KeyCode.kTab
} }
@objc var isEnter: Bool { @objc var isEnter: Bool {
(KeyCode(rawValue: keyCode) == KeyCode.enterCR) (KeyCode(rawValue: keyCode) == KeyCode.kCarriageReturn)
|| (KeyCode(rawValue: keyCode) == KeyCode.enterLF) || (KeyCode(rawValue: keyCode) == KeyCode.kLineFeed)
} }
@objc var isUp: Bool { @objc var isUp: Bool {
KeyCode(rawValue: keyCode) == KeyCode.up KeyCode(rawValue: keyCode) == KeyCode.kUpArrow
} }
@objc var isDown: Bool { @objc var isDown: Bool {
KeyCode(rawValue: keyCode) == KeyCode.down KeyCode(rawValue: keyCode) == KeyCode.kDownArrow
} }
@objc var isLeft: Bool { @objc var isLeft: Bool {
KeyCode(rawValue: keyCode) == KeyCode.left KeyCode(rawValue: keyCode) == KeyCode.kLeftArrow
} }
@objc var isRight: Bool { @objc var isRight: Bool {
KeyCode(rawValue: keyCode) == KeyCode.right KeyCode(rawValue: keyCode) == KeyCode.kRightArrow
} }
@objc var isPageUp: Bool { @objc var isPageUp: Bool {
KeyCode(rawValue: keyCode) == KeyCode.pageUp KeyCode(rawValue: keyCode) == KeyCode.kPageUp
} }
@objc var isPageDown: Bool { @objc var isPageDown: Bool {
KeyCode(rawValue: keyCode) == KeyCode.pageDown KeyCode(rawValue: keyCode) == KeyCode.kPageDown
} }
@objc var isSpace: Bool { @objc var isSpace: Bool {
KeyCode(rawValue: keyCode) == KeyCode.space KeyCode(rawValue: keyCode) == KeyCode.kSpace
} }
@objc var isBackSpace: Bool { @objc var isBackSpace: Bool {
KeyCode(rawValue: keyCode) == KeyCode.backSpace KeyCode(rawValue: keyCode) == KeyCode.kBackSpace
} }
@objc var isESC: Bool { @objc var isESC: Bool {
KeyCode(rawValue: keyCode) == KeyCode.esc KeyCode(rawValue: keyCode) == KeyCode.kEscape
} }
@objc var isHome: Bool { @objc var isHome: Bool {
KeyCode(rawValue: keyCode) == KeyCode.home KeyCode(rawValue: keyCode) == KeyCode.kHome
} }
@objc var isEnd: Bool { @objc var isEnd: Bool {
KeyCode(rawValue: keyCode) == KeyCode.end KeyCode(rawValue: keyCode) == KeyCode.kEnd
} }
@objc var isDelete: Bool { @objc var isDelete: Bool {
KeyCode(rawValue: keyCode) == KeyCode.delete KeyCode(rawValue: keyCode) == KeyCode.kWindowDelete
} }
@objc var isCursorBackward: Bool { @objc var isCursorBackward: Bool {
@ -266,7 +301,7 @@ class keyParser: NSObject {
@objc var isSymbolMenuPhysicalKey: Bool { @objc var isSymbolMenuPhysicalKey: Bool {
// KeyCode macOS Apple // KeyCode macOS Apple
// ![input isShift] 使 Shift // ![input isShift] 使 Shift
KeyCode(rawValue: keyCode) == KeyCode.symbolMenuPhysicalKey KeyCode(rawValue: keyCode) == KeyCode.kSymbolMenuPhysicalKey
} }
} }