mirror of
https://github.com/Helium314/HeliBoard.git
synced 2025-05-22 01:34:22 +00:00
Add combining event flag
This commit is contained in:
parent
af5478ba1c
commit
f4f47786eb
5 changed files with 31 additions and 9 deletions
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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>>(
|
|
@ -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
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue