From a02613a28aaa8d0e26209c10ed9e366a7bb054c4 Mon Sep 17 00:00:00 2001 From: ShikiSuen Date: Sat, 9 Sep 2023 22:20:28 +0800 Subject: [PATCH] SessionCtl // Only setMarkedText() if newValue != oldValue. --- .../Sources/MainAssembly/SessionCtl_Core.swift | 6 +++++- .../Sources/MainAssembly/SessionCtl_HandleStates.swift | 9 +++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Packages/vChewing_MainAssembly/Sources/MainAssembly/SessionCtl_Core.swift b/Packages/vChewing_MainAssembly/Sources/MainAssembly/SessionCtl_Core.swift index 6ff7f68e..42ee36c6 100644 --- a/Packages/vChewing_MainAssembly/Sources/MainAssembly/SessionCtl_Core.swift +++ b/Packages/vChewing_MainAssembly/Sources/MainAssembly/SessionCtl_Core.swift @@ -115,7 +115,11 @@ public class SessionCtl: IMKInputController { } /// 輸入調度模組的副本。 - var inputHandler: InputHandlerProtocol? + public internal(set) var inputHandler: InputHandlerProtocol? + + /// 最近一個被 set 的 marked text。 + public internal(set) var recentMarkedText: (text: NSAttributedString?, selectionRange: NSRange?) = (nil, nil) + /// 用以記錄當前輸入法狀態的變數。 public var state: IMEStateProtocol = IMEState.ofEmpty() { didSet { diff --git a/Packages/vChewing_MainAssembly/Sources/MainAssembly/SessionCtl_HandleStates.swift b/Packages/vChewing_MainAssembly/Sources/MainAssembly/SessionCtl_HandleStates.swift index c7d84276..84c98985 100644 --- a/Packages/vChewing_MainAssembly/Sources/MainAssembly/SessionCtl_HandleStates.swift +++ b/Packages/vChewing_MainAssembly/Sources/MainAssembly/SessionCtl_HandleStates.swift @@ -162,17 +162,22 @@ public extension SessionCtl { /// 警告:replacementRange 不要亂填,否則會在 Microsoft Office 等軟體內出現故障。 /// 該功能是給某些想設計「重新組字」功能的輸入法設計的,但一字多音的漢語在注音/拼音輸入這方面不適用這個輸入法特性。 func doSetMarkedText(_ string: NSAttributedString) { + // 威注音用不到 replacementRange,所以不用檢查 replacementRange 的異動情況。 + let range = attributedStringSecured.range + guard !(string.isEqual(to: recentMarkedText.text) && recentMarkedText.selectionRange == range) else { return } + recentMarkedText.text = string + recentMarkedText.selectionRange = range if isServingIMEItself || !isActivated { DispatchQueue.main.async { guard let client = self.client() else { return } client.setMarkedText( - string, selectionRange: self.selectionRange(), replacementRange: self.replacementRange() + string, selectionRange: range, replacementRange: self.replacementRange() ) } } else { guard let client = client() else { return } client.setMarkedText( - string, selectionRange: selectionRange(), replacementRange: replacementRange() + string, selectionRange: range, replacementRange: replacementRange() ) } }