KeyParser // Nomenclatural regulations for keyCodes.
This commit is contained in:
parent
1c13ac8ca5
commit
62cd4e56e0
|
@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue