Commit ba405ed59b

Andrew Kelley <superjoe30@gmail.com>
2017-10-15 02:31:47
try harder to emit console colors
1 parent fd7654e
Changed files (1)
src
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;