mirror of
https://github.com/wez/wezterm.git
synced 2024-11-26 08:25:50 +03:00
termwiz: support NO_COLOR environment variable (#5020)
* termwiz: support NO_COLOR environment variable * style: update formatting * refactor: use capabilities for enabling no-color
This commit is contained in:
parent
67d4ba9f76
commit
1375e79a21
@ -61,6 +61,10 @@ use terminfo::{self, capability as cap};
|
|||||||
|
|
||||||
pub mod probed;
|
pub mod probed;
|
||||||
|
|
||||||
|
/// Environment variable name indicating that color output should be disabled.
|
||||||
|
/// See <https://no-color.org>
|
||||||
|
const NO_COLOR_ENV: &str = "NO_COLOR";
|
||||||
|
|
||||||
builder! {
|
builder! {
|
||||||
/// Use the `ProbeHints` to configure an instance of
|
/// Use the `ProbeHints` to configure an instance of
|
||||||
/// the `ProbeHints` struct. `ProbeHints` are passed to the `Capabilities`
|
/// the `ProbeHints` struct. `ProbeHints` are passed to the `Capabilities`
|
||||||
@ -121,12 +125,21 @@ builder! {
|
|||||||
|
|
||||||
impl ProbeHints {
|
impl ProbeHints {
|
||||||
pub fn new_from_env() -> Self {
|
pub fn new_from_env() -> Self {
|
||||||
ProbeHints::default()
|
let mut probe_hints = ProbeHints::default()
|
||||||
.term(var("TERM").ok())
|
.term(var("TERM").ok())
|
||||||
.colorterm(var("COLORTERM").ok())
|
.colorterm(var("COLORTERM").ok())
|
||||||
.colorterm_bce(var("COLORTERM_BCE").ok())
|
.colorterm_bce(var("COLORTERM_BCE").ok())
|
||||||
.term_program(var("TERM_PROGRAM").ok())
|
.term_program(var("TERM_PROGRAM").ok())
|
||||||
.term_program_version(var("TERM_PROGRAM_VERSION").ok())
|
.term_program_version(var("TERM_PROGRAM_VERSION").ok());
|
||||||
|
|
||||||
|
if !std::env::var(NO_COLOR_ENV)
|
||||||
|
.unwrap_or("".to_string())
|
||||||
|
.is_empty()
|
||||||
|
{
|
||||||
|
probe_hints.color_level = Some(ColorLevel::MonoChrome);
|
||||||
|
}
|
||||||
|
|
||||||
|
probe_hints
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -146,6 +159,9 @@ pub enum ColorLevel {
|
|||||||
/// What we care about here is whether the terminal supports the escape
|
/// What we care about here is whether the terminal supports the escape
|
||||||
/// sequence to specify RGB values rather than a palette index.
|
/// sequence to specify RGB values rather than a palette index.
|
||||||
TrueColor,
|
TrueColor,
|
||||||
|
/// Describes monochrome (black and white) color support.
|
||||||
|
/// Enabled via NO_COLOR environment variable.
|
||||||
|
MonoChrome,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// `Capabilities` holds information about the capabilities of a terminal.
|
/// `Capabilities` holds information about the capabilities of a terminal.
|
||||||
|
@ -149,7 +149,9 @@ impl TerminfoRenderer {
|
|||||||
None => 0,
|
None => 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
if attr.foreground() != current_foreground {
|
if attr.foreground() != current_foreground
|
||||||
|
&& self.caps.color_level() != ColorLevel::MonoChrome
|
||||||
|
{
|
||||||
match (has_true_color, attr.foreground()) {
|
match (has_true_color, attr.foreground()) {
|
||||||
(true, ColorAttribute::TrueColorWithPaletteFallback(tc, _))
|
(true, ColorAttribute::TrueColorWithPaletteFallback(tc, _))
|
||||||
| (true, ColorAttribute::TrueColorWithDefaultFallback(tc)) => {
|
| (true, ColorAttribute::TrueColorWithDefaultFallback(tc)) => {
|
||||||
@ -183,7 +185,9 @@ impl TerminfoRenderer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if attr.background() != current_background {
|
if attr.background() != current_background
|
||||||
|
&& self.caps.color_level() != ColorLevel::MonoChrome
|
||||||
|
{
|
||||||
match (has_true_color, attr.background()) {
|
match (has_true_color, attr.background()) {
|
||||||
(true, ColorAttribute::TrueColorWithPaletteFallback(tc, _))
|
(true, ColorAttribute::TrueColorWithPaletteFallback(tc, _))
|
||||||
| (true, ColorAttribute::TrueColorWithDefaultFallback(tc)) => {
|
| (true, ColorAttribute::TrueColorWithDefaultFallback(tc)) => {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
//! A Renderer for windows consoles
|
//! A Renderer for windows consoles
|
||||||
|
|
||||||
use crate::caps::Capabilities;
|
use crate::caps::Capabilities;
|
||||||
|
use crate::caps::ColorLevel;
|
||||||
use crate::cell::{AttributeChange, CellAttributes, Underline};
|
use crate::cell::{AttributeChange, CellAttributes, Underline};
|
||||||
use crate::color::{AnsiColor, ColorAttribute};
|
use crate::color::{AnsiColor, ColorAttribute};
|
||||||
use crate::surface::{Change, Position};
|
use crate::surface::{Change, Position};
|
||||||
@ -17,12 +18,14 @@ use winapi::um::wincon::{
|
|||||||
|
|
||||||
pub struct WindowsConsoleRenderer {
|
pub struct WindowsConsoleRenderer {
|
||||||
pending_attr: CellAttributes,
|
pending_attr: CellAttributes,
|
||||||
|
capabilities: Capabilities,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WindowsConsoleRenderer {
|
impl WindowsConsoleRenderer {
|
||||||
pub fn new(_caps: Capabilities) -> Self {
|
pub fn new(capabilities: Capabilities) -> Self {
|
||||||
Self {
|
Self {
|
||||||
pending_attr: CellAttributes::default(),
|
pending_attr: CellAttributes::default(),
|
||||||
|
capabilities,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -69,6 +72,21 @@ fn to_attr_word(attr: &CellAttributes) -> u16 {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let reverse = if attr.reverse() {
|
||||||
|
COMMON_LVB_REVERSE_VIDEO
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
};
|
||||||
|
let underline = if attr.underline() != Underline::None {
|
||||||
|
COMMON_LVB_UNDERSCORE
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
if attr.capabilities.color_level() == ColorLevel::MonoChrome {
|
||||||
|
return reverse | underline;
|
||||||
|
}
|
||||||
|
|
||||||
let fg = match attr.foreground() {
|
let fg = match attr.foreground() {
|
||||||
ColorAttribute::TrueColorWithDefaultFallback(_) | ColorAttribute::Default => {
|
ColorAttribute::TrueColorWithDefaultFallback(_) | ColorAttribute::Default => {
|
||||||
FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN
|
FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN
|
||||||
@ -98,17 +116,6 @@ fn to_attr_word(attr: &CellAttributes) -> u16 {
|
|||||||
),
|
),
|
||||||
};
|
};
|
||||||
|
|
||||||
let reverse = if attr.reverse() {
|
|
||||||
COMMON_LVB_REVERSE_VIDEO
|
|
||||||
} else {
|
|
||||||
0
|
|
||||||
};
|
|
||||||
let underline = if attr.underline() != Underline::None {
|
|
||||||
COMMON_LVB_UNDERSCORE
|
|
||||||
} else {
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
bg | fg | reverse | underline
|
bg | fg | reverse | underline
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user