From af715ad8d89571dde2a3f890e82c33275e7bf3de Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Fri, 9 Jun 2023 21:52:31 +0800 Subject: [PATCH] NSEvent // Make .text() safer. --- .../CocoaExtension/CocoaExtension_NSEvent.swift | 12 ++++++------ Source/Modules/SessionCtl_HandleEvent.swift | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Packages/vChewing_CocoaExtension/Sources/CocoaExtension/CocoaExtension_NSEvent.swift b/Packages/vChewing_CocoaExtension/Sources/CocoaExtension/CocoaExtension_NSEvent.swift index 06432e1f..bf1751f4 100644 --- a/Packages/vChewing_CocoaExtension/Sources/CocoaExtension/CocoaExtension_NSEvent.swift +++ b/Packages/vChewing_CocoaExtension/Sources/CocoaExtension/CocoaExtension_NSEvent.swift @@ -23,10 +23,7 @@ public extension NSEvent { isARepeat: Bool? = nil, keyCode: UInt16? = nil ) -> NSEvent? { - let oldChars: String = { - if self.type == .flagsChanged { return "" } - return self.characters ?? "" - }() + let oldChars: String = text return NSEvent.keyEvent( with: type ?? self.type, location: location ?? locationInWindow, @@ -78,7 +75,10 @@ public extension NSEvent { public extension NSEvent { var isTypingVertical: Bool { charactersIgnoringModifiers == "Vertical" } - var text: String { characters ?? "" } + /// NSEvent.characters 的類型安全版。 + /// - Remark: 注意:必須針對 event.type == .flagsChanged 提前返回結果, + /// 否則,每次處理這種判斷時都會因為讀取 event.characters? 而觸發 NSInternalInconsistencyException。 + var text: String { isFlagChanged ? "" : characters ?? "" } var inputTextIgnoringModifiers: String? { guard charactersIgnoringModifiers != nil else { return nil } return charactersIgnoringModifiers ?? characters ?? "" @@ -313,7 +313,7 @@ public enum EmacsKey { public extension NSEvent { func layoutTranslated(to layout: LatinKeyboardMappings = .qwerty) -> NSEvent { let mapTable = layout.mapTable - if type == .flagsChanged { return self } + if isFlagChanged { return self } guard modifierFlags == .shift || modifierFlags.isEmpty else { return self } if !mapTable.keys.contains(keyCode) { return self } guard let dataTuplet = mapTable[keyCode] else { return self } diff --git a/Source/Modules/SessionCtl_HandleEvent.swift b/Source/Modules/SessionCtl_HandleEvent.swift index 600ab735..a94f5e61 100644 --- a/Source/Modules/SessionCtl_HandleEvent.swift +++ b/Source/Modules/SessionCtl_HandleEvent.swift @@ -89,7 +89,7 @@ public extension SessionCtl { /// 這裡不判斷 flags 的話,用方向鍵前後定位光標之後,再次試圖觸發組字區時、反而會在首次按鍵時失敗。 /// 同時注意:必須針對 event.type == .flagsChanged 提前返回結果, /// 否則,每次處理這種判斷時都會因為讀取 event.characters? 而觸發 NSInternalInconsistencyException。 - if event.type == .flagsChanged { return true } + if event.isFlagChanged { return true } /// 沒有文字輸入客體的話,就不要再往下處理了。 guard let inputHandler = inputHandler, client() != nil else { return false }