summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormo8it <mo8it@proton.me>2024-05-13 02:20:04 +0200
committermo8it <mo8it@proton.me>2024-05-13 02:20:04 +0200
commit052573904604896398a6cc7281398fa9fdf8f083 (patch)
treeb7938cc434609ca534203ca7b275ec3b6c8b0a98 /src
parent11fda5d70f568e0f528d91dd573447719abe05f4 (diff)
Fix invisible input on Windows
Diffstat (limited to 'src')
-rw-r--r--src/watch.rs4
-rw-r--r--src/watch/state.rs13
-rw-r--r--src/watch/terminal_event.rs46
3 files changed, 25 insertions, 38 deletions
diff --git a/src/watch.rs b/src/watch.rs
index 453d9a4..944d77b 100644
--- a/src/watch.rs
+++ b/src/watch.rs
@@ -92,8 +92,8 @@ pub fn watch(
break;
}
WatchEvent::Input(InputEvent::Run) => watch_state.run_current_exercise()?,
- WatchEvent::Input(InputEvent::Unrecognized(cmd)) => {
- watch_state.handle_invalid_cmd(&cmd)?;
+ WatchEvent::Input(InputEvent::Unrecognized(input)) => {
+ watch_state.handle_invalid_input(input)?;
}
WatchEvent::FileChange { exercise_ind } => {
watch_state.run_exercise_with_ind(exercise_ind)?;
diff --git a/src/watch/state.rs b/src/watch/state.rs
index 2cf7521..f3ffac8 100644
--- a/src/watch/state.rs
+++ b/src/watch/state.rs
@@ -166,14 +166,11 @@ When you are done experimenting, enter `n` (or `next`) to move on to the next ex
self.render()
}
- pub fn handle_invalid_cmd(&mut self, cmd: &str) -> io::Result<()> {
- self.writer.write_all(b"Invalid command: ")?;
- self.writer.write_all(cmd.as_bytes())?;
- if cmd.len() > 1 {
- self.writer
- .write_all(b" (confusing input can occur after resizing the terminal)")?;
- }
- self.writer.write_all(b"\n")?;
+ pub fn handle_invalid_input(&mut self, input: char) -> io::Result<()> {
+ writeln!(
+ self.writer,
+ "Invalid input: {input} (confusing input can occur after resizing the terminal)",
+ )?;
self.show_prompt()
}
}
diff --git a/src/watch/terminal_event.rs b/src/watch/terminal_event.rs
index 6d790b7..846bec1 100644
--- a/src/watch/terminal_event.rs
+++ b/src/watch/terminal_event.rs
@@ -9,12 +9,10 @@ pub enum InputEvent {
Hint,
List,
Quit,
- Unrecognized(String),
+ Unrecognized(char),
}
pub fn terminal_event_handler(tx: Sender<WatchEvent>, manual_run: bool) {
- let mut input = String::with_capacity(8);
-
let last_input_event = loop {
let terminal_event = match event::read() {
Ok(v) => v,
@@ -28,36 +26,28 @@ pub fn terminal_event_handler(tx: Sender<WatchEvent>, manual_run: bool) {
match terminal_event {
Event::Key(key) => {
- if key.modifiers != KeyModifiers::NONE {
- continue;
- }
-
match key.kind {
- KeyEventKind::Release => continue,
- KeyEventKind::Press | KeyEventKind::Repeat => (),
+ KeyEventKind::Release | KeyEventKind::Repeat => continue,
+ KeyEventKind::Press => (),
}
- match key.code {
- KeyCode::Enter => {
- let input_event = match input.trim() {
- "n" | "next" => InputEvent::Next,
- "h" | "hint" => InputEvent::Hint,
- "l" | "list" => break InputEvent::List,
- "q" | "quit" => break InputEvent::Quit,
- "r" | "run" if manual_run => InputEvent::Run,
- _ => InputEvent::Unrecognized(input.clone()),
- };
-
- if tx.send(WatchEvent::Input(input_event)).is_err() {
- return;
- }
+ if key.modifiers != KeyModifiers::NONE {
+ continue;
+ }
- input.clear();
- }
- KeyCode::Char(c) => {
- input.push(c);
+ if let KeyCode::Char(c) = key.code {
+ let input_event = match c {
+ 'n' => InputEvent::Next,
+ 'h' => InputEvent::Hint,
+ 'l' => break InputEvent::List,
+ 'q' => break InputEvent::Quit,
+ 'r' if manual_run => InputEvent::Run,
+ _ => InputEvent::Unrecognized(c),
+ };
+
+ if tx.send(WatchEvent::Input(input_event)).is_err() {
+ return;
}
- _ => (),
}
}
Event::Resize(_, _) => {