From 361b8a3ac0be8e13f93b92742b6febc8f406c17f Mon Sep 17 00:00:00 2001 From: Isaac Woods Date: Mon, 2 Sep 2024 21:50:09 +0100 Subject: [PATCH] `fb_console`: only allow backspace to delete user input --- user/fb_console/src/main.rs | 57 ++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/user/fb_console/src/main.rs b/user/fb_console/src/main.rs index ae157f6480..2bf600df9e 100644 --- a/user/fb_console/src/main.rs +++ b/user/fb_console/src/main.rs @@ -93,39 +93,50 @@ fn spawn_framebuffer( if let Some(event) = console.input_events.recv().await { match event { InputEvent::KeyPressed(key) => { - write!(console.console.lock(), "{}", key).unwrap(); - needs_redraw = true; + // TODO: `noline` is a no-std REPL impl crate thingy that could be useful + // for improving this experience + match key { + '\n' => { + let mut stmts = Parser::new(¤t_line).parse().unwrap(); + current_line.clear(); + + for mut statement in &mut stmts { + resolver.resolve_bindings(&mut statement); + } - if key == '\n' { - let mut stmts = Parser::new(¤t_line).parse().unwrap(); - current_line.clear(); + let mut result = None; + for statement in stmts { + if let Some(value) = interpreter.eval_stmt(statement) { + result = Some(value); + } + } - for mut statement in &mut stmts { - resolver.resolve_bindings(&mut statement); - } + write!(console.console.lock(), "{}", key); + while let Ok(output) = output_receiver.try_recv() { + writeln!(console.console.lock(), "Output: {}", output).unwrap(); + } - let mut result = None; - for statement in stmts { - if let Some(value) = interpreter.eval_stmt(statement) { - result = Some(value); + if let Some(result) = result { + writeln!(console.console.lock(), "Result: {}", result).unwrap(); } - } - while let Ok(output) = output_receiver.try_recv() { - writeln!(console.console.lock(), "Output: {}", output).unwrap(); + write!(console.console.lock(), "\n> ").unwrap(); + needs_redraw = true; } - if let Some(result) = result { - writeln!(console.console.lock(), "Result: {}", result).unwrap(); + // ASCII `DEL` is produced by backspace + '\x7f' => { + // Only allow the user to delete characters they've typed. + if current_line.pop().is_some() { + write!(console.console.lock(), "{}", key).unwrap(); + needs_redraw = true; + } } - write!(console.console.lock(), "\n> ").unwrap(); - } else { - // Handle backspace (ASCII `DEL`) to delete the last char - if key == '\x7f' { - current_line.pop(); - } else { + other => { + write!(console.console.lock(), "{}", key).unwrap(); current_line.push(key); + needs_redraw = true; } } }