[PATCH] [raw_ostream] When printing color on Windows, use the existing foreground / background color.

Zachary Turner zturner at google.com
Fri Feb 27 18:40:59 PST 2015


Hi bkramer, aaron.ballman,

According to MSDN [https://msdn.microsoft.com/en-us/library/windows/desktop/ms682088(v=vs.85).aspx#_win32_character_attributes], when setting the console attribute, whichever property you don't set has a default value chosen.

Quote: "If no background constant is specified, the background is black, and if no foreground constant is specified, the text is black"

This is annoying if you have changed the default background color of your console and then use raw_ostrema to change the foreground color (or vice versa), because setting only the foreground attribute will also choose a default value for the background which will be different than your current console's setting.

This patch gets the current value of both attributes, and when you set one attribute, it sets the opposite attribute to its existing value before committing the color update.

http://reviews.llvm.org/D7967

Files:
  lib/Support/Windows/Process.inc

Index: lib/Support/Windows/Process.inc
===================================================================
--- lib/Support/Windows/Process.inc
+++ lib/Support/Windows/Process.inc
@@ -329,6 +329,16 @@
 };
 
 DefaultColors defaultColors;
+
+WORD fg_color(WORD color) {
+  return color & (FOREGROUND_BLUE | FOREGROUND_GREEN |
+                  FOREGROUND_INTENSITY | FOREGROUND_RED);
+}
+
+WORD bg_color(WORD color) {
+  return color & (BACKGROUND_BLUE | BACKGROUND_GREEN |
+                  BACKGROUND_INTENSITY | BACKGROUND_RED);
+}
 }
 
 bool Process::ColorNeedsFlush() {
@@ -350,19 +360,24 @@
 const char *Process::OutputColor(char code, bool bold, bool bg) {
   if (UseANSI) return colorcodes[bg?1:0][bold?1:0][code&7];
 
+  WORD current = DefaultColors::GetCurrentColor();
   WORD colors;
   if (bg) {
+    WORD fg = fg_color(current);
     colors = ((code&1) ? BACKGROUND_RED : 0) |
       ((code&2) ? BACKGROUND_GREEN : 0 ) |
       ((code&4) ? BACKGROUND_BLUE : 0);
     if (bold)
       colors |= BACKGROUND_INTENSITY;
+    colors |= fg;
   } else {
+    WORD bg = bg_color(current);
     colors = ((code&1) ? FOREGROUND_RED : 0) |
       ((code&2) ? FOREGROUND_GREEN : 0 ) |
       ((code&4) ? FOREGROUND_BLUE : 0);
     if (bold)
       colors |= FOREGROUND_INTENSITY;
+    colors |= bg;
   }
   SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), colors);
   return 0;

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D7967.20923.patch
Type: text/x-patch
Size: 1386 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150228/0ae9d8f3/attachment.bin>


More information about the llvm-commits mailing list