Fix invisible input on Windows

This commit is contained in:
mo8it 2024-05-13 02:20:04 +02:00
parent 11fda5d70f
commit 0525739046
3 changed files with 24 additions and 37 deletions

View file

@ -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)?;

View file

@ -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()
}
}

View file

@ -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) => {
match key.kind {
KeyEventKind::Release | KeyEventKind::Repeat => continue,
KeyEventKind::Press => (),
}
if key.modifiers != KeyModifiers::NONE {
continue;
}
match key.kind {
KeyEventKind::Release => continue,
KeyEventKind::Press | KeyEventKind::Repeat => (),
}
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 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;
}
input.clear();
}
KeyCode::Char(c) => {
input.push(c);
}
_ => (),
}
}
Event::Resize(_, _) => {