Reset foreground and background color individually (#138)

This commit is contained in:
Timon 2019-05-04 14:53:00 +02:00 committed by GitHub
commit 08e23a34f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 102 additions and 58 deletions

View File

@ -387,3 +387,12 @@ pub fn print_supported_colors() {
println!("Test {}", Colored::Bg(Color::AnsiValue(i as u8))); println!("Test {}", Colored::Bg(Color::AnsiValue(i as u8)));
} }
} }
pub fn reset_fg_and_bg() {
println!("{}", Colored::Fg(Color::Reset));
println!("{}", Colored::Bg(Color::Reset));
}
fn main() {
print_all_background_colors_with_method()
}

View File

@ -45,14 +45,24 @@ impl ITerminalColor for AnsiColor {
match colored { match colored {
Colored::Fg(new_color) => { Colored::Fg(new_color) => {
if new_color == Color::Reset {
ansi_value.push_str("39");
return ansi_value;
} else {
ansi_value.push_str("38;"); ansi_value.push_str("38;");
color = new_color; color = new_color;
} }
}
Colored::Bg(new_color) => { Colored::Bg(new_color) => {
if new_color == Color::Reset {
ansi_value.push_str("49");
return ansi_value;
} else {
ansi_value.push_str("48;"); ansi_value.push_str("48;");
color = new_color; color = new_color;
} }
} }
}
let rgb_val: String; let rgb_val: String;
@ -73,7 +83,6 @@ impl ITerminalColor for AnsiColor {
Color::DarkCyan => "5;6", Color::DarkCyan => "5;6",
Color::White => "5;15", Color::White => "5;15",
Color::Grey => "5;7", Color::Grey => "5;7",
Color::Rgb { r, g, b } => { Color::Rgb { r, g, b } => {
rgb_val = format!("2;{};{};{}", r, g, b); rgb_val = format!("2;{};{};{}", r, g, b);
rgb_val.as_str() rgb_val.as_str()
@ -82,6 +91,7 @@ impl ITerminalColor for AnsiColor {
rgb_val = format!("5;{}", val); rgb_val = format!("5;{}", val);
rgb_val.as_str() rgb_val.as_str()
} }
_ => "",
}; };
ansi_value.push_str(color_val); ansi_value.push_str(color_val);

View File

@ -112,14 +112,6 @@ pub enum Attribute {
/// [info]: Opposite of `CrossedOut`(9) /// [info]: Opposite of `CrossedOut`(9)
/// [Supportability]: Not widely supported /// [Supportability]: Not widely supported
NotCrossedOut = 29, NotCrossedOut = 29,
/// This will reset the foreground color to default.
/// [info]: Implementation defined (according to standard)
/// [Supportability]: Unknown
DefaultForegroundColor = 48,
/// This will reset the background color to default.
/// [info]: Implementation defined (according to standard)
/// [Supportability]: Unknown
DefaultBackgroundColor = 49,
/// Framed font. /// Framed font.
/// [Supportability]: Not widely supported /// [Supportability]: Not widely supported
Framed = 51, Framed = 51,

View File

@ -2,8 +2,11 @@ use std::convert::AsRef;
use std::str::FromStr; use std::str::FromStr;
/// Colors that are available for coloring the terminal font. /// Colors that are available for coloring the terminal font.
#[derive(Debug, Copy, Clone)] #[derive(Debug, Copy, Clone, PartialOrd, PartialEq)]
pub enum Color { pub enum Color {
// This resets the color.
Reset,
Black, Black,
DarkGrey, DarkGrey,

View File

@ -8,6 +8,16 @@ use std::io;
use std::sync::{Once, ONCE_INIT}; use std::sync::{Once, ONCE_INIT};
use winapi::um::wincon; use winapi::um::wincon;
const FG_GREEN: u16 = wincon::FOREGROUND_GREEN;
const FG_RED: u16 = wincon::FOREGROUND_RED;
const FG_BLUE: u16 = wincon::FOREGROUND_BLUE;
const FG_INTENSITY: u16 = wincon::FOREGROUND_INTENSITY;
const BG_GREEN: u16 = wincon::BACKGROUND_GREEN;
const BG_RED: u16 = wincon::BACKGROUND_RED;
const BG_BLUE: u16 = wincon::BACKGROUND_BLUE;
const BG_INTENSITY: u16 = wincon::BACKGROUND_INTENSITY;
/// This struct is a WinApi implementation for color related actions. /// This struct is a WinApi implementation for color related actions.
pub struct WinApiColor; pub struct WinApiColor;
@ -85,35 +95,36 @@ impl ITerminalColor for WinApiColor {
fn color_value(&self, color: Colored) -> String { fn color_value(&self, color: Colored) -> String {
let winapi_color: u16; let winapi_color: u16;
let fg_green = wincon::FOREGROUND_GREEN;
let fg_red = wincon::FOREGROUND_RED;
let fg_blue = wincon::FOREGROUND_BLUE;
let fg_intensity = wincon::FOREGROUND_INTENSITY;
let bg_green = wincon::BACKGROUND_GREEN;
let bg_red = wincon::BACKGROUND_RED;
let bg_blue = wincon::BACKGROUND_BLUE;
let bg_intensity = wincon::BACKGROUND_INTENSITY;
match color { match color {
Colored::Fg(color) => { Colored::Fg(color) => {
winapi_color = match color { winapi_color = match color {
Color::Black => 0, Color::Black => 0,
Color::DarkGrey => fg_intensity, Color::DarkGrey => FG_INTENSITY,
Color::Red => fg_intensity | fg_red, Color::Red => FG_INTENSITY | FG_RED,
Color::DarkRed => fg_red, Color::DarkRed => FG_RED,
Color::Green => fg_intensity | fg_green, Color::Green => FG_INTENSITY | FG_GREEN,
Color::DarkGreen => fg_green, Color::DarkGreen => FG_GREEN,
Color::Yellow => fg_intensity | fg_green | fg_red, Color::Yellow => FG_INTENSITY | FG_GREEN | FG_RED,
Color::DarkYellow => fg_green | fg_red, Color::DarkYellow => FG_GREEN | FG_RED,
Color::Blue => fg_intensity | fg_blue, Color::Blue => FG_INTENSITY | FG_BLUE,
Color::DarkBlue => fg_blue, Color::DarkBlue => FG_BLUE,
Color::Magenta => fg_intensity | fg_red | fg_blue, Color::Magenta => FG_INTENSITY | FG_RED | FG_BLUE,
Color::DarkMagenta => fg_red | fg_blue, Color::DarkMagenta => FG_RED | FG_BLUE,
Color::Cyan => fg_intensity | fg_green | fg_blue, Color::Cyan => FG_INTENSITY | FG_GREEN | FG_BLUE,
Color::DarkCyan => fg_green | fg_blue, Color::DarkCyan => FG_GREEN | FG_BLUE,
Color::White => fg_red | fg_green | fg_blue, Color::White => FG_RED | FG_GREEN | FG_BLUE,
Color::Grey => fg_intensity | fg_red | fg_green | fg_blue, Color::Grey => FG_INTENSITY | FG_RED | FG_GREEN | FG_BLUE,
Color::Reset => {
// init the original color in case it is not set.
let mut original_color = original_console_color();
const REMOVE_BG_MASK: u16 = BG_INTENSITY | BG_RED | BG_GREEN | BG_BLUE;
// remove all background values from the original color, we don't want to reset those.
original_color &= !(REMOVE_BG_MASK);
original_color
}
/* WinApi will be used for systems that do not support ANSI, those are windows version less then 10. RGB and 255 (AnsiBValue) colors are not supported in that case.*/ /* WinApi will be used for systems that do not support ANSI, those are windows version less then 10. RGB and 255 (AnsiBValue) colors are not supported in that case.*/
Color::Rgb { r: _, g: _, b: _ } => 0, Color::Rgb { r: _, g: _, b: _ } => 0,
@ -123,22 +134,31 @@ impl ITerminalColor for WinApiColor {
Colored::Bg(color) => { Colored::Bg(color) => {
winapi_color = match color { winapi_color = match color {
Color::Black => 0, Color::Black => 0,
Color::DarkGrey => bg_intensity, Color::DarkGrey => BG_INTENSITY,
Color::Red => bg_intensity | bg_red, Color::Red => BG_INTENSITY | BG_RED,
Color::DarkRed => bg_red, Color::DarkRed => BG_RED,
Color::Green => bg_intensity | bg_green, Color::Green => BG_INTENSITY | BG_GREEN,
Color::DarkGreen => bg_green, Color::DarkGreen => BG_GREEN,
Color::Yellow => bg_intensity | bg_green | bg_red, Color::Yellow => BG_INTENSITY | BG_GREEN | BG_RED,
Color::DarkYellow => bg_green | bg_red, Color::DarkYellow => BG_GREEN | BG_RED,
Color::Blue => bg_intensity | bg_blue, Color::Blue => BG_INTENSITY | BG_BLUE,
Color::DarkBlue => bg_blue, Color::DarkBlue => BG_BLUE,
Color::Magenta => bg_intensity | bg_red | bg_blue, Color::Magenta => BG_INTENSITY | BG_RED | BG_BLUE,
Color::DarkMagenta => bg_red | bg_blue, Color::DarkMagenta => BG_RED | BG_BLUE,
Color::Cyan => bg_intensity | bg_green | bg_blue, Color::Cyan => BG_INTENSITY | BG_GREEN | BG_BLUE,
Color::DarkCyan => bg_green | bg_blue, Color::DarkCyan => BG_GREEN | BG_BLUE,
Color::White => bg_intensity | bg_red | bg_green | bg_blue, Color::White => BG_INTENSITY | BG_RED | BG_GREEN | BG_BLUE,
Color::Grey => bg_red | bg_green | bg_blue, Color::Grey => BG_RED | BG_GREEN | BG_BLUE,
Color::Reset => {
// init the original color in case it is not set.
let mut original_color = original_console_color();
const REMOVE_FG_MASK: u16 = FG_INTENSITY | FG_RED | FG_GREEN | FG_BLUE;
// remove all foreground values from the original color, we don't want to reset those.
original_color &= !(REMOVE_FG_MASK);
original_color
}
/* WinApi will be used for systems that do not support ANSI, those are windows version less then 10. RGB and 255 (AnsiBValue) colors are not supported in that case.*/ /* WinApi will be used for systems that do not support ANSI, those are windows version less then 10. RGB and 255 (AnsiBValue) colors are not supported in that case.*/
Color::Rgb { r: _, g: _, b: _ } => 0, Color::Rgb { r: _, g: _, b: _ } => 0,
Color::AnsiValue(_val) => 0, Color::AnsiValue(_val) => 0,

View File

@ -1,3 +1,9 @@
# Changes crossterm_input 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)
# Changes crossterm_input 0.9.3 # Changes crossterm_input 0.9.3
- Removed println from `SyncReader` - Removed println from `SyncReader`

View File

@ -3,6 +3,8 @@ And I don't think it has to do anything with crossterm but it has to do whit how
# Winapi-problems # Winapi-problems
- Power shell does not interpreter 'DarkYellow' and is instead using gray instead, cmd is working perfectly fine. - Power shell does not interpreter 'DarkYellow' and is instead using gray instead, cmd is working perfectly fine.
- Power shell inserts an '\n' (enter) when the program starts, this enter is the one you pressed when running the command.
- After the program ran, power shell will reset the background and foreground colors.
# UNIX-terminals # UNIX-terminals
The Arc and Manjaro KDE Konsole's are not seeming to resize the terminal instead they are resizing the buffer. The Arc and Manjaro KDE Konsole's are not seeming to resize the terminal instead they are resizing the buffer.

View File

@ -405,7 +405,9 @@ pub fn print_supported_colors() {
} }
} }
fn main() { pub fn reset_fg_and_bg() {
print_all_background_colors_with_method(); println!("{}", Colored::Fg(Color::Reset));
print_all_foreground_colors_with_method(); println!("{}", Colored::Bg(Color::Reset));
} }
fn main() {}

View File

@ -146,5 +146,5 @@ pub fn exit() {
} }
fn main() { fn main() {
print_terminal_size(); clear_until_new_line();
} }