aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-11-14 13:07:26 -0500
committerJesse Luehrs <doy@tozt.net>2019-11-14 13:07:26 -0500
commitc8bcf801171782819d93a5dace5cd516fc727538 (patch)
tree5e89b0faddda2edb570df50286470575fde7003c /src
parenta999fabab296a10b4586d18a93da322572d9578d (diff)
downloadnbsh-old-c8bcf801171782819d93a5dace5cd516fc727538.tar.gz
nbsh-old-c8bcf801171782819d93a5dace5cd516fc727538.zip
bump depsHEADmaster
Diffstat (limited to 'src')
-rw-r--r--src/key_reader.rs20
-rw-r--r--src/readline.rs35
-rw-r--r--src/tui.rs7
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);
}
diff --git a/src/tui.rs b/src/tui.rs
index b74670f..766f5ad 100644
--- a/src/tui.rs
+++ b/src/tui.rs
@@ -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)?,
);
}