/// Enables ANSI code support on Windows 10. | |
/// | |
/// This uses Windows API calls to alter the properties of the console that | |
/// the program is running in. | |
/// | |
/// https://msdn.microsoft.com/en-us/library/windows/desktop/mt638032(v=vs.85).aspx | |
/// | |
/// Returns a `Result` with the Windows error code if unsuccessful. | |
#[cfg(windows)] | |
pub fn enable_ansi_support() -> Result<(), u32> { | |
use winapi::um::processenv::GetStdHandle; | |
use winapi::um::errhandlingapi::GetLastError; | |
use winapi::um::consoleapi::{GetConsoleMode, SetConsoleMode}; | |
const STD_OUT_HANDLE: u32 = -11i32 as u32; | |
const ENABLE_VIRTUAL_TERMINAL_PROCESSING: u32 = 0x0004; | |
unsafe { | |
// https://docs.microsoft.com/en-us/windows/console/getstdhandle | |
let std_out_handle = GetStdHandle(STD_OUT_HANDLE); | |
let error_code = GetLastError(); | |
if error_code != 0 { return Err(error_code); } | |
// https://docs.microsoft.com/en-us/windows/console/getconsolemode | |
let mut console_mode: u32 = 0; | |
GetConsoleMode(std_out_handle, &mut console_mode); | |
let error_code = GetLastError(); | |
if error_code != 0 { return Err(error_code); } | |
// VT processing not already enabled? | |
if console_mode & ENABLE_VIRTUAL_TERMINAL_PROCESSING == 0 { | |
// https://docs.microsoft.com/en-us/windows/console/setconsolemode | |
SetConsoleMode(std_out_handle, console_mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING); | |
let error_code = GetLastError(); | |
if error_code != 0 { return Err(error_code); } | |
} | |
} | |
return Ok(()); | |
} |