aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-11-04 12:01:40 -0500
committerJesse Luehrs <doy@tozt.net>2019-11-04 12:51:47 -0500
commit5a3c3fe737f2a46a9f9757981487394bf9b88005 (patch)
tree22ebfb00d2defb154c270f9f787b78b80f999b1b
parentba3d78f0443ea691c8fc13709e94bc3dd6aced1b (diff)
downloadteleterm-5a3c3fe737f2a46a9f9757981487394bf9b88005.tar.gz
teleterm-5a3c3fe737f2a46a9f9757981487394bf9b88005.zip
start adding input handling to play
-rw-r--r--src/cmd/play.rs40
1 files changed, 40 insertions, 0 deletions
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<std::time::Duration>,
+ raw_screen: Option<crossterm::RawScreen>,
+ key_reader: crate::key_reader::KeyReader,
to_write: DumbDelayQueue<Vec<u8>>,
// to_write: tokio::timer::delay_queue::DelayQueue<Vec<u8>>,
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<bool> {
+ 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