From 03913cb71c6930db2abff07f6acdf2e909e1e197 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sun, 12 Mar 2023 00:08:49 +0800 Subject: [PATCH] InputHandler // Bring cursor jump to the marking mode. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Certain models of ThinkPad USB Keyboard don't support Alt+Shift+→, hence the choice of Command key as the alternative modifier key for this function. --- .../Modules/InputHandler_HandleStates.swift | 38 ++++++++++++++----- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/Source/Modules/InputHandler_HandleStates.swift b/Source/Modules/InputHandler_HandleStates.swift index 0aef3747..13d81a6a 100644 --- a/Source/Modules/InputHandler_HandleStates.swift +++ b/Source/Modules/InputHandler_HandleStates.swift @@ -195,9 +195,13 @@ extension InputHandler { // Shift + Left if input.isCursorBackward, input.isShiftHold { if compositor.marker > 0 { - compositor.marker -= 1 - if isCursorCuttingChar(isMarker: true) { + if input.isCommandHold || input.isOptionHold { compositor.jumpCursorBySpan(to: .rear, isMarker: true) + } else { + compositor.marker -= 1 + if isCursorCuttingChar(isMarker: true) { + compositor.jumpCursorBySpan(to: .rear, isMarker: true) + } } var marking = IMEState.ofMarking( displayTextSegments: state.displayTextSegments, @@ -216,9 +220,13 @@ extension InputHandler { // Shift + Right if input.isCursorForward, input.isShiftHold { if compositor.marker < compositor.length { - compositor.marker += 1 - if isCursorCuttingChar(isMarker: true) { + if input.isCommandHold || input.isOptionHold { compositor.jumpCursorBySpan(to: .front, isMarker: true) + } else { + compositor.marker += 1 + if isCursorCuttingChar(isMarker: true) { + compositor.jumpCursorBySpan(to: .front, isMarker: true) + } } var marking = IMEState.ofMarking( displayTextSegments: state.displayTextSegments, @@ -644,9 +652,14 @@ extension InputHandler { if input.isShiftHold { // Shift + Right if compositor.cursor < compositor.length { - compositor.marker = compositor.cursor + 1 - if isCursorCuttingChar(isMarker: true) { + compositor.marker = compositor.cursor + if input.isCommandHold || input.isOptionHold { compositor.jumpCursorBySpan(to: .front, isMarker: true) + } else { + compositor.marker += 1 + if isCursorCuttingChar(isMarker: true) { + compositor.jumpCursorBySpan(to: .front, isMarker: true) + } } var marking = IMEState.ofMarking( displayTextSegments: compositor.walkedNodes.values, @@ -659,7 +672,7 @@ extension InputHandler { } else { delegate.callError("BB7F6DB9") } - } else if input.isOptionHold { + } else if input.isOptionHold, !input.isShiftHold { if input.isControlHold { return handleEnd() } @@ -703,9 +716,14 @@ extension InputHandler { if input.isShiftHold { // Shift + left if compositor.cursor > 0 { - compositor.marker = compositor.cursor - 1 - if isCursorCuttingChar(isMarker: true) { + compositor.marker = compositor.cursor + if input.isCommandHold || input.isOptionHold { compositor.jumpCursorBySpan(to: .rear, isMarker: true) + } else { + compositor.marker -= 1 + if isCursorCuttingChar(isMarker: true) { + compositor.jumpCursorBySpan(to: .rear, isMarker: true) + } } var marking = IMEState.ofMarking( displayTextSegments: compositor.walkedNodes.values, @@ -718,7 +736,7 @@ extension InputHandler { } else { delegate.callError("D326DEA3") } - } else if input.isOptionHold { + } else if input.isOptionHold, !input.isShiftHold { if input.isControlHold { return handleHome() } // 游標跳轉動作無論怎樣都會執行,但如果出了執行失敗的結果的話則觸發報錯流程。 if !compositor.jumpCursorBySpan(to: .rear) {