From 231ecff5f0837d1aa2831039b64afd07915e1cab Mon Sep 17 00:00:00 2001 From: agnostic-apollo Date: Sun, 29 May 2022 22:44:57 +0500 Subject: [PATCH] Changed: Do not modify code points for virtual or soft keyboard events Closes #2799 --- .../java/com/termux/view/TerminalView.java | 45 +++++++++++-------- .../termux/terminal/io/TerminalExtraKeys.java | 2 +- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/terminal-view/src/main/java/com/termux/view/TerminalView.java b/terminal-view/src/main/java/com/termux/view/TerminalView.java index b76ea858..2bed7cab 100644 --- a/terminal-view/src/main/java/com/termux/view/TerminalView.java +++ b/terminal-view/src/main/java/com/termux/view/TerminalView.java @@ -83,6 +83,12 @@ public final class TerminalView extends View { private final boolean mAccessibilityEnabled; + /** The {@link KeyEvent} is generated from a virtual keyboard, like manually with the {@link KeyEvent#KeyEvent(int, int)} constructor. */ + public final static int KEY_EVENT_SOURCE_VIRTUAL_KEYBOARD = KeyCharacterMap.VIRTUAL_KEYBOARD; // -1 + + /** The {@link KeyEvent} is generated from a non-physical device, like if 0 value is returned by {@link KeyEvent#getDeviceId()}. */ + public final static int KEY_EVENT_SOURCE_SOFT_KEYBOARD = 0; + private static final String LOG_TAG = "TerminalView"; public TerminalView(Context context, AttributeSet attributes) { // NO_UCD (unused code) @@ -380,7 +386,7 @@ public final class TerminalView extends View { } } - inputCodePoint(codePoint, ctrlHeld, false); + inputCodePoint(KEY_EVENT_SOURCE_SOFT_KEYBOARD, codePoint, ctrlHeld, false); } } @@ -755,7 +761,7 @@ public final class TerminalView extends View { if ((result & KeyCharacterMap.COMBINING_ACCENT) != 0) { // If entered combining accent previously, write it out: if (mCombiningAccent != 0) - inputCodePoint(mCombiningAccent, controlDown, leftAltDown); + inputCodePoint(event.getDeviceId(), mCombiningAccent, controlDown, leftAltDown); mCombiningAccent = result & KeyCharacterMap.COMBINING_ACCENT_MASK; } else { if (mCombiningAccent != 0) { @@ -763,7 +769,7 @@ public final class TerminalView extends View { if (combinedChar > 0) result = combinedChar; mCombiningAccent = 0; } - inputCodePoint(result, controlDown, leftAltDown); + inputCodePoint(event.getDeviceId(), result, controlDown, leftAltDown); } if (mCombiningAccent != oldCombiningAccent) invalidate(); @@ -771,9 +777,9 @@ public final class TerminalView extends View { return true; } - public void inputCodePoint(int codePoint, boolean controlDownFromEvent, boolean leftAltDownFromEvent) { + public void inputCodePoint(int eventSource, int codePoint, boolean controlDownFromEvent, boolean leftAltDownFromEvent) { if (TERMINAL_VIEW_KEY_LOGGING_ENABLED) { - mClient.logInfo(LOG_TAG, "inputCodePoint(codePoint=" + codePoint + ", controlDownFromEvent=" + controlDownFromEvent + ", leftAltDownFromEvent=" + mClient.logInfo(LOG_TAG, "inputCodePoint(eventSource=" + eventSource + ", codePoint=" + codePoint + ", controlDownFromEvent=" + controlDownFromEvent + ", leftAltDownFromEvent=" + leftAltDownFromEvent + ")"); } @@ -813,19 +819,22 @@ public final class TerminalView extends View { } if (codePoint > -1) { - // Work around bluetooth keyboards sending funny unicode characters instead - // of the more normal ones from ASCII that terminal programs expect - the - // desire to input the original characters should be low. - switch (codePoint) { - case 0x02DC: // SMALL TILDE. - codePoint = 0x007E; // TILDE (~). - break; - case 0x02CB: // MODIFIER LETTER GRAVE ACCENT. - codePoint = 0x0060; // GRAVE ACCENT (`). - break; - case 0x02C6: // MODIFIER LETTER CIRCUMFLEX ACCENT. - codePoint = 0x005E; // CIRCUMFLEX ACCENT (^). - break; + // If not virtual or soft keyboard. + if (eventSource > KEY_EVENT_SOURCE_SOFT_KEYBOARD) { + // Work around bluetooth keyboards sending funny unicode characters instead + // of the more normal ones from ASCII that terminal programs expect - the + // desire to input the original characters should be low. + switch (codePoint) { + case 0x02DC: // SMALL TILDE. + codePoint = 0x007E; // TILDE (~). + break; + case 0x02CB: // MODIFIER LETTER GRAVE ACCENT. + codePoint = 0x0060; // GRAVE ACCENT (`). + break; + case 0x02C6: // MODIFIER LETTER CIRCUMFLEX ACCENT. + codePoint = 0x005E; // CIRCUMFLEX ACCENT (^). + break; + } } // If left alt, send escape before the code point to make e.g. Alt+B and Alt+F work in readline: diff --git a/termux-shared/src/main/java/com/termux/shared/termux/terminal/io/TerminalExtraKeys.java b/termux-shared/src/main/java/com/termux/shared/termux/terminal/io/TerminalExtraKeys.java index 44eb5b02..8aa77772 100644 --- a/termux-shared/src/main/java/com/termux/shared/termux/terminal/io/TerminalExtraKeys.java +++ b/termux-shared/src/main/java/com/termux/shared/termux/terminal/io/TerminalExtraKeys.java @@ -67,7 +67,7 @@ public class TerminalExtraKeys implements ExtraKeysView.IExtraKeysView { // not a control char if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { key.codePoints().forEach(codePoint -> { - mTerminalView.inputCodePoint(codePoint, ctrlDown, altDown); + mTerminalView.inputCodePoint(TerminalView.KEY_EVENT_SOURCE_VIRTUAL_KEYBOARD, codePoint, ctrlDown, altDown); }); } else { TerminalSession session = mTerminalView.getCurrentSession();