diff --git a/Source/Modules/ControllerModules/KeyHandler_Core.swift b/Source/Modules/ControllerModules/KeyHandler_Core.swift index ffe181e1..7e63899a 100644 --- a/Source/Modules/ControllerModules/KeyHandler_Core.swift +++ b/Source/Modules/ControllerModules/KeyHandler_Core.swift @@ -49,6 +49,8 @@ protocol KeyHandlerDelegate { class KeyHandler { /// 半衰模組的衰減指數 let kEpsilon: Double = 0.000001 + /// 檢測是否出現游標切斷組字圈內字符的情況 + var isCursorCuttingChar = false /// 規定最大動態爬軌範圍。組字器內超出該範圍的節錨都會被自動標記為「已經手動選字過」,減少爬軌運算負擔。 let kMaxComposingBufferNeedsToWalkSize = Int(max(12, ceil(Double(mgrPrefs.composingBufferSize) / 2))) diff --git a/Source/Modules/ControllerModules/KeyHandler_States.swift b/Source/Modules/ControllerModules/KeyHandler_States.swift index aee36b14..19ea84c0 100644 --- a/Source/Modules/ControllerModules/KeyHandler_States.swift +++ b/Source/Modules/ControllerModules/KeyHandler_States.swift @@ -156,7 +156,11 @@ extension KeyHandler { /// 給工具提示設定提示配色。 if !stateResult.tooltip.isEmpty { + isCursorCuttingChar = true ctlInputMethod.tooltipController.setColor(state: .denialOverflow) + } else { + isCursorCuttingChar = false + ctlInputMethod.tooltipController.setColor(state: .normal) } return stateResult @@ -659,6 +663,7 @@ extension KeyHandler { stateCallback(state) } } else if input.isOptionHold { + isCursorCuttingChar = false if input.isControlHold { return handleEnd(state: state, stateCallback: stateCallback, errorCallback: errorCallback) } @@ -673,7 +678,12 @@ extension KeyHandler { } else { if compositor.cursor < compositor.length { compositor.cursor += 1 - stateCallback(buildInputtingState) + var inputtingState = buildInputtingState + if isCursorCuttingChar == true { + compositor.jumpCursorBySpan(to: .front) + inputtingState = buildInputtingState + } + stateCallback(inputtingState) } else { IME.prtDebugIntel("A96AAD58") errorCallback() @@ -727,6 +737,7 @@ extension KeyHandler { stateCallback(state) } } else if input.isOptionHold { + isCursorCuttingChar = false if input.isControlHold { return handleHome(state: state, stateCallback: stateCallback, errorCallback: errorCallback) } @@ -741,7 +752,12 @@ extension KeyHandler { } else { if compositor.cursor > 0 { compositor.cursor -= 1 - stateCallback(buildInputtingState) + var inputtingState = buildInputtingState + if isCursorCuttingChar == true { + compositor.jumpCursorBySpan(to: .rear) + inputtingState = buildInputtingState + } + stateCallback(inputtingState) } else { IME.prtDebugIntel("7045E6F3") errorCallback()