From: "Reece Dunn" <msclrhd@googlemail.com>
To: msysGit <msysgit@googlegroups.com>,
"Git Mailing List" <git@vger.kernel.org>
Subject: Re: Need your help with MinGW Issue 17: --color options don't work (produce garbage)
Date: Wed, 15 Aug 2007 08:32:35 +0100 [thread overview]
Message-ID: <3f4fd2640708150032l7441b285mc2cc9e22702bce21@mail.gmail.com> (raw)
In-Reply-To: <a1bbc6950708142329w4e0e3d7cq573c67dd3b28f03a@mail.gmail.com>
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;
}
#endif
HTH,
- Reece
next prev parent reply other threads:[~2007-08-15 7:32 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-08-15 6:29 Need your help with MinGW Issue 17: --color options don't work (produce garbage) Dmitry Kakurin
2007-08-15 7:32 ` Reece Dunn [this message]
2007-08-15 8:03 ` [msysGit] " Dmitry Kakurin
2007-08-15 8:31 ` Reece Dunn
2007-08-15 22:07 ` Dmitry Kakurin
2007-08-15 15:10 ` Johannes Schindelin
2007-08-15 21:22 ` Rogan Dawes
2007-08-15 21:34 ` Junio C Hamano
2007-08-15 22:04 ` Rogan Dawes
2007-08-21 14:08 ` Rogan Dawes
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3f4fd2640708150032l7441b285mc2cc9e22702bce21@mail.gmail.com \
--to=msclrhd@googlemail.com \
--cc=git@vger.kernel.org \
--cc=msysgit@googlegroups.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).