diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/key_reader.rs | 20 | ||||
-rw-r--r-- | src/readline.rs | 35 | ||||
-rw-r--r-- | src/tui.rs | 7 |
3 files changed, 27 insertions, 35 deletions
diff --git a/src/key_reader.rs b/src/key_reader.rs index a59259c..6ee010a 100644 --- a/src/key_reader.rs +++ b/src/key_reader.rs @@ -16,8 +16,9 @@ pub enum Error { } pub struct KeyReader { - events: - Option<tokio::sync::mpsc::UnboundedReceiver<crossterm::InputEvent>>, + events: Option< + tokio::sync::mpsc::UnboundedReceiver<crossterm::input::InputEvent>, + >, quit: Option<tokio::sync::oneshot::Sender<()>>, } @@ -31,13 +32,13 @@ impl KeyReader { } impl futures::stream::Stream for KeyReader { - type Item = crossterm::InputEvent; + type Item = crossterm::input::InputEvent; type Error = Error; fn poll(&mut self) -> futures::Poll<Option<Self::Item>, Self::Error> { if self.events.is_none() { let task = futures::task::current(); - let reader = crossterm::input().read_sync(); + let reader = crossterm::input::input().read_sync(); let (events_tx, events_rx) = tokio::sync::mpsc::unbounded_channel(); let mut events_tx = events_tx.wait(); @@ -47,21 +48,10 @@ impl futures::stream::Stream for KeyReader { std::thread::Builder::new() .spawn(move || { for event in reader { - // sigh, this is extra janky, but otherwise the thread - // will outlive the current instance and eat the first - // character typed that was supposed to go to the - // thread spawned by the next instance - let newline = event - == crossterm::InputEvent::Keyboard( - crossterm::KeyEvent::Char('\n'), - ); // unwrap is unpleasant, but so is figuring out how to // propagate the error back to the main thread events_tx.send(event).unwrap(); task.notify(); - if newline { - break; - } if quit_rx.try_recv().is_ok() { break; } diff --git a/src/readline.rs b/src/readline.rs index 336beba..815b15b 100644 --- a/src/readline.rs +++ b/src/readline.rs @@ -14,7 +14,7 @@ pub enum Error { "failed to put the terminal into raw mode: {}", source ))] - IntoRawMode { source: std::io::Error }, + IntoRawMode { source: crossterm::ErrorKind }, #[snafu(display("{}", source))] KeyReader { source: crate::key_reader::Error }, @@ -29,7 +29,7 @@ pub fn readline() -> Readline { pub struct Readline { reader: crate::key_reader::KeyReader, state: ReadlineState, - raw_screen: Option<crossterm::RawScreen>, + raw_screen: Option<crossterm::screen::RawScreen>, } struct ReadlineState { @@ -92,11 +92,11 @@ impl Readline { impl ReadlineState { fn process_event( &mut self, - event: crossterm::InputEvent, + event: &crossterm::input::InputEvent, ) -> Result<futures::Async<String>> { match event { - crossterm::InputEvent::Keyboard(e) => { - return self.process_keyboard_event(&e); + crossterm::input::InputEvent::Keyboard(e) => { + return self.process_keyboard_event(*e); } _ => {} } @@ -106,17 +106,17 @@ impl ReadlineState { fn process_keyboard_event( &mut self, - event: &crossterm::KeyEvent, + event: crossterm::input::KeyEvent, ) -> Result<futures::Async<String>> { - match *event { - crossterm::KeyEvent::Char('\n') => { + match event { + crossterm::input::KeyEvent::Char('\n') => { self.echo_char('\n').context(WriteToTerminal)?; return Ok(futures::Async::Ready(self.buffer.clone())); } - crossterm::KeyEvent::Char('\t') => { + crossterm::input::KeyEvent::Char('\t') => { // TODO } - crossterm::KeyEvent::Char(c) => { + crossterm::input::KeyEvent::Char(c) => { if self.cursor != self.buffer.len() { self.echo(b"\x1b[@").context(WriteToTerminal)?; } @@ -124,7 +124,7 @@ impl ReadlineState { self.buffer.insert(self.cursor, c); self.cursor += 1; } - crossterm::KeyEvent::Ctrl(c) => match c { + crossterm::input::KeyEvent::Ctrl(c) => match c { 'a' => { if self.cursor != 0 { self.echo( @@ -178,7 +178,7 @@ impl ReadlineState { } _ => {} }, - crossterm::KeyEvent::Backspace => { + crossterm::input::KeyEvent::Backspace => { if self.cursor != 0 { self.cursor -= 1; self.buffer.remove(self.cursor); @@ -189,19 +189,19 @@ impl ReadlineState { } } } - crossterm::KeyEvent::Left => { + crossterm::input::KeyEvent::Left => { if self.cursor != 0 { self.cursor -= 1; self.write(b"\x1b[D").context(WriteToTerminal)?; } } - crossterm::KeyEvent::Right => { + crossterm::input::KeyEvent::Right => { if self.cursor != self.buffer.len() { self.cursor += 1; self.write(b"\x1b[C").context(WriteToTerminal)?; } } - crossterm::KeyEvent::Delete => { + crossterm::input::KeyEvent::Delete => { if self.cursor != self.buffer.len() { self.buffer.remove(self.cursor); self.echo(b"\x1b[P").context(WriteToTerminal)?; @@ -274,7 +274,8 @@ impl futures::future::Future for Readline { if self.state.manage_screen && self.raw_screen.is_none() { self.raw_screen = Some( - crossterm::RawScreen::into_raw_mode().context(IntoRawMode)?, + crossterm::screen::RawScreen::into_raw_mode() + .context(IntoRawMode)?, ); } @@ -282,7 +283,7 @@ impl futures::future::Future for Readline { if let Some(event) = futures::try_ready!(self.reader.poll().context(KeyReader)) { - let a = self.state.process_event(event)?; + let a = self.state.process_event(&event)?; if a.is_ready() { return Ok(a); } @@ -12,7 +12,7 @@ enum Error { "failed to put the terminal into raw mode: {}", source ))] - IntoRawMode { source: std::io::Error }, + IntoRawMode { source: crossterm::ErrorKind }, #[snafu(display("error during read: {}", source))] Read { source: crate::readline::Error }, @@ -38,7 +38,7 @@ pub struct Tui { idx: usize, readline: Option<crate::readline::Readline>, commands: std::collections::HashMap<usize, Command>, - raw_screen: Option<crossterm::RawScreen>, + raw_screen: Option<crossterm::screen::RawScreen>, } impl Tui { @@ -218,7 +218,8 @@ impl Tui { fn poll_with_errors(&mut self) -> futures::Poll<(), Error> { if self.raw_screen.is_none() { self.raw_screen = Some( - crossterm::RawScreen::into_raw_mode().context(IntoRawMode)?, + crossterm::screen::RawScreen::into_raw_mode() + .context(IntoRawMode)?, ); } |