From 50fe0033d6dd9db1a193d81fd937db2db452fe11 Mon Sep 17 00:00:00 2001 From: Ico Doornekamp Date: Tue, 24 Jul 2018 18:42:51 +0200 Subject: [PATCH] Added support for mapping key combos on devices with a hardware keyboard, Fixes #731. Fn+Left -> Home Fn+Right -> End Fn+Up -> Page Up Fn+Down -> Page Down --- .../java/com/termux/terminal/KeyHandler.java | 27 +++++++++++++++---- .../java/com/termux/view/TerminalView.java | 1 + 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/terminal-emulator/src/main/java/com/termux/terminal/KeyHandler.java b/terminal-emulator/src/main/java/com/termux/terminal/KeyHandler.java index a4d0f1ac87..6e4b809c5f 100644 --- a/terminal-emulator/src/main/java/com/termux/terminal/KeyHandler.java +++ b/terminal-emulator/src/main/java/com/termux/terminal/KeyHandler.java @@ -59,6 +59,7 @@ public final class KeyHandler { public static final int KEYMOD_ALT = 0x80000000; public static final int KEYMOD_CTRL = 0x40000000; public static final int KEYMOD_SHIFT = 0x20000000; + public static final int KEYMOD_FUNCTION = 0x10000000; private static final Map TERMCAP_TO_KEYCODE = new HashMap<>(); @@ -154,13 +155,29 @@ public static String getCode(int keyCode, int keyMode, boolean cursorApp, boolea return "\015"; case KEYCODE_DPAD_UP: - return (keyMode == 0) ? (cursorApp ? "\033OA" : "\033[A") : transformForModifiers("\033[1", keyMode, 'A'); + if((keyMode & KEYMOD_FUNCTION) != 0) { + return transformForModifiers("\033[5", keyMode, '~'); + } else { + return (keyMode == 0) ? (cursorApp ? "\033OA" : "\033[A") : transformForModifiers("\033[1", keyMode, 'A'); + } case KEYCODE_DPAD_DOWN: - return (keyMode == 0) ? (cursorApp ? "\033OB" : "\033[B") : transformForModifiers("\033[1", keyMode, 'B'); + if((keyMode & KEYMOD_FUNCTION) != 0) { + return transformForModifiers("\033[6", keyMode, '~'); + } else { + return (keyMode == 0) ? (cursorApp ? "\033OB" : "\033[B") : transformForModifiers("\033[1", keyMode, 'B'); + } case KEYCODE_DPAD_RIGHT: - return (keyMode == 0) ? (cursorApp ? "\033OC" : "\033[C") : transformForModifiers("\033[1", keyMode, 'C'); + if((keyMode & KEYMOD_FUNCTION) != 0) { + return ((keyMode & ~KEYMOD_FUNCTION) == 0) ? "\033[F" : transformForModifiers("\033[1", keyMode, 'F'); + } else { + return (keyMode == 0) ? (cursorApp ? "\033OC" : "\033[C") : transformForModifiers("\033[1", keyMode, 'C'); + } case KEYCODE_DPAD_LEFT: - return (keyMode == 0) ? (cursorApp ? "\033OD" : "\033[D") : transformForModifiers("\033[1", keyMode, 'D'); + if((keyMode & KEYMOD_FUNCTION) != 0) { + return ((keyMode & ~KEYMOD_FUNCTION) == 0) ? "\033[H" : transformForModifiers("\033[1", keyMode, 'H'); + } else { + return (keyMode == 0) ? (cursorApp ? "\033OD" : "\033[D") : transformForModifiers("\033[1", keyMode, 'D'); + } case KEYCODE_MOVE_HOME: // Note that KEYCODE_HOME is handled by the system and never delivered to applications. @@ -283,7 +300,7 @@ public static String getCode(int keyCode, int keyMode, boolean cursorApp, boolea private static String transformForModifiers(String start, int keymod, char lastChar) { int modifier; - switch (keymod) { + switch (keymod & (KEYMOD_SHIFT | KEYMOD_ALT | KEYMOD_CTRL)) { case KEYMOD_SHIFT: modifier = 2; break; 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 feadb25d48..bfa931df08 100644 --- a/terminal-view/src/main/java/com/termux/view/TerminalView.java +++ b/terminal-view/src/main/java/com/termux/view/TerminalView.java @@ -600,6 +600,7 @@ public boolean onKeyDown(int keyCode, KeyEvent event) { if (controlDownFromEvent) keyMod |= KeyHandler.KEYMOD_CTRL; if (event.isAltPressed()) keyMod |= KeyHandler.KEYMOD_ALT; if (event.isShiftPressed()) keyMod |= KeyHandler.KEYMOD_SHIFT; + if (event.isFunctionPressed()) keyMod |= KeyHandler.KEYMOD_FUNCTION; if (handleKeyCode(keyCode, keyMod)) { if (LOG_KEY_EVENTS) Log.i(EmulatorDebug.LOG_TAG, "handleKeyCode() took key event"); return true;