Skip to content

Commit

Permalink
fix: forgot to invoke response handlers in Rime itself
Browse files Browse the repository at this point in the history
which would make the cached variables not be updated in time
  • Loading branch information
WhiredPlanck committed Oct 4, 2024
1 parent fa6e56c commit 7920903
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 37 deletions.
55 changes: 20 additions & 35 deletions app/src/main/java/com/osfans/trime/core/Rime.kt
Original file line number Diff line number Diff line change
Expand Up @@ -53,15 +53,14 @@ class Rime :
Timber.i("Starting up Rime APIs ...")
startupRime(sharedDataDir, userDataDir, fullCheck)

SchemaManager.init(getCurrentRimeSchema())
updateStatus()
requestRimeResponse()

OpenCCDictManager.buildOpenCCDict()
lifecycleImpl.emitState(RimeLifecycle.State.READY)
}

override fun nativeScheduleTasks() {
updateContext()
requestRimeResponse()
}

override fun nativeFinalize() {
Expand Down Expand Up @@ -157,21 +156,25 @@ class Rime :
is RimeNotification.SchemaNotification -> schemaItemCached = notif.value
else -> {}
}
updateContext()
requestRimeResponse()
}

private fun handleRimeResponse(response: RimeResponse) {
SchemaManager.init(getCurrentRimeSchema())
if (response.status != null) {
val (item, status) =
response.status.run {
SchemaItem(schemaId, schemaName) to
InputStatus(isDisabled, isComposing, isAsciiMode, isFullShape, isSimplified, isTraditional, isAsciiPunch)
response.status.let {
SchemaItem.fromStatus(it) to InputStatus.fromStatus(it)
}
inputStatusCached = status
inputStatus = response.status // for compatibility
if (item != schemaItemCached) {
schemaItemCached = item
}
}
if (response.context != null) {
inputContext = response.context // for compatibility
}
}

fun startup(fullCheck: Boolean) {
Expand Down Expand Up @@ -205,8 +208,8 @@ class Rime :
}

companion object {
var inputContext: RimeProto.Context? = null
private var mStatus: RimeProto.Status? = null
private var inputContext: RimeProto.Context? = null
private var inputStatus: RimeProto.Status? = null
private val notificationFlow_ =
MutableSharedFlow<RimeNotification<*>>(
extraBufferCapacity = 15,
Expand All @@ -227,22 +230,6 @@ class Rime :
System.loadLibrary("rime_jni")
}

fun updateStatus() {
SchemaManager.updateSwitchOptions()
measureTimeMillis {
mStatus = getRimeStatus()
}.also { Timber.d("Took $it ms to get status") }
}

fun updateContext() {
Timber.d("Update Rime context ...")
measureTimeMillis {
inputContext = getRimeContext()
}.also { Timber.d("Took $it ms to get context") }
updateStatus()
requestRimeResponse()
}

/*
Android SDK包含了如下6个修饰键的状态,其中function键会被trime消费掉,因此只处理5个键
Android和librime对按键命名并不一致。读取可能有误。librime按键命名见如下链接,
Expand All @@ -267,16 +254,13 @@ class Rime :
val META_RELEASE_ON = getRimeModifierByName("Release")

@JvmStatic
val isComposing get() = mStatus?.isComposing ?: false
val isComposing get() = inputStatus?.isComposing ?: false

@JvmStatic
val isAsciiMode get() = mStatus?.isAsciiMode ?: true
val isAsciiMode get() = inputStatus?.isAsciiMode ?: true

@JvmStatic
val isAsciiPunch get() = mStatus?.isAsciiPunch ?: true

@JvmStatic
val currentSchemaName get() = mStatus?.schemaName ?: ""
val currentSchemaName get() = inputStatus?.schemaName ?: ""

@JvmStatic
fun hasMenu(): Boolean = !inputContext?.menu?.candidates.isNullOrEmpty()
Expand All @@ -285,7 +269,7 @@ class Rime :
fun hasLeft(): Boolean = hasMenu() && inputContext?.menu?.pageNumber != 0

@JvmStatic
fun showAsciiPunch(): Boolean = mStatus?.isAsciiPunch == true || mStatus?.isAsciiMode == true
fun showAsciiPunch(): Boolean = inputStatus?.isAsciiPunch == true || inputStatus?.isAsciiMode == true

@JvmStatic
val composingText: String
Expand All @@ -307,7 +291,7 @@ class Rime :
Timber.d("processKey: keyCode=$keycode, mask=$mask")
return processRimeKey(keycode, mask).also {
Timber.d("processKey ${if (it) "success" else "failed"}")
updateContext()
requestRimeResponse()
}
}

Expand All @@ -319,7 +303,7 @@ class Rime :
sequence.toString().replace("{}", "{braceleft}{braceright}"),
).also {
Timber.d("simulateKeySequence ${if (it) "success" else "failed"}")
updateContext()
requestRimeResponse()
}
}

Expand All @@ -339,7 +323,7 @@ class Rime :
@JvmStatic
fun setCaretPos(caretPos: Int) {
setRimeCaretPos(caretPos)
updateContext()
requestRimeResponse()
}

// init
Expand Down Expand Up @@ -515,6 +499,7 @@ class Rime :
fun requestRimeResponse() {
val response = RimeResponse(getRimeCommit(), getRimeContext(), getRimeStatus())
Timber.d("Got Rime response: $response")
responseHandlers.forEach { it.invoke(response) }
responseFlow_.tryEmit(response)
}

Expand Down
13 changes: 11 additions & 2 deletions app/src/main/java/com/osfans/trime/core/Structs.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,11 @@ package com.osfans.trime.core
data class SchemaItem(
val id: String,
val name: String = "",
)
) {
companion object {
fun fromStatus(status: RimeProto.Status) = status.run { SchemaItem(schemaId, schemaName) }
}
}

data class CandidateItem(
val comment: String,
Expand All @@ -22,4 +26,9 @@ data class InputStatus(
val isSimplified: Boolean = false,
val isTraditional: Boolean = false,
val isAsciiPunch: Boolean = true,
)
) {
companion object {
fun fromStatus(status: RimeProto.Status) =
status.run { InputStatus(isDisabled, isComposing, isAsciiMode, isFullShape, isSimplified, isTraditional, isAsciiPunch) }
}
}

0 comments on commit 7920903

Please sign in to comment.