From 5a3c3fe737f2a46a9f9757981487394bf9b88005 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Mon, 4 Nov 2019 12:01:40 -0500 Subject: start adding input handling to play --- src/cmd/play.rs | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/cmd/play.rs b/src/cmd/play.rs index c83bb88..9b81390 100644 --- a/src/cmd/play.rs +++ b/src/cmd/play.rs @@ -71,6 +71,8 @@ struct PlaySession { playback_ratio: f32, max_frame_length: Option, + raw_screen: Option, + key_reader: crate::key_reader::KeyReader, to_write: DumbDelayQueue>, // to_write: tokio::timer::delay_queue::DelayQueue>, base_time: std::time::Instant, @@ -91,6 +93,8 @@ impl PlaySession { playback_ratio, max_frame_length, + raw_screen: None, + key_reader: crate::key_reader::KeyReader::new(), to_write: DumbDelayQueue::new(), // to_write: tokio::timer::delay_queue::DelayQueue::new(), base_time: std::time::Instant::now(), @@ -98,6 +102,15 @@ impl PlaySession { total_time_clamped: std::time::Duration::default(), } } + + fn keypress(&mut self, e: &crossterm::InputEvent) -> Result { + match e { + crossterm::InputEvent::Keyboard(crossterm::KeyEvent::Char( + 'q', + )) => Ok(true), + _ => Ok(false), + } + } } impl PlaySession { @@ -111,6 +124,7 @@ impl PlaySession { >] = &[ &Self::poll_open_file, &Self::poll_read_file, + &Self::poll_input, &Self::poll_write_terminal, ]; @@ -169,6 +183,32 @@ impl PlaySession { } } + fn poll_input(&mut self) -> component_future::Poll<(), Error> { + if self.raw_screen.is_none() { + self.raw_screen = Some( + crossterm::RawScreen::into_raw_mode() + .context(crate::error::ToRawMode)?, + ); + } + + let e = component_future::try_ready!(self.key_reader.poll()).unwrap(); + let quit = self.keypress(&e)?; + if quit { + self.raw_screen = None; + + // TODO async + let stdout = std::io::stdout(); + let mut stdout = stdout.lock(); + stdout + .write(b"\x1bc") + .context(crate::error::WriteTerminal)?; + stdout.flush().context(crate::error::FlushTerminal)?; + Ok(component_future::Async::Ready(())) + } else { + Ok(component_future::Async::DidWork) + } + } + fn poll_write_terminal(&mut self) -> component_future::Poll<(), Error> { if let Some(data) = component_future::try_ready!(self .to_write -- cgit v1.2.3-54-g00ecf