use crossterm_winapi::ConsoleMode;
use winapi::um::wincon::ENABLE_VIRTUAL_TERMINAL_PROCESSING;
use lazy_static::lazy_static;
use crate::Result;
pub(crate) fn set_virtual_terminal_processing(yes: bool) -> Result<()> {
let mask = ENABLE_VIRTUAL_TERMINAL_PROCESSING;
let console_mode = ConsoleMode::new()?;
let old_mode = console_mode.mode()?;
let new_mode = if yes {
old_mode | mask
} else {
old_mode & !mask
};
if old_mode != new_mode {
console_mode.set_mode(new_mode)?;
}
Ok(())
}
lazy_static! {
static ref SUPPORTS_ANSI_ESCAPE_CODES: bool = {
if is_specific_term() {
true
} else {
set_virtual_terminal_processing(true)
.map(|_| true)
.unwrap_or(false)
}
};
}
pub fn supports_ansi() -> bool {
*SUPPORTS_ANSI_ESCAPE_CODES
}
fn is_specific_term() -> bool {
const TERMS: [&str; 15] = [
"xterm", "rxvt", "eterm", "screen", "tmux", "vt100", "vt102", "vt220", "vt320", "ansi", "scoansi", "cygwin", "linux", "konsole", "bvterm", ];
match std::env::var("TERM") {
Ok(val) => val != "dumb" || TERMS.contains(&val.as_str()),
Err(_) => false,
}
}