SessionCtl // Only setMarkedText() if newValue != oldValue.

This commit is contained in:
ShikiSuen 2023-09-09 22:20:28 +08:00
parent c3228acd93
commit a02613a28a
2 changed files with 12 additions and 3 deletions

View File

@ -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 {

View File

@ -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()
)
}
}