From cb88d225a7f6201409c64d0d135018c9aac183e0 Mon Sep 17 00:00:00 2001 From: WhiredPlanck Date: Mon, 14 Oct 2024 14:12:51 +0800 Subject: [PATCH] fix: ime could not response key event from physical keyboard (#1485) --- .../trime/ime/core/TrimeInputMethodService.kt | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/osfans/trime/ime/core/TrimeInputMethodService.kt b/app/src/main/java/com/osfans/trime/ime/core/TrimeInputMethodService.kt index 33ea410c08..cfdcd5ca25 100644 --- a/app/src/main/java/com/osfans/trime/ime/core/TrimeInputMethodService.kt +++ b/app/src/main/java/com/osfans/trime/ime/core/TrimeInputMethodService.kt @@ -32,6 +32,7 @@ import androidx.core.view.updateLayoutParams import androidx.lifecycle.lifecycleScope import com.osfans.trime.BuildConfig import com.osfans.trime.R +import com.osfans.trime.core.KeyModifier import com.osfans.trime.core.KeyModifiers import com.osfans.trime.core.KeyValue import com.osfans.trime.core.Rime @@ -768,10 +769,21 @@ open class TrimeInputMethodService : LifecycleInputMethodService() { private fun forwardKeyEvent(event: KeyEvent): Boolean { val modifiers = KeyModifiers.fromKeyEvent(event) + val charCode = event.unicodeChar + if (charCode > 0 && charCode != '\t'.code) { + postRimeJob { + if (!processKey(charCode, modifiers.modifiers)) { + onKeyEventCallback(KeyValue(charCode), modifiers) + } + } + return true + } val keyVal = KeyValue.fromKeyEvent(event) if (keyVal.value != RimeKeyMapping.RimeKey_VoidSymbol) { postRimeJob { - processKey(keyVal, modifiers) + if (!processKey(keyVal, modifiers)) { + onKeyEventCallback(keyVal, modifiers) + } } return true } @@ -779,6 +791,27 @@ open class TrimeInputMethodService : LifecycleInputMethodService() { return false } + private fun onKeyEventCallback( + keyVal: KeyValue, + modifiers: KeyModifiers, + ) { + val keyCode = keyVal.keyCode + if (keyCode != KeyEvent.KEYCODE_UNKNOWN) { + val eventTime = SystemClock.uptimeMillis() + if (modifiers.modifiers == KeyModifier.Release.modifier) { + sendUpKeyEvent(eventTime, keyCode, modifiers.metaState) + } else { + sendDownKeyEvent(eventTime, keyCode, modifiers.metaState) + } + } else { + if (modifiers.modifiers != KeyModifier.Release.modifier && keyVal.value > 0) { + commitText(Char(keyVal.value).toString()) + } else { + Timber.w("Unhandled Rime KeyEvent: ($keyVal, $modifiers)") + } + } + } + override fun onKeyDown( keyCode: Int, event: KeyEvent,