Skip to content

Commit 19005e6

Browse files
committed
feat: implement RimeEvent to hold events created by this frontend
feat: forward rejected key event via callback flow to handle globally
1 parent bde2c47 commit 19005e6

File tree

3 files changed

+100
-36
lines changed

3 files changed

+100
-36
lines changed

app/src/main/java/com/osfans/trime/core/Rime.kt

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,27 @@ class Rime :
7979
modifiers: UInt,
8080
): Boolean =
8181
withRimeContext {
82-
processRimeKey(value, modifiers.toInt()).also { if (it) requestRimeResponse() }
82+
processRimeKey(value, modifiers.toInt()).also {
83+
if (it) {
84+
requestRimeResponse()
85+
} else {
86+
keyEventCallback(KeyValue(value), KeyModifiers(modifiers))
87+
}
88+
}
8389
}
8490

8591
override suspend fun processKey(
8692
value: KeyValue,
8793
modifiers: KeyModifiers,
8894
): Boolean =
8995
withRimeContext {
90-
processRimeKey(value.value, modifiers.toInt()).also { if (it) requestRimeResponse() }
96+
processRimeKey(value.value, modifiers.toInt()).also {
97+
if (it) {
98+
requestRimeResponse()
99+
} else {
100+
keyEventCallback(value, modifiers)
101+
}
102+
}
91103
}
92104

93105
override suspend fun selectCandidate(idx: Int): Boolean =
@@ -286,7 +298,11 @@ class Rime :
286298
Timber.d("processKey: keyCode=$keycode, mask=$mask")
287299
return processRimeKey(keycode, mask).also {
288300
Timber.d("processKey ${if (it) "success" else "failed"}")
289-
if (it) requestRimeResponse()
301+
if (it) {
302+
requestRimeResponse()
303+
} else {
304+
keyEventCallback(KeyValue(keycode), KeyModifiers.of(mask))
305+
}
290306
}
291307
}
292308

@@ -482,6 +498,29 @@ class Rime :
482498
callbackFlow_.tryEmit(notification)
483499
}
484500

501+
fun requestRimeResponse() {
502+
val response = RimeResponse(getRimeCommit(), getRimeContext(), getRimeStatus())
503+
Timber.d("Got Rime response: $response")
504+
callbackFlow_.tryEmit(response)
505+
}
506+
507+
private fun keyEventCallback(
508+
value: KeyValue,
509+
modifiers: KeyModifiers,
510+
) {
511+
handleRimeEvent(RimeEvent.EventType.Key, RimeEvent.KeyEvent.Data(value, modifiers))
512+
}
513+
514+
private fun <T> handleRimeEvent(
515+
type: RimeEvent.EventType,
516+
data: T,
517+
) {
518+
val event = RimeEvent.create(type, data)
519+
Timber.d("Handling $event")
520+
callbackHandlers.forEach { it.invoke(event) }
521+
callbackFlow_.tryEmit(event)
522+
}
523+
485524
private fun registerRimeCallbackHandler(handler: (RimeCallback) -> Unit) {
486525
if (callbackHandlers.contains(handler)) return
487526
callbackHandlers.add(handler)
@@ -490,11 +529,5 @@ class Rime :
490529
private fun unregisterRimeCallbackHandler(handler: (RimeCallback) -> Unit) {
491530
callbackHandlers.remove(handler)
492531
}
493-
494-
fun requestRimeResponse() {
495-
val response = RimeResponse(getRimeCommit(), getRimeContext(), getRimeStatus())
496-
Timber.d("Got Rime response: $response")
497-
callbackFlow_.tryEmit(response)
498-
}
499532
}
500533
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2015 - 2024 Rime community
3+
* SPDX-License-Identifier: GPL-3.0-or-later
4+
*/
5+
6+
package com.osfans.trime.core
7+
8+
sealed class RimeEvent<T>(
9+
open val data: T,
10+
) : RimeCallback {
11+
abstract val eventType: EventType
12+
13+
data class KeyEvent(
14+
override val data: Data,
15+
) : RimeEvent<KeyEvent.Data>(data) {
16+
override val eventType = EventType.Key
17+
18+
data class Data(
19+
val value: KeyValue,
20+
val modifiers: KeyModifiers,
21+
)
22+
}
23+
24+
enum class EventType {
25+
Key,
26+
}
27+
28+
companion object {
29+
fun <T> create(
30+
type: EventType,
31+
data: T,
32+
) = when (type) {
33+
EventType.Key ->
34+
KeyEvent(data as KeyEvent.Data)
35+
}
36+
}
37+
}

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

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import com.osfans.trime.core.KeyValue
3838
import com.osfans.trime.core.Rime
3939
import com.osfans.trime.core.RimeApi
4040
import com.osfans.trime.core.RimeCallback
41+
import com.osfans.trime.core.RimeEvent
4142
import com.osfans.trime.core.RimeKeyMapping
4243
import com.osfans.trime.core.RimeNotification
4344
import com.osfans.trime.core.RimeProto
@@ -294,6 +295,24 @@ open class TrimeInputMethodService : LifecycleInputMethodService() {
294295
}
295296
updateComposing()
296297
}
298+
is RimeEvent.KeyEvent ->
299+
it.data.let event@{
300+
val keyCode = it.value.keyCode
301+
if (keyCode != KeyEvent.KEYCODE_UNKNOWN) {
302+
val eventTime = SystemClock.uptimeMillis()
303+
if (it.modifiers.modifiers == KeyModifier.Release.modifier) {
304+
sendUpKeyEvent(eventTime, keyCode, it.modifiers.metaState)
305+
} else {
306+
sendDownKeyEvent(eventTime, keyCode, it.modifiers.metaState)
307+
}
308+
} else {
309+
if (it.modifiers.modifiers != KeyModifier.Release.modifier && it.value.value > 0) {
310+
commitText(Char(it.value.value).toString())
311+
} else {
312+
Timber.w("Unhandled Rime KeyEvent: $it")
313+
}
314+
}
315+
}
297316
else -> {}
298317
}
299318
}
@@ -772,46 +791,21 @@ open class TrimeInputMethodService : LifecycleInputMethodService() {
772791
val charCode = event.unicodeChar
773792
if (charCode > 0 && charCode != '\t'.code) {
774793
postRimeJob {
775-
if (!processKey(charCode, modifiers.modifiers)) {
776-
onKeyEventCallback(KeyValue(charCode), modifiers)
777-
}
794+
processKey(charCode, modifiers.modifiers)
778795
}
779796
return true
780797
}
781798
val keyVal = KeyValue.fromKeyEvent(event)
782799
if (keyVal.value != RimeKeyMapping.RimeKey_VoidSymbol) {
783800
postRimeJob {
784-
if (!processKey(keyVal, modifiers)) {
785-
onKeyEventCallback(keyVal, modifiers)
786-
}
801+
processKey(keyVal, modifiers)
787802
}
788803
return true
789804
}
790805
Timber.d("Skipped KeyEvent: $event")
791806
return false
792807
}
793808

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-
815809
override fun onKeyDown(
816810
keyCode: Int,
817811
event: KeyEvent,

0 commit comments

Comments
 (0)