diff --git a/foundation-module/Chapter 1/Windows Platform.w b/foundation-module/Chapter 1/Windows Platform.w index 0f8d9a2..5816e21 100644 --- a/foundation-module/Chapter 1/Windows Platform.w +++ b/foundation-module/Chapter 1/Windows Platform.w @@ -190,7 +190,28 @@ output of ANSI-standard coloured terminal output, then this function has the chance to do it. = +int Win32_ConsModeChanged = 0; +DWORD Win32_ConsMode = 0; + +void Platform::Win32_ResetConsoleMode(void) { + if (Win32_ConsModeChanged) { + HANDLE cons = GetStdHandle(STD_ERROR_HANDLE); + if (cons) SetConsoleMode(cons, Win32_ConsMode); + } +} + void Platform::enable_coloured_terminal_output(void) { + HANDLE cons = GetStdHandle(STD_ERROR_HANDLE); + if (cons) { + if (GetConsoleMode(cons, &Win32_ConsMode)) { + if ((Win32_ConsMode & ENABLE_VIRTUAL_TERMINAL_PROCESSING) == 0) { + if (SetConsoleMode(cons, Win32_ConsMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING)) { + Win32_ConsModeChanged = 1; + atexit(Platform::Win32_ResetConsoleMode); + } + } + } + } } @h Concurrency. @@ -267,11 +288,11 @@ off_t Platform::size(char *transcoded_filename) { @d LOCK_MUTEX(name) { BOOL pending; InitOnceBeginInitialize(&(name.init), 0, &pending, 0); - if (pending) { - InitializeCriticalSection(&(name.crit)); - InitOnceComplete(&(name.init), 0, 0); - } - EnterCriticalSection(&(name.crit)); + if (pending) { + InitializeCriticalSection(&(name.crit)); + InitOnceComplete(&(name.init), 0, 0); + } + EnterCriticalSection(&(name.crit)); } @d UNLOCK_MUTEX(name) { LeaveCriticalSection(&(name.crit));