diff options
| author | Menny Even Danan <menny@evendanan.net> | 2020-08-10 04:21:14 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-08-10 04:21:14 +0000 |
| commit | 8b8c8575dda934ca818567e7e0a11700cc38442a (patch) | |
| tree | bc51084f04ad8237232598ba4e10a0f1a2a9ad21 | |
| parent | 21c29c0a4543ef28b5f00bb7767179a819d7955c (diff) | |
| parent | e712b7782a2b6be9ea748fec9ff5ef2604d8cc3e (diff) | |
| download | AnySoftKeyboard-8b8c8575dda934ca818567e7e0a11700cc38442a.tar.gz AnySoftKeyboard-8b8c8575dda934ca818567e7e0a11700cc38442a.tar.bz2 | |
Merge pull request #2407 from mirfatif/ctrl-non-terminal-apps
Make Ctrl work with non-terminal apps too
| -rw-r--r-- | ime/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/ime/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java b/ime/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java index d39a2373b..759716f5b 100644 --- a/ime/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java +++ b/ime/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java @@ -608,6 +608,24 @@ public abstract class AnySoftKeyboard extends AnySoftKeyboardColorizeNavBar { } } + // convert ASCII codes to Android KeyEvent codes + // ASCII Codes Table: https://ascii.cl + private int getKeyCode(int ascii) { + // A to Z + if (ascii >= 65 && ascii <= 90) return (KeyEvent.KEYCODE_A + ascii - 65); + // a to z + if (ascii >= 97 && ascii <= 122) return (KeyEvent.KEYCODE_A + ascii - 97); + + return 0; + } + + // send key events + private void sendKeyEvent(InputConnection ic, int action, int keyCode, int meta) { + if (ic == null) return; + long now = System.currentTimeMillis(); + ic.sendKeyEvent(new KeyEvent(now, now, action, keyCode, 0, meta)); + } + private void onNonFunctionKey( final int primaryCode, final Keyboard.Key key, @@ -667,8 +685,16 @@ public abstract class AnySoftKeyboard extends AnySoftKeyboardColorizeNavBar { default: if (isWordSeparator(primaryCode)) { handleSeparator(primaryCode); - } else { - if (mControlKeyState.isActive() && primaryCode >= 32 && primaryCode < 127) { + } else if (mControlKeyState.isActive()) { + int keyCode = getKeyCode(primaryCode); + if (Build.VERSION.SDK_INT >= 11 && keyCode != 0) { + // TextView (and hence its subclasses) can handle ^A, ^Z, ^X, ^C and ^V + // https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-10.0.0_r1/core/java/android/widget/TextView.java#11136 + // simulate physical keyboard behavior i.e. press and release a key while + // keeping Ctrl pressed + sendKeyEvent(ic, KeyEvent.ACTION_DOWN, keyCode, KeyEvent.META_CTRL_MASK); + sendKeyEvent(ic, KeyEvent.ACTION_UP, keyCode, KeyEvent.META_CTRL_MASK); + } else if (primaryCode >= 32 && primaryCode < 127) { // http://en.wikipedia.org/wiki/Control_character#How_control_characters_map_to_keyboards int controlCode = primaryCode & 31; Logger.d( @@ -684,6 +710,8 @@ public abstract class AnySoftKeyboard extends AnySoftKeyboardColorizeNavBar { } else { handleCharacter(primaryCode, key, multiTapIndex, nearByKeyCodes); } + } else { + handleCharacter(primaryCode, key, multiTapIndex, nearByKeyCodes); } break; } |
