From 567cf7b8e54a2671b15e49f1470559725c1f999d Mon Sep 17 00:00:00 2001 From: "timonpost@hotmail.nl" Date: Thu, 18 Apr 2019 12:48:20 +0200 Subject: [PATCH] update 0.9.2 --- Cargo.toml | 4 ++-- examples/crossterm_demo.rs | 4 +--- src/backend/crossterm.rs | 43 +++++++++++--------------------------- 3 files changed, 15 insertions(+), 36 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a165417..ca6b76b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,7 @@ travis-ci = { repository = "fdehau/tui-rs" } appveyor = { repository = "fdehau/tui-rs" } [features] -default = ["termion"] +default = ["crossterm"] curses = ["easycurses", "pancurses"] [dependencies] @@ -30,7 +30,7 @@ unicode-segmentation = "1.2" unicode-width = "0.1" termion = { version = "1.5", optional = true } rustbox = { version = "0.11", optional = true } -crossterm = { version = "0.6", optional = true } +crossterm = { version = "0.9.2", optional = true } easycurses = { version = "0.12.2", optional = true } pancurses = { version = "0.16.1", optional = true, features = ["win32a"] } diff --git a/examples/crossterm_demo.rs b/examples/crossterm_demo.rs index a7d4898..76e36d6 100644 --- a/examples/crossterm_demo.rs +++ b/examples/crossterm_demo.rs @@ -31,9 +31,7 @@ fn main() -> Result<(), failure::Error> { let cli = Cli::from_args(); stderrlog::new().quiet(!cli.log).verbosity(4).init()?; - let screen = crossterm::Screen::default(); - let alternate_screen = screen.enable_alternate_modes(true)?; - let backend = CrosstermBackend::with_alternate_screen(alternate_screen)?; + let backend = CrosstermBackend::new(); let mut terminal = Terminal::new(backend)?; terminal.hide_cursor()?; diff --git a/src/backend/crossterm.rs b/src/backend/crossterm.rs index cbf8275..1db46c1 100644 --- a/src/backend/crossterm.rs +++ b/src/backend/crossterm.rs @@ -1,26 +1,21 @@ use std::io; use crate::backend::Backend; -use crate::buffer::Cell; -use crate::layout::Rect; +use crate::{buffer::Cell, layout::Rect}; use crate::style::{Color, Modifier}; -use crossterm::error::ErrorKind; +use crossterm::{ErrorKind, AlternateScreen, Crossterm}; +use std::io::{stdout, Write}; pub struct CrosstermBackend { - screen: Option, - crossterm: crossterm::Crossterm, - // Need to keep the AlternateScreen around even when not using it directly, - // see https://github.com/TimonPost/crossterm/issues/88 alternate_screen: Option, + crossterm: Crossterm } impl Default for CrosstermBackend { fn default() -> CrosstermBackend { - let screen = crossterm::Screen::default(); - let crossterm = crossterm::Crossterm::from_screen(&screen); + AlternateScreen::to_alternate(true); CrosstermBackend { - screen: Some(screen), - crossterm, + crossterm: Crossterm::new(), alternate_screen: None, } } @@ -31,33 +26,15 @@ impl CrosstermBackend { CrosstermBackend::default() } - pub fn with_screen(screen: crossterm::Screen) -> CrosstermBackend { - let crossterm = crossterm::Crossterm::from_screen(&screen); - CrosstermBackend { - screen: Some(screen), - crossterm, - alternate_screen: None, - } - } - pub fn with_alternate_screen( alternate_screen: crossterm::AlternateScreen, ) -> Result { - let crossterm = crossterm::Crossterm::from_screen(&alternate_screen.screen); Ok(CrosstermBackend { - screen: None, - crossterm, + crossterm: Crossterm::new(), alternate_screen: Some(alternate_screen), }) } - pub fn screen(&self) -> Option<&crossterm::Screen> { - match &self.screen { - Some(screen) => Some(&screen), - None => None, - } - } - pub fn alternate_screen(&self) -> Option<&crossterm::AlternateScreen> { match &self.alternate_screen { Some(alt_screen) => Some(&alt_screen), @@ -135,6 +112,10 @@ impl Backend for CrosstermBackend { let mut last_y = 0; let mut last_x = 0; let mut first = true; + + let stdout = stdout(); + let mut handle = stdout.lock(); + for (x, y, cell) in content { if y != last_y || x != last_x + 1 || first { cursor.goto(x, y).map_err(convert_error)?; @@ -151,7 +132,7 @@ impl Backend for CrosstermBackend { } s.object_style.attrs = cell.style.modifier.into(); - self.crossterm.paint(s).map_err(convert_error)?; + write!(handle, "{}", s)?; } Ok(()) }