summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRory Dudley2024-09-30 21:55:37 -0600
committerRory Dudley2024-09-30 23:01:56 -0600
commit9cbd90dc5cd35a63bff1c2d177632fe9b2bca381 (patch)
tree4bb7542252ccfee7170c7780e559f7edb580a198
parent9f5512442177b1242e40c25c14b0ae5d8e6f5359 (diff)
downloaddwarvish-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.rs14
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;