[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 06/11] 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.
---
 src/main.rs | 14 +++++++++-----
 1 file 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;
 
-- 
2.46.2




References:
[PATCH 00/11] Add filepath autcompleteRory Dudley <rory@xxxxxxx>
Archive administrator: postmaster AT dwarvish DOT org