Skip to content

Commit

Permalink
fix: return key from physical keyboard would commit whitespace (#1518)
Browse files Browse the repository at this point in the history
  • Loading branch information
WhiredPlanck committed Dec 3, 2024
1 parent 41623f5 commit cdb435c
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 20 deletions.
9 changes: 6 additions & 3 deletions app/src/main/java/com/osfans/trime/core/Rime.kt
Original file line number Diff line number Diff line change
Expand Up @@ -79,13 +79,14 @@ class Rime :
modifiers: UInt,
code: Int,
up: Boolean,
virtual: Boolean,
): Boolean =
withRimeContext {
processRimeKey(value, modifiers.toInt()).also {
if (it) {
ipcResponseCallback()
} else {
keyEventCallback(KeyValue(value), KeyModifiers(modifiers), code, up)
keyEventCallback(KeyValue(value), KeyModifiers(modifiers), code, up, virtual)
}
}
}
Expand All @@ -95,13 +96,14 @@ class Rime :
modifiers: KeyModifiers,
code: Int,
up: Boolean,
virtual: Boolean,
): Boolean =
withRimeContext {
processRimeKey(value.value, modifiers.toInt()).also {
if (it) {
ipcResponseCallback()
} else {
keyEventCallback(value, modifiers, code, up)
keyEventCallback(value, modifiers, code, up, virtual)
}
}
}
Expand Down Expand Up @@ -472,8 +474,9 @@ class Rime :
modifiers: KeyModifiers,
code: Int,
up: Boolean,
virtual: Boolean,
) {
handleRimeEvent(RimeEvent.EventType.Key, RimeEvent.KeyEvent.Data(value, modifiers, code, up))
handleRimeEvent(RimeEvent.EventType.Key, RimeEvent.KeyEvent.Data(value, modifiers, code, up, virtual))
}

private fun <T> handleRimeEvent(
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/java/com/osfans/trime/core/RimeApi.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,15 @@ interface RimeApi {
modifiers: UInt = 0u,
code: Int = 0,
up: Boolean = false,
virtual: Boolean = false,
): Boolean

suspend fun processKey(
value: KeyValue,
modifiers: KeyModifiers,
code: Int = 0,
up: Boolean = false,
virtual: Boolean = false,
): Boolean

suspend fun selectCandidate(idx: Int): Boolean
Expand Down
1 change: 1 addition & 0 deletions app/src/main/java/com/osfans/trime/core/RimeEvent.kt
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ sealed class RimeEvent<T>(
val modifiers: KeyModifiers,
val unicode: Int,
val up: Boolean,
val virtual: Boolean,
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -239,24 +239,26 @@ open class TrimeInputMethodService : LifecycleInputMethodService() {
}
is RimeEvent.KeyEvent ->
it.data.let event@{
val keyCode = it.value.keyCode
if (keyCode != KeyEvent.KEYCODE_UNKNOWN) {
// TODO: look for better workaround for this
if (keyCode == KeyEvent.KEYCODE_ENTER) {
handleReturnKey()
return@event
}
val eventTime = SystemClock.uptimeMillis()
if (it.up) {
sendUpKeyEvent(eventTime, keyCode, it.modifiers.metaState)
} else {
sendDownKeyEvent(eventTime, keyCode, it.modifiers.metaState)
if (it.virtual) {
when (it.unicode) {
'\r'.code -> handleReturnKey()
else -> commitText(Char(it.unicode).toString())
}
} else {
if (!it.up && it.unicode > 0) {
commitText(Char(it.unicode).toString())
val keyCode = it.value.keyCode
if (keyCode != KeyEvent.KEYCODE_UNKNOWN) {
val eventTime = SystemClock.uptimeMillis()
if (it.up) {
sendUpKeyEvent(eventTime, keyCode, it.modifiers.metaState)
} else {
sendDownKeyEvent(eventTime, keyCode, it.modifiers.metaState)
}
} else {
Timber.w("Unhandled Rime KeyEvent: $it")
if (!it.up && it.unicode > 0) {
commitText(Char(it.unicode).toString())
} else {
Timber.w("Unhandled Rime KeyEvent: $it")
}
}
}
}
Expand Down Expand Up @@ -722,7 +724,7 @@ open class TrimeInputMethodService : LifecycleInputMethodService() {
val up = event.action == MotionEvent.ACTION_UP
val modifiers = KeyModifiers.fromKeyEvent(event)
val charCode = event.unicodeChar
if (charCode > 0 && charCode != '\t'.code) {
if (charCode > 0 && charCode != '\t'.code && charCode != '\n'.code) {
postRimeJob {
processKey(charCode, modifiers.modifiers, event.scanCode, up)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ class CommonKeyboardActionListener(
val modifiers = KeyModifiers.fromMetaState(metaState).modifiers
val code = ScancodeMapping.keyCodeToScancode(keyEventCode)
service.postRimeJob {
if (processKey(value, modifiers, code)) {
if (processKey(value, modifiers, code, virtual = true)) {
shouldReleaseKey = true
Timber.d("handleKey: processKey")
return@postRimeJob
Expand Down

0 comments on commit cdb435c

Please sign in to comment.