From 51cd3a3a270df80905c6f73223c46b1c6b6b6b5a Mon Sep 17 00:00:00 2001 From: David Kinder Date: Sun, 5 Jul 2020 09:32:50 +0100 Subject: [PATCH 1/2] Enable console ANSI colour handling for Windows --- .../Chapter 1/Windows Platform.w | 30 +++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/foundation-module/Chapter 1/Windows Platform.w b/foundation-module/Chapter 1/Windows Platform.w index 6e45edc..617a32b 100644 --- a/foundation-module/Chapter 1/Windows Platform.w +++ b/foundation-module/Chapter 1/Windows Platform.w @@ -179,7 +179,27 @@ 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) { + SetConsoleMode(cons, Win32_ConsMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING); + Win32_ConsModeChanged = 1; + atexit(Platform::Win32_ResetConsoleMode); + } + } + } } @h Concurrency. @@ -256,11 +276,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)); From dec1717ef2ed3a5818530c1bb553c9605aaf8d62 Mon Sep 17 00:00:00 2001 From: David Kinder Date: Sun, 5 Jul 2020 09:38:36 +0100 Subject: [PATCH 2/2] Only reset console mode on exit if mode was successfully changed at the start --- foundation-module/Chapter 1/Windows Platform.w | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/foundation-module/Chapter 1/Windows Platform.w b/foundation-module/Chapter 1/Windows Platform.w index 617a32b..d9ad6d8 100644 --- a/foundation-module/Chapter 1/Windows Platform.w +++ b/foundation-module/Chapter 1/Windows Platform.w @@ -194,9 +194,10 @@ void Platform::enable_coloured_terminal_output(void) { if (cons) { if (GetConsoleMode(cons, &Win32_ConsMode)) { if ((Win32_ConsMode & ENABLE_VIRTUAL_TERMINAL_PROCESSING) == 0) { - SetConsoleMode(cons, Win32_ConsMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING); - Win32_ConsModeChanged = 1; - atexit(Platform::Win32_ResetConsoleMode); + if (SetConsoleMode(cons, Win32_ConsMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING)) { + Win32_ConsModeChanged = 1; + atexit(Platform::Win32_ResetConsoleMode); + } } } }