From 4a0d748baa72ba901e95be52747305e4079fe1a2 Mon Sep 17 00:00:00 2001 From: Timon_Post Date: Fri, 10 May 2019 20:05:53 +0200 Subject: [PATCH 1/3] a --- Cargo.toml | 2 +- crossterm_cursor/src/cursor/ansi_cursor.rs | 16 +++++++++--- crossterm_style/Cargo.toml | 2 +- crossterm_style/src/ansi_color.rs | 20 +++++++++----- crossterm_terminal/Cargo.toml | 4 +-- crossterm_terminal/src/terminal/terminal.rs | 2 +- crossterm_utils/src/macros.rs | 29 ++++++++++++++++++--- 7 files changed, 57 insertions(+), 18 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 75f5d23..6d62f45 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,7 +34,7 @@ members = [ [dependencies] crossterm_screen = { optional = true, path = "./crossterm_screen" } crossterm_cursor = { optional = true, path = "./crossterm_cursor" } -crossterm_terminal = { optional = true, version = "0.2.2" } +crossterm_terminal = { optional = true, path = "./crossterm_terminal" } crossterm_style = { optional = true, path = "./crossterm_style" } crossterm_input = { optional = true, path = "./crossterm_input" } crossterm_utils = { optional = false, path = "./crossterm_utils" } diff --git a/crossterm_cursor/src/cursor/ansi_cursor.rs b/crossterm_cursor/src/cursor/ansi_cursor.rs index c7d7c4a..d44854e 100644 --- a/crossterm_cursor/src/cursor/ansi_cursor.rs +++ b/crossterm_cursor/src/cursor/ansi_cursor.rs @@ -7,19 +7,29 @@ use crate::sys::get_cursor_position; use std::io::Write; use crossterm_utils::Result; +use std::io::Stdout; +use std::io::stdout; +use std::io::StdoutLock; +use std::io::BufWriter; +use std::sync::RwLock; /// This struct is an ANSI implementation for cursor related actions. -pub struct AnsiCursor; +pub struct AnsiCursor { + stdout: RwLock> +} impl AnsiCursor { pub fn new() -> AnsiCursor { - AnsiCursor + AnsiCursor { + stdout: RwLock::new(BufWriter::new(stdout())) + } } } impl ITerminalCursor for AnsiCursor { fn goto(&self, x: u16, y: u16) -> Result<()> { - write_cout!(format!(csi!("{};{}H"), y + 1, x + 1))?; + write_cout1!(format!(csi!("{};{}H"), y + 1, x + 1), &mut self.stdout.write().unwrap())?; +// write_cout!(format!(csi!("{};{}H"), y + 1, x + 1))?; Ok(()) } diff --git a/crossterm_style/Cargo.toml b/crossterm_style/Cargo.toml index 284a982..86d3e97 100644 --- a/crossterm_style/Cargo.toml +++ b/crossterm_style/Cargo.toml @@ -16,4 +16,4 @@ winapi = { version = "0.3.7", features = ["wincon"] } crossterm_winapi = "0.1.2" [dependencies] -crossterm_utils = "0.2.1" \ No newline at end of file +crossterm_utils = {path = "../crossterm_utils"} \ No newline at end of file diff --git a/crossterm_style/src/ansi_color.rs b/crossterm_style/src/ansi_color.rs index 6fb4a3a..f4c30e1 100644 --- a/crossterm_style/src/ansi_color.rs +++ b/crossterm_style/src/ansi_color.rs @@ -5,31 +5,37 @@ use crate::{Color, ITerminalColor}; use crossterm_utils::Result; use crate::Colored; +use std::io; use std::io::Write; +use std::io::Stdout; +use std::io::BufWriter; +use std::sync::RwLock; /// This struct is an ANSI escape code implementation for color related actions. -pub struct AnsiColor; +pub struct AnsiColor { + stdout: RwLock> +} impl AnsiColor { pub fn new() -> AnsiColor { - AnsiColor {} + AnsiColor { stdout: RwLock::new(BufWriter::new(io::stdout())) } } } impl ITerminalColor for AnsiColor { fn set_fg(&self, fg_color: Color) -> Result<()> { - write_cout!(&format!( + write_cout1!(&format!( csi!("{}m"), - self.color_value(Colored::Fg(fg_color)) - ))?; + self.color_value(Colored::Fg(fg_color)), + ), &mut self.stdout.write().unwrap())?; Ok(()) } fn set_bg(&self, bg_color: Color) -> Result<()> { - write_cout!(&format!( + write_cout1!(&format!( csi!("{}m"), self.color_value(Colored::Bg(bg_color)) - ))?; + ), &mut self.stdout.write().unwrap())?; Ok(()) } diff --git a/crossterm_terminal/Cargo.toml b/crossterm_terminal/Cargo.toml index 87d6918..380f51b 100644 --- a/crossterm_terminal/Cargo.toml +++ b/crossterm_terminal/Cargo.toml @@ -18,5 +18,5 @@ crossterm_winapi = "0.1.2" libc = "0.2.51" [dependencies] -crossterm_utils = "0.2.1" -crossterm_cursor = "0.2.1" \ No newline at end of file +crossterm_utils = {path = "../crossterm_utils"} +crossterm_cursor = {path = "../crossterm_cursor"} \ No newline at end of file diff --git a/crossterm_terminal/src/terminal/terminal.rs b/crossterm_terminal/src/terminal/terminal.rs index 7faaec2..da82d58 100644 --- a/crossterm_terminal/src/terminal/terminal.rs +++ b/crossterm_terminal/src/terminal/terminal.rs @@ -126,7 +126,7 @@ impl Terminal { /// /// This will also flush the standard output. pub fn write(&self, value: D) -> Result { - write_cout!(value)?; +// write_cout!(value)?; Ok(0) } } diff --git a/crossterm_utils/src/macros.rs b/crossterm_utils/src/macros.rs index c2fbcf2..f26f011 100644 --- a/crossterm_utils/src/macros.rs +++ b/crossterm_utils/src/macros.rs @@ -4,22 +4,45 @@ macro_rules! csi { ($( $l:expr ),*) => { concat!("\x1B[", $( $l ),*) }; } +pub static mut flush_count: u32 = 0; + /// Write a string to standard output whereafter the screen will be flushed. #[macro_export] macro_rules! write_cout { ($string:expr) => {{ + let stdout = ::std::io::stdout(); + let mut stdout = stdout.lock(); let mut size = 0; - let result = write!(::std::io::stdout(), "{}", $string); + let result = stdout.write($string.as_bytes()); match result { Ok(size) => size, Err(e) => return Err(crossterm_utils::ErrorKind::IoError(e)), }; - match ::std::io::stdout().flush() { + match stdout.flush() { Ok(_) => Ok(size), Err(e) => Err(crossterm_utils::ErrorKind::IoError(e)), - } + }; + + result }}; } + +/// Write a string to standard output whereafter the screen will be flushed. +#[macro_export] +macro_rules! write_cout1 { + ($string:expr, $stdout:expr) => {{ + let mut size = 0; + + let result = write!($stdout, "{}", $string); + + match result { + Ok(size) => size, + Err(e) => return Err(crossterm_utils::ErrorKind::IoError(e)), + }; + + result + }}; +} \ No newline at end of file From 472614be37d86c53653c8d7a2dc070bb8d46f942 Mon Sep 17 00:00:00 2001 From: Timon_Post Date: Wed, 15 May 2019 17:01:22 +0200 Subject: [PATCH 2/3] docs --- crossterm_cursor/src/cursor/ansi_cursor.rs | 16 +++----------- crossterm_style/src/ansi_color.rs | 18 +++++++--------- crossterm_terminal/src/terminal/terminal.rs | 2 +- crossterm_utils/src/macros.rs | 23 ++------------------- docs/CHANGELOG.md | 5 +++-- 5 files changed, 17 insertions(+), 47 deletions(-) diff --git a/crossterm_cursor/src/cursor/ansi_cursor.rs b/crossterm_cursor/src/cursor/ansi_cursor.rs index d44854e..c7d7c4a 100644 --- a/crossterm_cursor/src/cursor/ansi_cursor.rs +++ b/crossterm_cursor/src/cursor/ansi_cursor.rs @@ -7,29 +7,19 @@ use crate::sys::get_cursor_position; use std::io::Write; use crossterm_utils::Result; -use std::io::Stdout; -use std::io::stdout; -use std::io::StdoutLock; -use std::io::BufWriter; -use std::sync::RwLock; /// This struct is an ANSI implementation for cursor related actions. -pub struct AnsiCursor { - stdout: RwLock> -} +pub struct AnsiCursor; impl AnsiCursor { pub fn new() -> AnsiCursor { - AnsiCursor { - stdout: RwLock::new(BufWriter::new(stdout())) - } + AnsiCursor } } impl ITerminalCursor for AnsiCursor { fn goto(&self, x: u16, y: u16) -> Result<()> { - write_cout1!(format!(csi!("{};{}H"), y + 1, x + 1), &mut self.stdout.write().unwrap())?; -// write_cout!(format!(csi!("{};{}H"), y + 1, x + 1))?; + write_cout!(format!(csi!("{};{}H"), y + 1, x + 1))?; Ok(()) } diff --git a/crossterm_style/src/ansi_color.rs b/crossterm_style/src/ansi_color.rs index f4c30e1..3ff582d 100644 --- a/crossterm_style/src/ansi_color.rs +++ b/crossterm_style/src/ansi_color.rs @@ -6,36 +6,34 @@ use crossterm_utils::Result; use crate::Colored; use std::io; -use std::io::Write; -use std::io::Stdout; use std::io::BufWriter; +use std::io::Stdout; +use std::io::Write; use std::sync::RwLock; /// This struct is an ANSI escape code implementation for color related actions. -pub struct AnsiColor { - stdout: RwLock> -} +pub struct AnsiColor; impl AnsiColor { pub fn new() -> AnsiColor { - AnsiColor { stdout: RwLock::new(BufWriter::new(io::stdout())) } + AnsiColor } } impl ITerminalColor for AnsiColor { fn set_fg(&self, fg_color: Color) -> Result<()> { - write_cout1!(&format!( + write_cout!(&format!( csi!("{}m"), self.color_value(Colored::Fg(fg_color)), - ), &mut self.stdout.write().unwrap())?; + ))?; Ok(()) } fn set_bg(&self, bg_color: Color) -> Result<()> { - write_cout1!(&format!( + write_cout!(&format!( csi!("{}m"), self.color_value(Colored::Bg(bg_color)) - ), &mut self.stdout.write().unwrap())?; + ))?; Ok(()) } diff --git a/crossterm_terminal/src/terminal/terminal.rs b/crossterm_terminal/src/terminal/terminal.rs index da82d58..92550d9 100644 --- a/crossterm_terminal/src/terminal/terminal.rs +++ b/crossterm_terminal/src/terminal/terminal.rs @@ -126,7 +126,7 @@ impl Terminal { /// /// This will also flush the standard output. pub fn write(&self, value: D) -> Result { -// write_cout!(value)?; + write_cout!(format!("{}", value))?; Ok(0) } } diff --git a/crossterm_utils/src/macros.rs b/crossterm_utils/src/macros.rs index f26f011..42accb5 100644 --- a/crossterm_utils/src/macros.rs +++ b/crossterm_utils/src/macros.rs @@ -16,7 +16,7 @@ macro_rules! write_cout { let result = stdout.write($string.as_bytes()); - match result { + size += match result { Ok(size) => size, Err(e) => return Err(crossterm_utils::ErrorKind::IoError(e)), }; @@ -24,25 +24,6 @@ macro_rules! write_cout { match stdout.flush() { Ok(_) => Ok(size), Err(e) => Err(crossterm_utils::ErrorKind::IoError(e)), - }; - - result + } }}; } - -/// Write a string to standard output whereafter the screen will be flushed. -#[macro_export] -macro_rules! write_cout1 { - ($string:expr, $stdout:expr) => {{ - let mut size = 0; - - let result = write!($stdout, "{}", $string); - - match result { - Ok(size) => size, - Err(e) => return Err(crossterm_utils::ErrorKind::IoError(e)), - }; - - result - }}; -} \ No newline at end of file diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 939c97f..9abf81b 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,10 +1,11 @@ -# Changes crossterm_input 0.9.4 +# Changes crossterm 0.9.4 - Reset foreground and background color individually. [PR](https://github.com/TimonPost/crossterm/pull/138) - Backtap input support. [PR](https://github.com/TimonPost/crossterm/pull/129) - Corrected white/grey and added dark grey. - Fixed getting cursor position with raw screen enabled. [PR](https://github.com/TimonPost/crossterm/pull/134) +- Removed one redundant stdout lock -# Changes crossterm_input 0.9.3 +# Changes crossterm 0.9.3 - Removed println from `SyncReader` ## Changes crossterm 0.9.2 From a7f33e018f04751ac7d079ba6489776877d43ae7 Mon Sep 17 00:00:00 2001 From: Timon_Post Date: Wed, 15 May 2019 17:03:16 +0200 Subject: [PATCH 3/3] a --- crossterm_style/src/ansi_color.rs | 4 ---- crossterm_utils/src/macros.rs | 2 -- 2 files changed, 6 deletions(-) diff --git a/crossterm_style/src/ansi_color.rs b/crossterm_style/src/ansi_color.rs index 3ff582d..84ca6a7 100644 --- a/crossterm_style/src/ansi_color.rs +++ b/crossterm_style/src/ansi_color.rs @@ -5,11 +5,7 @@ use crate::{Color, ITerminalColor}; use crossterm_utils::Result; use crate::Colored; -use std::io; -use std::io::BufWriter; -use std::io::Stdout; use std::io::Write; -use std::sync::RwLock; /// This struct is an ANSI escape code implementation for color related actions. pub struct AnsiColor; diff --git a/crossterm_utils/src/macros.rs b/crossterm_utils/src/macros.rs index 42accb5..6842ae7 100644 --- a/crossterm_utils/src/macros.rs +++ b/crossterm_utils/src/macros.rs @@ -4,8 +4,6 @@ macro_rules! csi { ($( $l:expr ),*) => { concat!("\x1B[", $( $l ),*) }; } -pub static mut flush_count: u32 = 0; - /// Write a string to standard output whereafter the screen will be flushed. #[macro_export] macro_rules! write_cout {