summaryrefslogtreecommitdiffstats
path: root/src/bin/client/platform.rs
blob: 1a6d71bb08c43d896501ae10a477c457f1d44577 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#[cfg(windows)]
pub mod win {
    use std::io;
    use std::os::windows::io::AsRawHandle;
    use winapi::um::consoleapi::GetConsoleMode;
    use winapi::um::consoleapi::SetConsoleMode;
    use winapi::um::wincon::ENABLE_VIRTUAL_TERMINAL_PROCESSING;
    use winapi::um::winbase::STD_OUTPUT_HANDLE;
    use winapi::um::processenv::GetStdHandle;
    use winapi::shared::minwindef::DWORD;

    pub fn enable_vt() -> io::Result<()> {
        unsafe {
            let h = GetStdHandle(STD_OUTPUT_HANDLE);
            if h.is_null() { return Err(io::Error::last_os_error()); }

            let mut mode: DWORD = 0;
            if GetConsoleMode(h, &mut mode) == 0 {
                return Err(io::Error::last_os_error());
            }
            let new = mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING;
            if SetConsoleMode(h, new) == 0 {
                return Err(io::Error::last_os_error());
            }
            Ok(())
        }
    }
}