From 9a73ead88da495ba5103f1872ec427e0b126a0cf Mon Sep 17 00:00:00 2001 From: Florian Dehau Date: Sun, 16 Jun 2019 23:03:36 +0200 Subject: [PATCH] Improve crossterm demo * Use AlternateScreen * Handle input events --- examples/crossterm_demo.rs | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/examples/crossterm_demo.rs b/examples/crossterm_demo.rs index 76e36d6..dad4ced 100644 --- a/examples/crossterm_demo.rs +++ b/examples/crossterm_demo.rs @@ -7,7 +7,7 @@ use std::sync::mpsc; use std::thread; use std::time::Duration; -use crossterm; +use crossterm::{input, AlternateScreen, InputEvent, KeyEvent}; use structopt::StructOpt; use tui::backend::CrosstermBackend; use tui::Terminal; @@ -31,7 +31,8 @@ fn main() -> Result<(), failure::Error> { let cli = Cli::from_args(); stderrlog::new().quiet(!cli.log).verbosity(4).init()?; - let backend = CrosstermBackend::new(); + let screen = AlternateScreen::to_alternate(true)?; + let backend = CrosstermBackend::with_alternate_screen(screen)?; let mut terminal = Terminal::new(backend)?; terminal.hide_cursor()?; @@ -40,18 +41,19 @@ fn main() -> Result<(), failure::Error> { { let tx = tx.clone(); thread::spawn(move || { - let input = crossterm::input(); - loop { - match input.read_char() { - Ok(key) => { + let input = input(); + let reader = input.read_sync(); + for event in reader { + match event { + InputEvent::Keyboard(key) => { if let Err(_) = tx.send(Event::Input(key)) { return; } - if key == 'q' { + if key == KeyEvent::Char('q') { return; } } - Err(_) => {} + _ => {} } } }); @@ -74,10 +76,14 @@ fn main() -> Result<(), failure::Error> { loop { ui::draw(&mut terminal, &app)?; match rx.recv()? { - Event::Input(key) => { - // TODO: handle key events once they are supported by crossterm - app.on_key(key); - } + Event::Input(event) => match event { + KeyEvent::Char(c) => app.on_key(c), + KeyEvent::Left => app.on_left(), + KeyEvent::Up => app.on_up(), + KeyEvent::Right => app.on_right(), + KeyEvent::Down => app.on_down(), + _ => {} + }, Event::Tick => { app.on_tick(); }