From ca98961e45cec327d34cd0b83ecb7b9887139cc5 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Wed, 17 Aug 2022 18:50:32 +0800 Subject: [PATCH] ctlIME // Stop Shift+Enter from crashing IMKCandidates. --- .../ctlInputMethod_Core.swift | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Source/Modules/ControllerModules/ctlInputMethod_Core.swift b/Source/Modules/ControllerModules/ctlInputMethod_Core.swift index 24744004..fd1b3d3c 100644 --- a/Source/Modules/ControllerModules/ctlInputMethod_Core.swift +++ b/Source/Modules/ControllerModules/ctlInputMethod_Core.swift @@ -211,6 +211,30 @@ class ctlInputMethod: IMKInputController { // - 是就地交給 super.interpretKeyEvents() 處理? // - 還是藉由 delegate 扔回 ctlInputMethod 給 KeyHandler 處理? if let ctlCandidateCurrent = ctlInputMethod.ctlCandidateCurrent as? ctlCandidateIMK, ctlCandidateCurrent.visible { + let input = InputSignal(event: event) + // Shift+Enter 是個特殊情形,不提前攔截處理的話、會有垃圾參數傳給 delegate 的 keyHandler 從而崩潰。 + // 所以這裡直接將 Shift Flags 清空。 + if input.isShiftHold, input.isEnter { + guard + let newEvent = NSEvent.keyEvent( + with: event.type, + location: event.locationInWindow, + modifierFlags: [], + timestamp: event.timestamp, + windowNumber: event.windowNumber, + context: nil, + characters: event.characters ?? "", + charactersIgnoringModifiers: event.charactersIgnoringModifiers ?? event.characters ?? "", + isARepeat: event.isARepeat, + keyCode: event.keyCode + ) + else { + NSSound.beep() + return true + } + ctlCandidateCurrent.interpretKeyEvents([newEvent]) + return true + } ctlCandidateCurrent.interpretKeyEvents([event]) return true }