From ac33e2c8b17b451c0f02c14a139f5c3407984767 Mon Sep 17 00:00:00 2001 From: if-can Date: Fri, 7 Feb 2025 22:45:54 +0800 Subject: [PATCH] fix: in `ascii_mode` and `ascii_punct` modes, symbols for which mapping has not been set in the scheme config will cannot be committed --- .../main/java/com/osfans/trime/core/Rime.kt | 23 +++++++++++++++---- .../keyboard/CommonKeyboardActionListener.kt | 17 +++++++------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/osfans/trime/core/Rime.kt b/app/src/main/java/com/osfans/trime/core/Rime.kt index fb256299c6..d76222f0b4 100644 --- a/app/src/main/java/com/osfans/trime/core/Rime.kt +++ b/app/src/main/java/com/osfans/trime/core/Rime.kt @@ -290,11 +290,26 @@ class Rime : fun simulateKeySequence(sequence: CharSequence): Boolean { if (!sequence.first().isAsciiPrintable()) return false Timber.d("simulateKeySequence: $sequence") - return simulateRimeKeySequence( - sequence.toString().replace("{}", "{braceleft}{braceright}"), - ).also { + + val simulateResult = + simulateRimeKeySequence( + sequence.toString().replace("{}", "{braceleft}{braceright}"), + ) + val commit = getRimeCommit() + val ctx = getRimeContext() + + return (simulateResult && (!commit?.text.isNullOrEmpty() || !ctx?.input.isNullOrEmpty())).also { Timber.d("simulateKeySequence ${if (it) "success" else "failed"}") - if (it) requireResponse() + if (it) { + handleRimeMessage( + 4, // RimeMessage.MessageType.Response + arrayOf( + commit ?: RimeProto.Commit(null), + ctx ?: return false, + getRimeStatus() ?: return false, + ), + ) + } } } diff --git a/app/src/main/java/com/osfans/trime/ime/keyboard/CommonKeyboardActionListener.kt b/app/src/main/java/com/osfans/trime/ime/keyboard/CommonKeyboardActionListener.kt index 27665d5267..9f86c2323f 100644 --- a/app/src/main/java/com/osfans/trime/ime/keyboard/CommonKeyboardActionListener.kt +++ b/app/src/main/java/com/osfans/trime/ime/keyboard/CommonKeyboardActionListener.kt @@ -59,8 +59,8 @@ class CommonKeyboardActionListener( /** Pattern for braced key event like `{Left}`, `{Right}`, etc. */ private val BRACED_KEY_EVENT = """^(\{[^{}]+\}).*$""".toRegex() - /** Pattern for braced key event to capture `{Escape}` as group 2 */ - private val BRACED_KEY_EVENT_WITH_ESCAPE = """^((\{Escape\})?[^{}]+).*$""".toRegex() + /** Pattern for unbraced characters (including {Escape}) like `abc`, `{Escape}jk` etc. */ + private val UNBRACED_CHAR = """^((\{Escape\})?[^{}]+).*$""".toRegex() private val PLACEHOLDER_PATTERN = Regex(".*(%([1-4]\\$)?s).*") } @@ -339,9 +339,7 @@ class CommonKeyboardActionListener( while (sequence.isNotEmpty()) { val slice = when { - BRACED_KEY_EVENT_WITH_ESCAPE.matches(sequence) -> - BRACED_KEY_EVENT_WITH_ESCAPE.matchEntire(sequence)?.groupValues?.get(1) - ?: "" + UNBRACED_CHAR.matches(sequence) -> UNBRACED_CHAR.matchEntire(sequence)?.groupValues?.get(1) ?: "" BRACED_KEY_EVENT.matches(sequence) -> BRACED_KEY_EVENT.matchEntire(sequence)?.groupValues?.get(1) ?: "" else -> sequence.first().toString() } @@ -349,10 +347,11 @@ class CommonKeyboardActionListener( service.postRimeJob { if (slice.startsWith("{") && slice.endsWith("}")) { onAction(KeyActionManager.getAction(slice)) - } else { - if ((!Rime.simulateKeySequence(slice) || Rime.isAsciiMode) && !Rime.isComposing) { - service.commitText(slice.replace("{Escape}", "")) - } + return@postRimeJob + } + + if (!Rime.simulateKeySequence(slice)) { + service.commitText(slice.replace("{Escape}", "")) } }