Re: [msysGit] Re: Need your help with MinGW Issue 17: --color options don't work (produce garbage)
- From
Johannes Schindelin <johannes.schindelin@gmx.de>
- Date
- Aug 15, 2007, 15:10 UTC
- Message-ID
- <Pine.LNX.4.64.0708151708570.19222@wbgn129.biozentrum.uni-wuerzburg.de>
- In-Reply-To
- <3f4fd2640708150032l7441b285mc2cc9e22702bce21@mail.gmail.com>
Hi,
On Wed, 15 Aug 2007, Reece Dunn wrote:
Show 77 quoted lines
> On 15/08/07, Dmitry Kakurin wrote:
> > Here are the facts:
> >
> > 'git branch --color' produces garbage:
> > $ git branch --color
> > devel??[m
> > dima??[m
> > dmitryk??[m
> > * ??[32mmaster??[m
> > mob??[m
> > next??[m
> >
> > 'git branch --color | cat' produces expected colored output.
> >
> > I've traced it down to printf statement in gdb and it sends the right
> > esc-sequence.
> > Where should I look next?
>
> Windows doesn't recognise the *nix printf colour codes.
>
> Piping through cat will be going through cygwin/mingw emulation,
> translating the colour codes to the correct API calls.
>
> You need to call the SetConsoleTextAttribute Win32 API. For example:
>
> #ifdef defined(WIN32) || defined(WIN64)
>
> typedef WORD color_t;
>
> color_t red = FOREGROUND_INTENSITY | FOREGROUND_RED;
> color_t green = FOREGROUND_INTENSITY | FOREGROUND_GREEN;
> color_t blue = FOREGROUND_INTENSITY | FOREGROUND_BLUE;
>
> color_t white = red | green | blue;
>
> void set_color( color_t color )
> {
> SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color );
> }
>
> #else
>
> typedef const char * color_t;
>
> color_t red = ...;
> ...
>
> void set_color( color_t color ){ printf( color ); }
>
> #endif
>
> That way, you can do things like:
> set_color( red );
> printf( ... );
> set_color( blue );
>
> This is not as pretty as the existing codebase, so another possibility
> would be to create wrappers around the console output functions (i.e.
> printf) and call SetConsoleTextAttribute there. This way, you can
> restore the old colour when a restore settings sequence is
> intercepted. It is also possible to reuse the GetStdHandle return
> value.
>
> NOTE: There isn't a GetConsoleTextAttribute in the Windows API, but
> Google found this:
>
> #if ( (defined(WIN32) || defined(_WINDOWS)) && !defined(__CYGWIN__) )
> && defined(_CONSOLE)
>
> static WORD GetConsoleTextAttribute(HANDLE Console)
> {
> CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo;
> GetConsoleScreenBufferInfo(Console, &ConsoleInfo);
> return ConsoleInfo.wAttributes;
> }
>
> #endifHmm. Somehow I doubt that this hack works _outside_ of the Windows console. I.e. if you call git in rxvt, it will fail, if you ssh into Windows, it will fail.
Ciao, Dscho