diff --git a/src/os.cpp b/src/os.cpp index c91fa4f08..a8bb2e448 100644 --- a/src/os.cpp +++ b/src/os.cpp @@ -948,6 +948,12 @@ static void set_color_posix(TermColor color) { } } + +#if defined(ZIG_OS_WINDOWS) +bool got_orig_console_attrs = false; +WORD original_console_attributes = FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE; +#endif + void os_stderr_set_color(TermColor color) { #if defined(ZIG_OS_WINDOWS) if (is_stderr_cyg_pty()) { @@ -965,22 +971,37 @@ void os_stderr_set_color(TermColor color) { mode_flags |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; SetConsoleMode(stderr_handle, mode_flags); } + + if (!got_orig_console_attrs) { + got_orig_console_attrs = true; + CONSOLE_SCREEN_BUFFER_INFO info; + if (GetConsoleScreenBufferInfo(stderr_handle, &info)) { + original_console_attributes = info.wAttributes; + } + } + DWORD chars_written; switch (color) { case TermColorRed: + SetConsoleTextAttribute(stderr_handle, FOREGROUND_RED|FOREGROUND_INTENSITY); WriteConsole(stderr_handle, VT_RED, strlen(VT_RED), &chars_written, NULL); break; case TermColorGreen: + SetConsoleTextAttribute(stderr_handle, FOREGROUND_GREEN|FOREGROUND_INTENSITY); WriteConsole(stderr_handle, VT_GREEN, strlen(VT_GREEN), &chars_written, NULL); break; case TermColorCyan: + SetConsoleTextAttribute(stderr_handle, FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_INTENSITY); WriteConsole(stderr_handle, VT_CYAN, strlen(VT_CYAN), &chars_written, NULL); break; case TermColorWhite: + SetConsoleTextAttribute(stderr_handle, + FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_INTENSITY); WriteConsole(stderr_handle, VT_WHITE, strlen(VT_WHITE), &chars_written, NULL); break; case TermColorReset: { + SetConsoleTextAttribute(stderr_handle, original_console_attributes); WriteConsole(stderr_handle, VT_RESET, strlen(VT_RESET), &chars_written, NULL); DWORD mode_flags = 0;