Add combining event flag

This commit is contained in:
Lee0701 2020-07-05 15:38:22 +09:00
parent af5478ba1c
commit f4f47786eb
5 changed files with 31 additions and 9 deletions

View file

@ -60,6 +60,9 @@ class Event private constructor(// The type of event - one of the constants abov
val isConsumed: Boolean
get() = 0 != FLAG_CONSUMED and mFlags
val isCombining: Boolean
get() = 0 != FLAG_COMBINING and mFlags
val isGesture: Boolean
get() = EVENT_TYPE_GESTURE == mEventType
@ -122,6 +125,8 @@ class Event private constructor(// The type of event - one of the constants abov
private const val FLAG_REPEAT = 0x2
// This event has already been consumed.
private const val FLAG_CONSUMED = 0x4
// This event is a combining character, usually a hangul input.
private const val FLAG_COMBINING = 0x8
@JvmStatic
fun createSoftwareKeypressEvent(codePoint: Int, keyCode: Int,
@ -238,6 +243,12 @@ class Event private constructor(// The type of event - one of the constants abov
source.mNextEvent)
}
fun createCombiningEvent(source: Event): Event {
return Event(source.mEventType, source.mText, source.mCodePoint, source.mKeyCode,
source.mX, source.mY, source.mSuggestedWordInfo, source.mFlags or FLAG_COMBINING,
source.mNextEvent)
}
fun createNotHandledEvent(): Event {
return Event(EVENT_TYPE_NOT_HANDLED, null /* text */, NOT_A_CODE_POINT, NOT_A_KEY_CODE,
Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE,

View file

@ -17,8 +17,7 @@ class HangulCombiner : Combiner {
val text = combiningStateFeedback
reset()
return createEventChainFromSequence(text, event)
}
if(event.isFunctionalKeyEvent) {
} else if(event.isFunctionalKeyEvent) {
if(event.mKeyCode == Constants.CODE_DELETE) {
return when {
history.size == 1 && composingWord.isEmpty() ||
@ -43,7 +42,7 @@ class HangulCombiner : Combiner {
} else {
val currentSyllable = syllable ?: HangulSyllable()
val jamo = HangulJamo.of(event.mCodePoint)
if(jamo is HangulJamo.NonHangul) {
if(!event.isCombining || jamo is HangulJamo.NonHangul) {
val text = combiningStateFeedback
reset()
return createEventChainFromSequence(text, event)

View file

@ -3,13 +3,23 @@ package org.dslul.openboard.inputmethod.event
import android.view.KeyEvent
import org.dslul.openboard.inputmethod.latin.RichInputMethodSubtype
object HangulHardwareKeyDecoder {
import org.dslul.openboard.inputmethod.event.HangulCombiner.HangulJamo
object HangulEventDecoder {
@JvmStatic
fun decode(subtype: RichInputMethodSubtype, event: KeyEvent, defaultEvent: Event): Event {
fun decodeHardwareKeyEvent(subtype: RichInputMethodSubtype, event: KeyEvent, defaultEvent: Event): Event {
val layout = LAYOUTS[subtype.keyboardLayoutSetName] ?: return defaultEvent
val codePoint = layout[event.keyCode]?.let { if(event.isShiftPressed) it.second else it.first } ?: return defaultEvent
val hardwareEvent = Event.createHardwareKeypressEvent(codePoint, event.keyCode, null, event.repeatCount != 0)
return decodeSoftwareKeyEvent(hardwareEvent)
}
return Event.createHardwareKeypressEvent(codePoint, event.keyCode, null, event.repeatCount != 0)
@JvmStatic
fun decodeSoftwareKeyEvent(event: Event): Event {
if(event.isCombining) return event
return if(HangulJamo.of(event.mCodePoint) is HangulJamo.NonHangul) event
else Event.createCombiningEvent(event)
}
val LAYOUT_DUBEOLSIK_STANDARD = mapOf<Int, Pair<Int, Int>>(

View file

@ -54,7 +54,7 @@ import org.dslul.openboard.inputmethod.compat.ViewOutlineProviderCompatUtils;
import org.dslul.openboard.inputmethod.compat.ViewOutlineProviderCompatUtils.InsetsUpdater;
import org.dslul.openboard.inputmethod.dictionarypack.DictionaryPackConstants;
import org.dslul.openboard.inputmethod.event.Event;
import org.dslul.openboard.inputmethod.event.HangulHardwareKeyDecoder;
import org.dslul.openboard.inputmethod.event.HangulEventDecoder;
import org.dslul.openboard.inputmethod.event.HardwareEventDecoder;
import org.dslul.openboard.inputmethod.event.HardwareKeyboardEventDecoder;
import org.dslul.openboard.inputmethod.event.InputTransaction;
@ -1756,7 +1756,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
// If the event is not handled by LatinIME, we just pass it to the parent implementation.
// If it's handled, we return true because we did handle it.
if (event.isHandled()) {
Event hangulDecodedEvent = HangulHardwareKeyDecoder.decode(mKeyboardSwitcher.getKeyboard().mId.mSubtype, keyEvent, event);
Event hangulDecodedEvent = HangulEventDecoder.decodeHardwareKeyEvent(mKeyboardSwitcher.getKeyboard().mId.mSubtype, keyEvent, event);
mInputLogic.onCodeInput(mSettings.getCurrent(), hangulDecodedEvent,
mKeyboardSwitcher.getKeyboardShiftMode(),
// TODO: this is not necessarily correct for a hardware keyboard right now

View file

@ -31,6 +31,7 @@ import android.view.inputmethod.EditorInfo;
import org.dslul.openboard.inputmethod.compat.SuggestionSpanUtils;
import org.dslul.openboard.inputmethod.event.Event;
import org.dslul.openboard.inputmethod.event.HangulEventDecoder;
import org.dslul.openboard.inputmethod.event.InputTransaction;
import org.dslul.openboard.inputmethod.keyboard.Keyboard;
import org.dslul.openboard.inputmethod.keyboard.KeyboardSwitcher;
@ -437,8 +438,9 @@ public final class InputLogic {
public InputTransaction onCodeInput(final SettingsValues settingsValues,
@Nonnull final Event event, final int keyboardShiftMode,
final int currentKeyboardScriptId, final LatinIME.UIHandler handler) {
final Event hangulDecodedEvent = HangulEventDecoder.decodeSoftwareKeyEvent(event);
mWordBeingCorrectedByCursor = null;
final Event processedEvent = mWordComposer.processEvent(event);
final Event processedEvent = mWordComposer.processEvent(hangulDecodedEvent);
final InputTransaction inputTransaction = new InputTransaction(settingsValues,
processedEvent, SystemClock.uptimeMillis(), mSpaceState,
getActualCapsMode(settingsValues, keyboardShiftMode));