From 34bdcb12e5d09a5a05d4001c5dc87445591871da Mon Sep 17 00:00:00 2001 From: Bananymous Date: Tue, 19 Aug 2025 04:03:50 +0300 Subject: [PATCH] Kernel: Fix termios and enter key handling Enter key now produces expected \r which gets converted to \n by default by the ICRNL input flag. Also input flags are now handled always, not just when ICANON is set. I don't know why I though ICANON should disable input handling --- kernel/kernel/Terminal/PseudoTerminal.cpp | 2 +- kernel/kernel/Terminal/TTY.cpp | 24 +++++++++-------------- kernel/kernel/Terminal/VirtualTTY.cpp | 2 +- userspace/libraries/LibInput/KeyEvent.cpp | 6 +++--- 4 files changed, 14 insertions(+), 20 deletions(-) diff --git a/kernel/kernel/Terminal/PseudoTerminal.cpp b/kernel/kernel/Terminal/PseudoTerminal.cpp index 7132834a..5c8ea167 100644 --- a/kernel/kernel/Terminal/PseudoTerminal.cpp +++ b/kernel/kernel/Terminal/PseudoTerminal.cpp @@ -165,7 +165,7 @@ namespace Kernel PseudoTerminalSlave::PseudoTerminalSlave(BAN::String&& name, uint32_t number, mode_t mode, uid_t uid, gid_t gid) : TTY({ - .c_iflag = 0, + .c_iflag = ICRNL, .c_oflag = 0, .c_cflag = CS8, .c_lflag = ECHO | ECHOE | ECHOK | ICANON | ISIG, diff --git a/kernel/kernel/Terminal/TTY.cpp b/kernel/kernel/Terminal/TTY.cpp index 0a38161c..4e9a6a3a 100644 --- a/kernel/kernel/Terminal/TTY.cpp +++ b/kernel/kernel/Terminal/TTY.cpp @@ -243,19 +243,14 @@ namespace Kernel LockGuard _(m_mutex); - if (m_termios.c_lflag & ICANON) - { - if ((m_termios.c_iflag & ISTRIP)) - ch &= 0x7F; - if ((m_termios.c_iflag & IGNCR) && ch == CR) - return; - uint8_t conv = ch; - if ((m_termios.c_iflag & ICRNL) && ch == CR) - conv = NL; - if ((m_termios.c_iflag & INLCR) && ch == NL) - conv = CR; - ch = conv; - } + if ((m_termios.c_iflag & ISTRIP)) + ch &= 0x7F; + if ((m_termios.c_iflag & IGNCR) && ch == CR) + return; + if ((m_termios.c_iflag & ICRNL) && ch == CR) + ch = NL; + else if ((m_termios.c_iflag & INLCR) && ch == NL) + ch = CR; if (m_termios.c_lflag & ISIG) { @@ -298,11 +293,10 @@ namespace Kernel should_flush = true; } - if (ch == NL || ch == m_termios.c_cc[VEOL]) + if (ch == NL || ch == CR || ch == m_termios.c_cc[VEOL]) { should_flush = true; force_echo = !!(m_termios.c_lflag & ECHONL); - ch = NL; } } diff --git a/kernel/kernel/Terminal/VirtualTTY.cpp b/kernel/kernel/Terminal/VirtualTTY.cpp index c2e5d37c..8c1feb1e 100644 --- a/kernel/kernel/Terminal/VirtualTTY.cpp +++ b/kernel/kernel/Terminal/VirtualTTY.cpp @@ -37,7 +37,7 @@ namespace Kernel VirtualTTY::VirtualTTY(BAN::RefPtr driver) : TTY({ - .c_iflag = 0, + .c_iflag = ICRNL, .c_oflag = 0, .c_cflag = CS8, .c_lflag = ECHO | ECHOE | ECHOK | ICANON | ISIG, diff --git a/userspace/libraries/LibInput/KeyEvent.cpp b/userspace/libraries/LibInput/KeyEvent.cpp index 28690dd2..552f219a 100644 --- a/userspace/libraries/LibInput/KeyEvent.cpp +++ b/userspace/libraries/LibInput/KeyEvent.cpp @@ -58,7 +58,7 @@ namespace LibInput "å", "ä", "ö", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - /*"Insert", "PrintScreen", "Delete", "Home", "End", "PageUp", "PageDown",*/ nullptr, nullptr, "\x7F", nullptr, nullptr, nullptr, nullptr, "\n", " ", + /*"Insert", "PrintScreen", "Delete", "Home", "End", "PageUp", "PageDown",*/ nullptr, nullptr, "\x7F", nullptr, nullptr, nullptr, nullptr, "\r", " ", "!", "\"", "#", "¤", "%", "&", "/", "§", "½", "(", ")", "[", "]", "{", "}", "=", "?", "+", "\\", "´", "`", "¨", "¸", "\b", "@", "£", "$", "€", @@ -77,7 +77,7 @@ namespace LibInput "Å", "Ä", "Ö", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - /*"Insert", "PrintScreen", "Delete", "Home", "End", "PageUp", "PageDown",*/ nullptr, nullptr, "\x7F", nullptr, nullptr, nullptr, nullptr, "\n", " ", + /*"Insert", "PrintScreen", "Delete", "Home", "End", "PageUp", "PageDown",*/ nullptr, nullptr, "\x7F", nullptr, nullptr, nullptr, nullptr, "\r", " ", "!", "\"", "#", "¤", "%", "&", "/", "§", "½", "(", ")", "[", "]", "{", "}", "=", "?", "+", "\\", "´", "`", "¨", "¸", "\b", "@", "£", "$", "€", @@ -96,7 +96,7 @@ namespace LibInput "Å", "Ä", "Ö", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - /*"Insert", "PrintScreen", "Delete", "Home", "End", "PageUp", "PageDown",*/ nullptr, nullptr, "\x7F", nullptr, nullptr, nullptr, nullptr, "\n", " ", + /*"Insert", "PrintScreen", "Delete", "Home", "End", "PageUp", "PageDown",*/ nullptr, nullptr, "\x7F", nullptr, nullptr, nullptr, nullptr, "\r", " ", "!", "\"", "#", "¤", "%", "&", "/", "§", "½", "(", ")", "[", "]", "{", "}", "=", "?", "+", "\\", "´", "`", "¨", "¸", "\b", "@", "£", "$", "€",