diff options
Diffstat (limited to 'src/cmd')
-rw-r--r-- | src/cmd/record.rs | 58 | ||||
-rw-r--r-- | src/cmd/stream.rs | 58 | ||||
-rw-r--r-- | src/cmd/watch.rs | 18 |
3 files changed, 69 insertions, 65 deletions
diff --git a/src/cmd/record.rs b/src/cmd/record.rs index 2d9116c..d25df4e 100644 --- a/src/cmd/record.rs +++ b/src/cmd/record.rs @@ -68,7 +68,8 @@ enum FileState { struct RecordSession { file: FileState, - process: crate::resize::ResizingProcess<crate::async_stdin::Stdin>, + process: + tokio_pty_process_stream::ResizingProcess<crate::async_stdin::Stdin>, stdout: tokio::io::Stdout, buffer: crate::term::Buffer, sent_local: usize, @@ -85,7 +86,7 @@ impl RecordSession { args: &[String], ) -> Self { let input = crate::async_stdin::Stdin::new(); - let process = crate::resize::ResizingProcess::new( + let process = tokio_pty_process_stream::ResizingProcess::new( tokio_pty_process_stream::Process::new(cmd, args, input), ); @@ -157,47 +158,40 @@ impl RecordSession { } fn poll_read_process(&mut self) -> component_future::Poll<(), Error> { - match component_future::try_ready!(self.process.poll()) { - Some(crate::resize::Event::Process(e)) => { - match e { - tokio_pty_process_stream::Event::CommandStart { - .. - } => { - if self.raw_screen.is_none() { - self.raw_screen = Some( - crossterm::RawScreen::into_raw_mode() - .context(crate::error::ToRawMode)?, - ); - } - } - tokio_pty_process_stream::Event::CommandExit { - .. - } => { - self.done = true; - } - tokio_pty_process_stream::Event::Output { data } => { - self.record_bytes(&data); - if let FileState::Open { writer } = &mut self.file { - writer - .frame(&data) - .context(crate::error::WriteTtyrec)?; - } - } + match component_future::try_ready!(self + .process + .poll() + .context(crate::error::Subprocess)) + { + Some(tokio_pty_process_stream::Event::CommandStart { + .. + }) => { + if self.raw_screen.is_none() { + self.raw_screen = Some( + crossterm::RawScreen::into_raw_mode() + .context(crate::error::ToRawMode)?, + ); } - Ok(component_future::Async::DidWork) } - Some(crate::resize::Event::Resize(_)) => { - Ok(component_future::Async::DidWork) + Some(tokio_pty_process_stream::Event::CommandExit { .. }) => { + self.done = true; } + Some(tokio_pty_process_stream::Event::Output { data }) => { + self.record_bytes(&data); + if let FileState::Open { writer } = &mut self.file { + writer.frame(&data).context(crate::error::WriteTtyrec)?; + } + } + Some(tokio_pty_process_stream::Event::Resize { .. }) => {} None => { if !self.done { unreachable!() } // don't return final event here - wait until we are done // writing all data to the file (see poll_write_file) - Ok(component_future::Async::DidWork) } } + Ok(component_future::Async::DidWork) } fn poll_write_terminal(&mut self) -> component_future::Poll<(), Error> { diff --git a/src/cmd/stream.rs b/src/cmd/stream.rs index 9d2cf83..b4f1a26 100644 --- a/src/cmd/stream.rs +++ b/src/cmd/stream.rs @@ -119,7 +119,8 @@ struct StreamSession< S: tokio::io::AsyncRead + tokio::io::AsyncWrite + Send + 'static, > { client: crate::client::Client<S>, - process: crate::resize::ResizingProcess<crate::async_stdin::Stdin>, + process: + tokio_pty_process_stream::ResizingProcess<crate::async_stdin::Stdin>, stdout: tokio::io::Stdout, buffer: crate::term::Buffer, sent_local: usize, @@ -148,7 +149,7 @@ impl<S: tokio::io::AsyncRead + tokio::io::AsyncWrite + Send + 'static> // let input = tokio::io::stdin(); let input = crate::async_stdin::Stdin::new(); - let process = crate::resize::ResizingProcess::new( + let process = tokio_pty_process_stream::ResizingProcess::new( tokio_pty_process_stream::Process::new(cmd, args, input), ); @@ -235,34 +236,33 @@ impl<S: tokio::io::AsyncRead + tokio::io::AsyncWrite + Send + 'static> } fn poll_read_process(&mut self) -> component_future::Poll<(), Error> { - match component_future::try_ready!(self.process.poll()) { - Some(crate::resize::Event::Process(e)) => { - match e { - tokio_pty_process_stream::Event::CommandStart { - .. - } => { - if self.raw_screen.is_none() { - self.raw_screen = Some( - crossterm::RawScreen::into_raw_mode() - .context(crate::error::ToRawMode)?, - ); - } - } - tokio_pty_process_stream::Event::CommandExit { - .. - } => { - self.done = true; - } - tokio_pty_process_stream::Event::Output { data } => { - self.record_bytes(&data); - } + match component_future::try_ready!(self + .process + .poll() + .context(crate::error::Subprocess)) + { + Some(tokio_pty_process_stream::Event::CommandStart { + .. + }) => { + if self.raw_screen.is_none() { + self.raw_screen = Some( + crossterm::RawScreen::into_raw_mode() + .context(crate::error::ToRawMode)?, + ); } - Ok(component_future::Async::DidWork) } - Some(crate::resize::Event::Resize(size)) => { - self.client - .send_message(crate::protocol::Message::resize(&size)); - Ok(component_future::Async::DidWork) + Some(tokio_pty_process_stream::Event::CommandExit { .. }) => { + self.done = true; + } + Some(tokio_pty_process_stream::Event::Output { data }) => { + self.record_bytes(&data); + } + Some(tokio_pty_process_stream::Event::Resize { + size: (rows, cols), + }) => { + self.client.send_message(crate::protocol::Message::resize( + &crate::term::Size { rows, cols }, + )); } None => { if !self.done { @@ -270,9 +270,9 @@ impl<S: tokio::io::AsyncRead + tokio::io::AsyncWrite + Send + 'static> } // don't return final event here - wait until we are done // sending all data to the server (see poll_write_server) - Ok(component_future::Async::DidWork) } } + Ok(component_future::Async::DidWork) } fn poll_write_terminal(&mut self) -> component_future::Poll<(), Error> { diff --git a/src/cmd/watch.rs b/src/cmd/watch.rs index 67e3507..0e4e197 100644 --- a/src/cmd/watch.rs +++ b/src/cmd/watch.rs @@ -190,7 +190,12 @@ struct WatchSession< key_reader: crate::key_reader::KeyReader, list_client: crate::client::Client<S>, - resizer: crate::resize::Resizer, + resizer: Box< + dyn futures::stream::Stream< + Item = (u16, u16), + Error = crate::error::Error, + > + Send, + >, state: State<S>, raw_screen: Option<crossterm::RawScreen>, needs_redraw: bool, @@ -212,7 +217,11 @@ impl<S: tokio::io::AsyncRead + tokio::io::AsyncWrite + Send + 'static> key_reader: crate::key_reader::KeyReader::new(), list_client, - resizer: crate::resize::Resizer::new(), + resizer: Box::new( + tokio_terminal_resize::resizes() + .flatten_stream() + .context(crate::error::Resize), + ), state: State::new(), raw_screen: None, needs_redraw: true, @@ -577,8 +586,9 @@ impl<S: tokio::io::AsyncRead + tokio::io::AsyncWrite + Send + 'static> ]; fn poll_resizer(&mut self) -> component_future::Poll<(), Error> { - let size = component_future::try_ready!(self.resizer.poll()).unwrap(); - self.resize(size)?; + let (rows, cols) = + component_future::try_ready!(self.resizer.poll()).unwrap(); + self.resize(crate::term::Size { rows, cols })?; Ok(component_future::Async::DidWork) } |