diff options
author | rabite <rabite@posteo.de> | 2019-05-07 21:42:45 +0200 |
---|---|---|
committer | rabite <rabite@posteo.de> | 2019-05-07 23:48:32 +0200 |
commit | 54e0a4246feb6b384c21f0390884b379d3bdfa81 (patch) | |
tree | a05b55090ddf88bf4b5b9241685439f439258043 | |
parent | d248d0789fe3260265c6d6519d6d0c255fdc09ed (diff) |
flush stdin after reading input
-rw-r--r-- | src/term.rs | 10 | ||||
-rw-r--r-- | src/widget.rs | 8 |
2 files changed, 14 insertions, 4 deletions
diff --git a/src/term.rs b/src/term.rs index fb84ae3..35105fd 100644 --- a/src/term.rs +++ b/src/term.rs @@ -1,4 +1,4 @@ -use std::io::{Stdout, Write, BufWriter}; +use std::io::{Stdout, Write, BufWriter, BufRead}; use std::sync::{Arc, Mutex, RwLock}; use termion; @@ -142,6 +142,14 @@ pub trait ScreenExt: Write { impl ScreenExt for Screen {} impl ScreenExt for TermMode {} +pub fn flush_stdin() { + let stdin = std::io::stdin(); + let mut stdin = stdin.lock(); + + // Not 100% sure if it's OK to just call consume like this + stdin.consume(10); +} + pub fn xsize() -> u16 { let (xsize, _) = termion::terminal_size().unwrap(); xsize diff --git a/src/widget.rs b/src/widget.rs index 3cbdf8c..c106f7e 100644 --- a/src/widget.rs +++ b/src/widget.rs @@ -528,9 +528,11 @@ fn event_thread(rx_global: Receiver<Events>, fn input_thread(tx: Sender<Events>, rx_input_request: Receiver<()>) { std::thread::spawn(move || { for input in stdin().events() { - let input = input.unwrap(); - tx.send(Events::InputEvent(input)).unwrap(); - rx_input_request.recv().unwrap(); + term::flush_stdin(); + input.map(|input| { + tx.send(Events::InputEvent(input)).unwrap(); + rx_input_request.recv().unwrap(); + }).map_err(|e| e.into()).log(); } }); } |