Skip to content

Commit d7987b2

Browse files
committed
fix: ime could not response key event from physical keyboard (#1485)
1 parent efe0d77 commit d7987b2

File tree

1 file changed

+34
-1
lines changed

1 file changed

+34
-1
lines changed

app/src/main/java/com/osfans/trime/ime/core/TrimeInputMethodService.kt

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import androidx.core.view.updateLayoutParams
3232
import androidx.lifecycle.lifecycleScope
3333
import com.osfans.trime.BuildConfig
3434
import com.osfans.trime.R
35+
import com.osfans.trime.core.KeyModifier
3536
import com.osfans.trime.core.KeyModifiers
3637
import com.osfans.trime.core.KeyValue
3738
import com.osfans.trime.core.Rime
@@ -768,17 +769,49 @@ open class TrimeInputMethodService : LifecycleInputMethodService() {
768769

769770
private fun forwardKeyEvent(event: KeyEvent): Boolean {
770771
val modifiers = KeyModifiers.fromKeyEvent(event)
772+
val charCode = event.unicodeChar
773+
if (charCode > 0 && charCode != '\t'.code) {
774+
postRimeJob {
775+
if (!processKey(charCode, modifiers.modifiers)) {
776+
onKeyEventCallback(KeyValue(charCode), modifiers)
777+
}
778+
}
779+
return true
780+
}
771781
val keyVal = KeyValue.fromKeyEvent(event)
772782
if (keyVal.value != RimeKeyMapping.RimeKey_VoidSymbol) {
773783
postRimeJob {
774-
processKey(keyVal, modifiers)
784+
if (!processKey(keyVal, modifiers)) {
785+
onKeyEventCallback(keyVal, modifiers)
786+
}
775787
}
776788
return true
777789
}
778790
Timber.d("Skipped KeyEvent: $event")
779791
return false
780792
}
781793

794+
private fun onKeyEventCallback(
795+
keyVal: KeyValue,
796+
modifiers: KeyModifiers,
797+
) {
798+
val keyCode = keyVal.keyCode
799+
if (keyCode != KeyEvent.KEYCODE_UNKNOWN) {
800+
val eventTime = SystemClock.uptimeMillis()
801+
if (modifiers.modifiers == KeyModifier.Release.modifier) {
802+
sendUpKeyEvent(eventTime, keyCode, modifiers.metaState)
803+
} else {
804+
sendDownKeyEvent(eventTime, keyCode, modifiers.metaState)
805+
}
806+
} else {
807+
if (modifiers.modifiers != KeyModifier.Release.modifier && keyVal.value > 0) {
808+
commitText(Char(keyVal.value).toString())
809+
} else {
810+
Timber.w("Unhandled Rime KeyEvent: ($keyVal, $modifiers)")
811+
}
812+
}
813+
}
814+
782815
override fun onKeyDown(
783816
keyCode: Int,
784817
event: KeyEvent,

0 commit comments

Comments
 (0)