diff options
author | Rory Dudley | 2024-09-30 21:55:37 -0600 |
---|---|---|
committer | Rory Dudley | 2024-09-30 23:01:56 -0600 |
commit | 9cbd90dc5cd35a63bff1c2d177632fe9b2bca381 (patch) | |
tree | 4bb7542252ccfee7170c7780e559f7edb580a198 | |
parent | 9f5512442177b1242e40c25c14b0ae5d8e6f5359 (diff) | |
download | dwarvish-9cbd90dc5cd35a63bff1c2d177632fe9b2bca381.tar.gz |
Fixed a bug introduced with termios
When at the prompt, ICANON and ECHO should be turned off, since all the
output logic is handled via getline()/getchar(). However, they need to
be turned back on (alongside ECHOE, which allows for backspace
characters to work properly with ICANON), in case other programs need to
get user input, their input will echo to the terminal.
Signed-off-by: Rory Dudley <rory@netc.lu>
-rw-r--r-- | src/main.rs | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/main.rs b/src/main.rs index 527fb8c..8cfd680 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,7 +8,7 @@ use poem::{read::Readable, recite::Reciteable, Poem}; mod compose; use buffer::{getline, STDIN}; use compose::Environment; -use termios::{tcsetattr, Termios, ECHO, ICANON, TCSANOW}; +use termios::{tcsetattr, Termios, ECHO, ECHOE, ICANON, TCSANOW}; /// Starts the main shell loop /// @@ -33,16 +33,12 @@ fn repl( ) { // Setup termios flags let mut termios = Termios::from_fd(STDIN).unwrap(); - termios.c_lflag &= !(ICANON | ECHO); // Initial path refresh on startup env.bins = path::refresh(); // Main shell loop loop { - // Reset terminal using proper termios flags - tcsetattr(STDIN, TCSANOW, &mut termios).unwrap(); - // Clear the buffer buffer.lock().unwrap().clear(); @@ -59,6 +55,10 @@ fn repl( // At the prompt *away.lock().unwrap() = false; + // Unset ICANON and ECHO before the prompt + termios.c_lflag &= !(ICANON | ECHO); + tcsetattr(STDIN, TCSANOW, &mut termios).unwrap(); + // Wait for user input let bytes = getline(buffer, pos); @@ -78,6 +78,10 @@ fn repl( continue; } + // Set ICANON and ECHO for other programs after the prompt + termios.c_lflag |= ICANON | ECHO | ECHOE; + tcsetattr(STDIN, TCSANOW, &mut termios).unwrap(); + // Not at the prompt *away.lock().unwrap() = true; |