Skip to content

Commit ba405ed

Browse files
committed
try harder to emit console colors
1 parent fd7654e commit ba405ed

1 file changed

Lines changed: 21 additions & 0 deletions

File tree

src/os.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -948,6 +948,12 @@ static void set_color_posix(TermColor color) {
948948
}
949949
}
950950

951+
952+
#if defined(ZIG_OS_WINDOWS)
953+
bool got_orig_console_attrs = false;
954+
WORD original_console_attributes = FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE;
955+
#endif
956+
951957
void os_stderr_set_color(TermColor color) {
952958
#if defined(ZIG_OS_WINDOWS)
953959
if (is_stderr_cyg_pty()) {
@@ -965,22 +971,37 @@ void os_stderr_set_color(TermColor color) {
965971
mode_flags |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
966972
SetConsoleMode(stderr_handle, mode_flags);
967973
}
974+
975+
if (!got_orig_console_attrs) {
976+
got_orig_console_attrs = true;
977+
CONSOLE_SCREEN_BUFFER_INFO info;
978+
if (GetConsoleScreenBufferInfo(stderr_handle, &info)) {
979+
original_console_attributes = info.wAttributes;
980+
}
981+
}
982+
968983
DWORD chars_written;
969984
switch (color) {
970985
case TermColorRed:
986+
SetConsoleTextAttribute(stderr_handle, FOREGROUND_RED|FOREGROUND_INTENSITY);
971987
WriteConsole(stderr_handle, VT_RED, strlen(VT_RED), &chars_written, NULL);
972988
break;
973989
case TermColorGreen:
990+
SetConsoleTextAttribute(stderr_handle, FOREGROUND_GREEN|FOREGROUND_INTENSITY);
974991
WriteConsole(stderr_handle, VT_GREEN, strlen(VT_GREEN), &chars_written, NULL);
975992
break;
976993
case TermColorCyan:
994+
SetConsoleTextAttribute(stderr_handle, FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_INTENSITY);
977995
WriteConsole(stderr_handle, VT_CYAN, strlen(VT_CYAN), &chars_written, NULL);
978996
break;
979997
case TermColorWhite:
998+
SetConsoleTextAttribute(stderr_handle,
999+
FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_INTENSITY);
9801000
WriteConsole(stderr_handle, VT_WHITE, strlen(VT_WHITE), &chars_written, NULL);
9811001
break;
9821002
case TermColorReset:
9831003
{
1004+
SetConsoleTextAttribute(stderr_handle, original_console_attributes);
9841005
WriteConsole(stderr_handle, VT_RESET, strlen(VT_RESET), &chars_written, NULL);
9851006

9861007
DWORD mode_flags = 0;

0 commit comments

Comments
 (0)