Skip to content

Commit

Permalink
[raw_ostream] When printing color on Windows, use correct bg color.
Browse files Browse the repository at this point in the history
When using SetConsoleTextAttribute() to set the foreground or
background color, if you don't explicitly set both colors, then
a default value of black will be chosen for whichever you don't
specify a value for.

This is annoying when you have a non default console background
color, for example, and you try to set the foreground color.

This patch gets the existing fg/bg color and when you set one
attribute, sets the opposite attribute to its existing color
prior to comitting the update.

Reviewed by: Aaron Ballman
Differential Revision: http://reviews.llvm.org/D7967

llvm-svn: 230859
  • Loading branch information
Zachary Turner committed Feb 28, 2015
1 parent 1b7b56f commit 9e1ce99
Showing 1 changed file with 13 additions and 0 deletions.
13 changes: 13 additions & 0 deletions llvm/lib/Support/Windows/Process.inc
Expand Up @@ -329,6 +329,16 @@ class DefaultColors
};

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() {
Expand All @@ -350,19 +360,22 @@ const char *Process::OutputBold(bool bg) {
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) {
colors = ((code&1) ? BACKGROUND_RED : 0) |
((code&2) ? BACKGROUND_GREEN : 0 ) |
((code&4) ? BACKGROUND_BLUE : 0);
if (bold)
colors |= BACKGROUND_INTENSITY;
colors |= fg_color(current);
} else {
colors = ((code&1) ? FOREGROUND_RED : 0) |
((code&2) ? FOREGROUND_GREEN : 0 ) |
((code&4) ? FOREGROUND_BLUE : 0);
if (bold)
colors |= FOREGROUND_INTENSITY;
colors |= bg_color(current);
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), colors);
return 0;
Expand Down

0 comments on commit 9e1ce99

Please sign in to comment.