SessionCtl // Clear ICB display before committing things.

This commit is contained in:
ShikiSuen 2023-10-28 14:50:31 +08:00
parent 2a5cc07b5b
commit d66d9799c0
1 changed files with 26 additions and 10 deletions

View File

@ -129,6 +129,7 @@ public extension SessionCtl {
///
/// IMK commitComposition
private func commit(text: String) {
guard !text.isEmpty else { return }
let phE = PrefMgr.shared.phraseReplacementEnabled && text.count > 1
var text = text.trimmingCharacters(in: .newlines)
var replaced = false
@ -140,19 +141,22 @@ public extension SessionCtl {
if phE, !replaced, let queried = inputHandler?.currentLM.queryReplacementValue(key: buffer) {
buffer = ChineseConverter.kanjiConversionIfRequired(queried)
}
if isServingIMEItself {
DispatchQueue.main.async {
guard let client = self.client() else { return }
client.insertText(
buffer, replacementRange: self.replacementRange()
)
}
} else {
func doCommit() {
guard let client = client() else { return }
handlePreCommit()
client.insertText(
buffer, replacementRange: replacementRange()
)
}
if isServingIMEItself {
DispatchQueue.main.async {
doCommit()
}
} else {
doCommit()
}
}
/// setMarkedText GCD
@ -161,13 +165,13 @@ public extension SessionCtl {
/// - string: NSAttributedString
/// replacementRange Microsoft Office
/// /
func doSetMarkedText(_ string: NSAttributedString) {
func doSetMarkedText(_ string: NSAttributedString, allowAsync: Bool = true) {
// 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 {
if allowAsync, isServingIMEItself || !isActivated {
DispatchQueue.main.async {
guard let client = self.client() else { return }
client.setMarkedText(
@ -181,4 +185,16 @@ public extension SessionCtl {
)
}
}
func handlePreCommit() {
let whoShouldBypassHandling: [String] = ["com.barebones.bbedit", "com.barebones.textwrangler"]
if !whoShouldBypassHandling.contains(clientBundleIdentifier) {
let blankStr = NSMutableAttributedString(string: "")
blankStr.setAttributes(
mark(forStyle: kTSMHiliteConvertedText, at: .zero) as? [NSAttributedString.Key: Any] ?? [:],
range: .zero
)
doSetMarkedText(blankStr, allowAsync: false)
}
}
}