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.
// KeyCodes: https://eastmanreference.com/complete-list-of-applescript-key-codes
// Also: HIToolbox.framework/Versions/A/Headers/Events.h
@objc enum KeyCode: UInt16 {
case none = 0
case space = 49
case backSpace = 51
case esc = 53
case tab = 48
case enterLF = 76
case enterCR = 36
case up = 126
case down = 125
case left = 123
case right = 124
case pageUp = 116
case pageDown = 121
case home = 115
case end = 119
case delete = 117
case leftShift = 56
case rightShift = 60
case capsLock = 57
case symbolMenuPhysicalKey = 50
case kNone = 0
case kCarriageReturn = 36 // Renamed from "kReturn" to avoid nomenclatural confusions.
case kTab = 48
case kSpace = 49
case kSymbolMenuPhysicalKey = 50 // vChewing Specific
case kBackSpace = 51 // Renamed from "kDelete" to avoid nomenclatural confusions.
case kEscape = 53
case kCommand = 55
case kShift = 56
case kCapsLock = 57
case kOption = 58
case kControl = 59
case kRightShift = 60
case kRightOption = 61
case kRightControl = 62
case kFunction = 63
case kF17 = 64
case kVolumeUp = 72
case kVolumeDown = 73
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
enum CharCode: UInt /*16*/ {
case yajuusenpai = 1_145_141_919_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.
case yajuusenpai = 114_514_19_19_810_893
// 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 {
@ -82,19 +115,20 @@ class keyParser: NSObject {
inputTextIgnoringModifiers ?? inputText)
self.inputText = inputText
self.inputTextIgnoringModifiers = inputTextIgnoringModifiers
self.keyCode = keyCode
self.charCode = AppleKeyboardConverter.cnvApple2ABC(charCode)
self.flags = flags
self.isFlagChanged = false
useVerticalMode = isVerticalMode
self.keyCode = keyCode
self.charCode = AppleKeyboardConverter.cnvApple2ABC(charCode)
emacsKey = EmacsKeyHelper.detect(
charCode: AppleKeyboardConverter.cnvApple2ABC(charCode), flags: flags)
cursorForwardKey = useVerticalMode ? .down : .right
cursorBackwardKey = useVerticalMode ? .up : .left
extraChooseCandidateKey = useVerticalMode ? .left : .down
extraChooseCandidateKeyReverse = useVerticalMode ? .right : .up
absorbedArrowKey = useVerticalMode ? .right : .up
verticalModeOnlyChooseCandidateKey = useVerticalMode ? absorbedArrowKey : .none
// Define Arrow Keys
cursorForwardKey = useVerticalMode ? .kDownArrow : .kRightArrow
cursorBackwardKey = useVerticalMode ? .kUpArrow : .kLeftArrow
extraChooseCandidateKey = useVerticalMode ? .kLeftArrow : .kDownArrow
extraChooseCandidateKeyReverse = useVerticalMode ? .kRightArrow : .kUpArrow
absorbedArrowKey = useVerticalMode ? .kRightArrow : .kUpArrow
verticalModeOnlyChooseCandidateKey = useVerticalMode ? absorbedArrowKey : .kNone
super.init()
}
@ -115,13 +149,14 @@ class keyParser: NSObject {
}()
self.charCode = AppleKeyboardConverter.cnvApple2ABC(charCode)
emacsKey = EmacsKeyHelper.detect(
charCode: AppleKeyboardConverter.cnvApple2ABC(charCode), flags: event.modifierFlags)
cursorForwardKey = useVerticalMode ? .down : .right
cursorBackwardKey = useVerticalMode ? .up : .left
extraChooseCandidateKey = useVerticalMode ? .left : .down
extraChooseCandidateKeyReverse = useVerticalMode ? .right : .up
absorbedArrowKey = useVerticalMode ? .right : .up
verticalModeOnlyChooseCandidateKey = useVerticalMode ? absorbedArrowKey : .none
charCode: AppleKeyboardConverter.cnvApple2ABC(charCode), flags: flags)
// Define Arrow Keys in the same way above.
cursorForwardKey = useVerticalMode ? .kDownArrow : .kRightArrow
cursorBackwardKey = useVerticalMode ? .kUpArrow : .kLeftArrow
extraChooseCandidateKey = useVerticalMode ? .kLeftArrow : .kDownArrow
extraChooseCandidateKeyReverse = useVerticalMode ? .kRightArrow : .kUpArrow
absorbedArrowKey = useVerticalMode ? .kRightArrow : .kUpArrow
verticalModeOnlyChooseCandidateKey = useVerticalMode ? absorbedArrowKey : .kNone
super.init()
}
@ -174,64 +209,64 @@ class keyParser: NSObject {
guard let code = KeyCode(rawValue: keyCode) else {
return false
}
return code.rawValue != KeyCode.none.rawValue
return code.rawValue != KeyCode.kNone.rawValue
}
@objc var isTab: Bool {
KeyCode(rawValue: keyCode) == KeyCode.tab
KeyCode(rawValue: keyCode) == KeyCode.kTab
}
@objc var isEnter: Bool {
(KeyCode(rawValue: keyCode) == KeyCode.enterCR)
|| (KeyCode(rawValue: keyCode) == KeyCode.enterLF)
(KeyCode(rawValue: keyCode) == KeyCode.kCarriageReturn)
|| (KeyCode(rawValue: keyCode) == KeyCode.kLineFeed)
}
@objc var isUp: Bool {
KeyCode(rawValue: keyCode) == KeyCode.up
KeyCode(rawValue: keyCode) == KeyCode.kUpArrow
}
@objc var isDown: Bool {
KeyCode(rawValue: keyCode) == KeyCode.down
KeyCode(rawValue: keyCode) == KeyCode.kDownArrow
}
@objc var isLeft: Bool {
KeyCode(rawValue: keyCode) == KeyCode.left
KeyCode(rawValue: keyCode) == KeyCode.kLeftArrow
}
@objc var isRight: Bool {
KeyCode(rawValue: keyCode) == KeyCode.right
KeyCode(rawValue: keyCode) == KeyCode.kRightArrow
}
@objc var isPageUp: Bool {
KeyCode(rawValue: keyCode) == KeyCode.pageUp
KeyCode(rawValue: keyCode) == KeyCode.kPageUp
}
@objc var isPageDown: Bool {
KeyCode(rawValue: keyCode) == KeyCode.pageDown
KeyCode(rawValue: keyCode) == KeyCode.kPageDown
}
@objc var isSpace: Bool {
KeyCode(rawValue: keyCode) == KeyCode.space
KeyCode(rawValue: keyCode) == KeyCode.kSpace
}
@objc var isBackSpace: Bool {
KeyCode(rawValue: keyCode) == KeyCode.backSpace
KeyCode(rawValue: keyCode) == KeyCode.kBackSpace
}
@objc var isESC: Bool {
KeyCode(rawValue: keyCode) == KeyCode.esc
KeyCode(rawValue: keyCode) == KeyCode.kEscape
}
@objc var isHome: Bool {
KeyCode(rawValue: keyCode) == KeyCode.home
KeyCode(rawValue: keyCode) == KeyCode.kHome
}
@objc var isEnd: Bool {
KeyCode(rawValue: keyCode) == KeyCode.end
KeyCode(rawValue: keyCode) == KeyCode.kEnd
}
@objc var isDelete: Bool {
KeyCode(rawValue: keyCode) == KeyCode.delete
KeyCode(rawValue: keyCode) == KeyCode.kWindowDelete
}
@objc var isCursorBackward: Bool {
@ -266,7 +301,7 @@ class keyParser: NSObject {
@objc var isSymbolMenuPhysicalKey: Bool {
// KeyCode macOS Apple
// ![input isShift] 使 Shift
KeyCode(rawValue: keyCode) == KeyCode.symbolMenuPhysicalKey
KeyCode(rawValue: keyCode) == KeyCode.kSymbolMenuPhysicalKey
}
}