diff options
author | Rory Dudley | 2024-09-30 21:55:34 -0600 |
---|---|---|
committer | Rory Dudley | 2024-09-30 23:01:48 -0600 |
commit | 9f5512442177b1242e40c25c14b0ae5d8e6f5359 (patch) | |
tree | 5a87e33e0cbbf6b051e1c1001f88838d0a3615b9 /src/main.rs | |
parent | c51ad81d3cf5998e9eacf655a704ff21d154ae0a (diff) | |
download | dwarvish-9f5512442177b1242e40c25c14b0ae5d8e6f5359.tar.gz |
Slight refactor of getchar() and more handling for getline()
The getchar() function was changed so that it is able to detect some
ANSI escape sequences. To better handle this, getchar() now returns a
value from the Key enum, indicating whether or not an escape sequence
was found. Currently, the only escape sequences the function deals with
are arrow keys.
Handling of the left and right arrow keys were added to the getline()
function, in order to allow a user to go back and edit their command
inplace. Up and down arrow keys are also handled, but they are just
ignored for now (i.e. they do not move the cursor around anymore). The
local 'pos' variable became an Arc<Mutex<usize>>, since it needs to be
reset to 0 if ctrl-c is pressed (the handler for which is outside the
scope of getline()).
Signed-off-by: Rory Dudley <rory@netc.lu>
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/main.rs b/src/main.rs index d5147ff..527fb8c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -25,7 +25,12 @@ use termios::{tcsetattr, Termios, ECHO, ICANON, TCSANOW}; /// repl(&mut away, &mut env); /// } /// ``` -fn repl(away: &mut Arc<Mutex<bool>>, buffer: &mut Arc<Mutex<Vec<u8>>>, env: &mut Environment) { +fn repl( + away: &mut Arc<Mutex<bool>>, + buffer: &mut Arc<Mutex<Vec<u8>>>, + pos: &mut Arc<Mutex<usize>>, + env: &mut Environment, +) { // Setup termios flags let mut termios = Termios::from_fd(STDIN).unwrap(); termios.c_lflag &= !(ICANON | ECHO); @@ -55,7 +60,7 @@ fn repl(away: &mut Arc<Mutex<bool>>, buffer: &mut Arc<Mutex<Vec<u8>>>, env: &mut *away.lock().unwrap() = false; // Wait for user input - let bytes = getline(buffer); + let bytes = getline(buffer, pos); // Check if we've reached EOF (i.e. <C-d>) if bytes == 0 { @@ -145,11 +150,14 @@ fn main() { // Handle signals let mut away = Arc::new(Mutex::new(true)); let mut buffer: Arc<Mutex<Vec<u8>>> = Arc::new(Mutex::new(vec![])); + let mut pos: Arc<Mutex<usize>> = Arc::new(Mutex::new(0)); unsafe { let away = Arc::clone(&away); let buffer = Arc::clone(&buffer); + let pos = Arc::clone(&pos); signal_hook::low_level::register(signal_hook::consts::SIGINT, move || { buffer.lock().unwrap().clear(); + *pos.lock().unwrap() = 0; if *away.lock().unwrap() { println!(); } else { @@ -168,5 +176,5 @@ fn main() { options(&mut env); // Begin evaluating commands - repl(&mut away, &mut buffer, &mut env); + repl(&mut away, &mut buffer, &mut pos, &mut env); } |