Upgrade crossterm (#1288)

* WIP

* Finish porting to new crossterm

* Fmt
This commit is contained in:
Jonathan Turner
2020-01-27 15:51:46 +13:00
committed by GitHub
parent 32dfb32741
commit 6da9e2aced
10 changed files with 168 additions and 172 deletions

View File

@ -171,7 +171,7 @@ impl TreeFrame {
write!(
f,
"{}",
Color::Black.bold().paint(&format!("({})", self.token_desc))
Color::White.bold().paint(&format!("({})", self.token_desc))
)?;
write!(f, " -> ")?;
@ -196,7 +196,7 @@ impl TreeFrame {
write!(
f,
"{}",
Color::Black.bold().paint(&format!("({})", self.token_desc))
Color::White.bold().paint(&format!("({})", self.token_desc))
)
}
}
@ -305,7 +305,7 @@ impl TreeChild {
for (i, (desc, err_desc)) in desc.iter().enumerate() {
write!(f, "{}", Color::White.bold().on(Color::Red).paint(*desc))?;
write!(f, " {}", Color::Black.bold().paint(*err_desc))?;
write!(f, " {}", Color::White.bold().paint(*err_desc))?;
if i != last {
write!(f, "{}", Color::White.normal().paint(", "))?;

View File

@ -8,13 +8,13 @@ license = "MIT"
[dependencies]
ansi_term = "0.12.1"
crossterm = { version = "0.10.2" }
crossterm = { version = "0.14.2" }
nu-plugin = { path = "../nu-plugin", version="0.8.0" }
nu-protocol = { path = "../nu-protocol", version = "0.8.0" }
nu-source = { path = "../nu-source", version = "0.8.0" }
nu-errors = { path = "../nu-errors", version = "0.8.0" }
pretty-hex = "0.1.1"
image = { version = "0.22.3", default_features = false, features = ["png_codec", "jpeg"] }
image = { version = "0.22.4", default_features = false, features = ["png_codec", "jpeg"] }
rawkey = "0.1.2"
neso = "0.5.0"

View File

@ -1,4 +1,4 @@
use crossterm::{cursor, terminal, Attribute, RawScreen};
use crossterm::{style::Attribute, ExecutableCommand};
use nu_errors::ShellError;
use nu_plugin::{serve_plugin, Plugin};
use nu_protocol::{outln, CallInfo, Primitive, Signature, UntaggedValue, Value};
@ -71,8 +71,7 @@ impl RenderContext {
let mut prev_color: Option<(u8, u8, u8)> = None;
let mut prev_count = 1;
let cursor = cursor();
cursor.goto(0, 0)?;
let _ = std::io::stdout().execute(crossterm::cursor::MoveTo(0, 0));
for pixel in &self.frame_buffer {
match prev_color {
@ -115,8 +114,7 @@ impl RenderContext {
let mut pos = 0;
let fb_len = self.frame_buffer.len();
let cursor = cursor();
cursor.goto(0, 0)?;
let _ = std::io::stdout().execute(crossterm::cursor::MoveTo(0, 0));
while pos < (fb_len - self.width) {
let top_pixel = self.frame_buffer[pos];
@ -169,12 +167,10 @@ impl RenderContext {
}
}
pub fn update(&mut self) -> Result<(), Box<dyn std::error::Error>> {
let terminal = terminal();
let terminal_size = terminal.terminal_size();
let terminal_size = crossterm::terminal::size().unwrap_or_else(|_| (80, 24));
if (self.width != terminal_size.0 as usize) || (self.height != terminal_size.1 as usize) {
let cursor = cursor();
cursor.hide()?;
let _ = std::io::stdout().execute(crossterm::cursor::Hide);
self.width = terminal_size.0 as usize;
self.height = if self.lores_mode {
@ -305,10 +301,9 @@ pub fn view_contents(
render_context.flush()?;
let cursor = cursor();
let _ = cursor.show();
let _ = std::io::stdout().execute(crossterm::cursor::Show);
let _ = RawScreen::disable_raw_mode();
let _ = crossterm::terminal::disable_raw_mode();
Ok(())
}
@ -340,11 +335,8 @@ pub fn view_contents_interactive(
nes.reset();
if let Ok(_raw) = RawScreen::into_raw_mode() {
if let Ok(_raw) = crossterm::terminal::enable_raw_mode() {
let mut render_context: RenderContext = RenderContext::blank(lores_mode);
let input = crossterm::input();
let _ = input.read_async();
let cursor = cursor();
let buttons = vec![
KeyCode::Alt,
@ -357,7 +349,7 @@ pub fn view_contents_interactive(
KeyCode::RightArrow,
];
cursor.hide()?;
let _ = std::io::stdout().execute(crossterm::cursor::Hide);
'gameloop: loop {
let _ = render_context.update();
@ -397,6 +389,18 @@ pub fn view_contents_interactive(
nes.release_button(0, idx as u8);
}
}
loop {
let x = crossterm::event::poll(std::time::Duration::from_secs(0));
match x {
Ok(true) => {
// Swallow the events so we don't queue them into the line editor
let _ = crossterm::event::read();
}
_ => {
break;
}
}
}
}
}
}
@ -408,10 +412,9 @@ pub fn view_contents_interactive(
}
}
let cursor = cursor();
let _ = cursor.show();
let _ = std::io::stdout().execute(crossterm::cursor::Show);
let _screen = RawScreen::disable_raw_mode();
let _screen = crossterm::terminal::disable_raw_mode();
Ok(())
}

View File

@ -12,11 +12,11 @@ nu-protocol = { path = "../nu-protocol", version = "0.8.0" }
nu-source = { path = "../nu-source", version = "0.8.0" }
nu-errors = { path = "../nu-errors", version = "0.8.0" }
crossterm = "0.10.2"
crossterm = "0.14.2"
syntect = "3.2.0"
onig_sys = "~69.1.0"
ansi_term = "0.12.1"
url = "2.1.0"
url = "2.1.1"
[build-dependencies]
nu-build = { version = "0.8.0", path = "../nu-build" }

View File

@ -1,5 +1,7 @@
use crossterm::{cursor, terminal, RawScreen};
use crossterm::{InputEvent, KeyEvent};
use crossterm::{
event::{KeyCode, KeyEvent},
ExecutableCommand,
};
use nu_errors::ShellError;
use nu_plugin::{serve_plugin, Plugin};
use nu_protocol::{outln, CallInfo, Primitive, Signature, UntaggedValue, Value};
@ -42,10 +44,7 @@ fn paint_textview(
starting_row: usize,
use_color_buffer: bool,
) -> usize {
let terminal = terminal();
let cursor = cursor();
let size = terminal.terminal_size();
let size = crossterm::terminal::size().unwrap_or_else(|_| (80, 24));
// render
let mut pos = 0;
@ -105,7 +104,7 @@ fn paint_textview(
}
if buffer_needs_scrolling {
let _ = cursor.goto(0, 0);
let _ = std::io::stdout().execute(crossterm::cursor::MoveTo(0, 0));
}
if use_color_buffer {
@ -116,7 +115,7 @@ fn paint_textview(
}
if buffer_needs_scrolling {
let _ = cursor.goto(0, size.1);
let _ = std::io::stdout().execute(crossterm::cursor::MoveTo(0, size.1));
print!(
"{}",
ansi_term::Colour::Blue.paint("[ESC to quit, arrow keys to move]")
@ -131,29 +130,24 @@ fn paint_textview(
fn scroll_view_lines_if_needed(draw_commands: Vec<DrawCommand>, use_color_buffer: bool) {
let mut starting_row = 0;
if let Ok(_raw) = RawScreen::into_raw_mode() {
let terminal = terminal();
let mut size = terminal.terminal_size();
if let Ok(_raw) = crossterm::terminal::enable_raw_mode() {
let mut size = crossterm::terminal::size().unwrap_or_else(|_| (80, 24));
let height = size.1 as usize - 1;
let mut max_bottom_line = paint_textview(&draw_commands, starting_row, use_color_buffer);
// Only scroll if needed
if max_bottom_line > height as usize {
let cursor = cursor();
let _ = cursor.hide();
let input = crossterm::input();
let mut sync_stdin = input.read_sync();
let _ = std::io::stdout().execute(crossterm::cursor::Hide);
loop {
if let Some(ev) = sync_stdin.next() {
if let InputEvent::Keyboard(k) = ev {
match k {
KeyEvent::Esc => {
if let Ok(ev) = crossterm::event::read() {
if let crossterm::event::Event::Key(KeyEvent { code, modifiers }) = ev {
match code {
KeyCode::Esc => {
break;
}
KeyEvent::Up | KeyEvent::Char('k') => {
KeyCode::Up | KeyCode::Char('k') => {
if starting_row > 0 {
starting_row -= 1;
max_bottom_line = paint_textview(
@ -163,19 +157,39 @@ fn scroll_view_lines_if_needed(draw_commands: Vec<DrawCommand>, use_color_buffer
);
}
}
KeyEvent::Down | KeyEvent::Char('j') => {
KeyCode::Down | KeyCode::Char('j') => {
if starting_row < (max_bottom_line - height) {
starting_row += 1;
}
max_bottom_line =
paint_textview(&draw_commands, starting_row, use_color_buffer);
}
KeyEvent::PageUp | KeyEvent::Ctrl('b') => {
KeyCode::Char('b')
if modifiers.contains(crossterm::event::KeyModifiers::CONTROL) =>
{
starting_row -= std::cmp::min(height, starting_row);
max_bottom_line =
paint_textview(&draw_commands, starting_row, use_color_buffer);
}
KeyEvent::PageDown | KeyEvent::Ctrl('f') | KeyEvent::Char(' ') => {
KeyCode::PageUp => {
starting_row -= std::cmp::min(height, starting_row);
max_bottom_line =
paint_textview(&draw_commands, starting_row, use_color_buffer);
}
KeyCode::Char('f')
if modifiers.contains(crossterm::event::KeyModifiers::CONTROL) =>
{
if starting_row < (max_bottom_line - height) {
starting_row += height;
if starting_row > (max_bottom_line - height) {
starting_row = max_bottom_line - height;
}
}
max_bottom_line =
paint_textview(&draw_commands, starting_row, use_color_buffer);
}
KeyCode::PageDown | KeyCode::Char(' ') => {
if starting_row < (max_bottom_line - height) {
starting_row += height;
@ -191,17 +205,20 @@ fn scroll_view_lines_if_needed(draw_commands: Vec<DrawCommand>, use_color_buffer
}
}
let new_size = terminal.terminal_size();
if size != new_size {
size = new_size;
let _ = terminal.clear(crossterm::ClearType::All);
max_bottom_line =
paint_textview(&draw_commands, starting_row, use_color_buffer);
if let Ok(new_size) = crossterm::terminal::size() {
if size != new_size {
size = new_size;
let _ = std::io::stdout().execute(crossterm::terminal::Clear(
crossterm::terminal::ClearType::All,
));
max_bottom_line =
paint_textview(&draw_commands, starting_row, use_color_buffer);
}
}
}
let _ = cursor.show();
let _ = std::io::stdout().execute(crossterm::cursor::Show);
let _ = RawScreen::disable_raw_mode();
let _ = crossterm::terminal::disable_raw_mode();
}
}