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 /// IMK commitComposition
private func commit(text: String) { private func commit(text: String) {
guard !text.isEmpty else { return }
let phE = PrefMgr.shared.phraseReplacementEnabled && text.count > 1 let phE = PrefMgr.shared.phraseReplacementEnabled && text.count > 1
var text = text.trimmingCharacters(in: .newlines) var text = text.trimmingCharacters(in: .newlines)
var replaced = false var replaced = false
@ -140,19 +141,22 @@ public extension SessionCtl {
if phE, !replaced, let queried = inputHandler?.currentLM.queryReplacementValue(key: buffer) { if phE, !replaced, let queried = inputHandler?.currentLM.queryReplacementValue(key: buffer) {
buffer = ChineseConverter.kanjiConversionIfRequired(queried) buffer = ChineseConverter.kanjiConversionIfRequired(queried)
} }
if isServingIMEItself {
DispatchQueue.main.async { func doCommit() {
guard let client = self.client() else { return }
client.insertText(
buffer, replacementRange: self.replacementRange()
)
}
} else {
guard let client = client() else { return } guard let client = client() else { return }
handlePreCommit()
client.insertText( client.insertText(
buffer, replacementRange: replacementRange() buffer, replacementRange: replacementRange()
) )
} }
if isServingIMEItself {
DispatchQueue.main.async {
doCommit()
}
} else {
doCommit()
}
} }
/// setMarkedText GCD /// setMarkedText GCD
@ -161,13 +165,13 @@ public extension SessionCtl {
/// - string: NSAttributedString /// - string: NSAttributedString
/// replacementRange Microsoft Office /// replacementRange Microsoft Office
/// / /// /
func doSetMarkedText(_ string: NSAttributedString) { func doSetMarkedText(_ string: NSAttributedString, allowAsync: Bool = true) {
// replacementRange replacementRange // replacementRange replacementRange
let range = attributedStringSecured.range let range = attributedStringSecured.range
guard !(string.isEqual(to: recentMarkedText.text) && recentMarkedText.selectionRange == range) else { return } guard !(string.isEqual(to: recentMarkedText.text) && recentMarkedText.selectionRange == range) else { return }
recentMarkedText.text = string recentMarkedText.text = string
recentMarkedText.selectionRange = range recentMarkedText.selectionRange = range
if isServingIMEItself || !isActivated { if allowAsync, isServingIMEItself || !isActivated {
DispatchQueue.main.async { DispatchQueue.main.async {
guard let client = self.client() else { return } guard let client = self.client() else { return }
client.setMarkedText( 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)
}
}
} }