From 34c147d7b8275bde8401814a450ae38b47ae28f1 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Tue, 5 Apr 2022 11:25:03 +0800 Subject: [PATCH] KeyParser // Nomenclatural regulations for keyCodes. --- .../Modules/ControllerModules/KeyParser.swift | 143 +++++++++++------- 1 file changed, 89 insertions(+), 54 deletions(-) diff --git a/Source/Modules/ControllerModules/KeyParser.swift b/Source/Modules/ControllerModules/KeyParser.swift index 1060b474..14b97995 100644 --- a/Source/Modules/ControllerModules/KeyParser.swift +++ b/Source/Modules/ControllerModules/KeyParser.swift @@ -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 } }