From 4738aef079cd460e41df7ec97554e1624c7717cf Mon Sep 17 00:00:00 2001 From: tianrking <10758833+tianrking@users.noreply.github.com> Date: Wed, 12 Aug 2026 02:38:39 +0800 Subject: [PATCH] terminal: preserve modified physical enter keys --- .../src/main/java/com/termux/terminal/KeyHandler.java | 4 ++++ .../src/test/java/com/termux/terminal/KeyHandlerTest.java | 6 ++++++ 2 files changed, 10 insertions(+) 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 8ecfb630e4..ea72f61e4b 100644 --- a/terminal-emulator/src/main/java/com/termux/terminal/KeyHandler.java +++ b/terminal-emulator/src/main/java/com/termux/terminal/KeyHandler.java @@ -248,6 +248,10 @@ public static String getCode(int keyCode, int keyMode, boolean cursorApp, boolea // This is back-tab when shifted: return (keyMode & KEYMOD_SHIFT) == 0 ? "\011" : "\033[Z"; case KEYCODE_ENTER: + // Preserve the distinction between a plain Enter and modified + // physical Enter keys for terminal applications that use LF + // as an insertion/newline action. + if ((keyMode & (KEYMOD_SHIFT | KEYMOD_CTRL)) != 0) return "\n"; return ((keyMode & KEYMOD_ALT) == 0) ? "\r" : "\033\r"; case KEYCODE_NUMPAD_ENTER: diff --git a/terminal-emulator/src/test/java/com/termux/terminal/KeyHandlerTest.java b/terminal-emulator/src/test/java/com/termux/terminal/KeyHandlerTest.java index 15b23761a8..79958e9593 100644 --- a/terminal-emulator/src/test/java/com/termux/terminal/KeyHandlerTest.java +++ b/terminal-emulator/src/test/java/com/termux/terminal/KeyHandlerTest.java @@ -107,6 +107,12 @@ public void testKeyCodes() { // Return sends carriage return (\r), which normally gets translated by the device driver to newline (\n) unless the ICRNL termios // flag has been set. assertKeysEquals("\r", KeyHandler.getCode(KeyEvent.KEYCODE_ENTER, 0, false, false)); + assertKeysEquals("\033\r", KeyHandler.getCode(KeyEvent.KEYCODE_ENTER, KeyHandler.KEYMOD_ALT, false, false)); + // Modified physical Enter keys use LF so terminal applications can + // distinguish them from a plain Enter submission. + assertKeysEquals("\n", KeyHandler.getCode(KeyEvent.KEYCODE_ENTER, KeyHandler.KEYMOD_SHIFT, false, false)); + assertKeysEquals("\n", KeyHandler.getCode(KeyEvent.KEYCODE_ENTER, KeyHandler.KEYMOD_CTRL, false, false)); + assertKeysEquals("\n", KeyHandler.getCode(KeyEvent.KEYCODE_ENTER, KeyHandler.KEYMOD_SHIFT | KeyHandler.KEYMOD_CTRL, false, false)); // Backspace. assertKeysEquals("\u007f", KeyHandler.getCode(KeyEvent.KEYCODE_DEL, 0, false, false));