Skip to content

Commit 45506bb

Browse files
committed
amend! win32: use native ANSI sequence processing, if possible
win32: use native ANSI sequence processing, if possible Windows 10 version 1511 (also known as Anniversary Update), according to https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences introduced native support for ANSI sequence processing. This allows using colors from the entire 24-bit color range. All we need to do is test whether the console's "virtual processing support" can be enabled. If it can, we do not even need to start the `console_thread` to handle ANSI sequences. Or, almost all we need to do: When `console_thread()` does its work, it uses the Unicode-aware `write_console()` function to write to the Win32 Console, which supports Git for Windows' implicit convention that all text that is written is encoded in UTF-8. The same is not necessarily true if native ANSI sequence processing is used, as the output is then subject to the current code page. Let's ensure that the code page is set to `CP_UTF8` as long as Git writes to it. Signed-off-by: Johannes Schindelin <[email protected]>
1 parent f3b93ac commit 45506bb

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

compat/winansi.c

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -595,11 +595,15 @@ static void detect_msys_tty(int fd)
595595
#endif
596596

597597
static HANDLE std_console_handle;
598-
static DWORD std_console_mode;
598+
static DWORD std_console_mode = ENABLE_VIRTUAL_TERMINAL_PROCESSING;
599+
static UINT std_console_code_page = CP_UTF8;
599600

600-
static void reset_std_console_mode(void)
601+
static void reset_std_console(void)
601602
{
602-
SetConsoleMode(std_console_handle, std_console_mode);
603+
if (std_console_mode != ENABLE_VIRTUAL_TERMINAL_PROCESSING)
604+
SetConsoleMode(std_console_handle, std_console_mode);
605+
if (std_console_code_page != CP_UTF8)
606+
SetConsoleOutputCP(std_console_code_page);
603607
}
604608

605609
static int enable_virtual_processing(void)
@@ -613,6 +617,14 @@ static int enable_virtual_processing(void)
613617
return 0;
614618
}
615619

620+
std_console_code_page = GetConsoleOutputCP();
621+
if (std_console_code_page != CP_UTF8)
622+
SetConsoleOutputCP(CP_UTF8);
623+
if (!std_console_code_page)
624+
std_console_code_page = CP_UTF8;
625+
626+
atexit(reset_std_console);
627+
616628
if (std_console_mode & ENABLE_VIRTUAL_TERMINAL_PROCESSING)
617629
return 1;
618630

@@ -622,7 +634,6 @@ static int enable_virtual_processing(void)
622634
ENABLE_VIRTUAL_TERMINAL_PROCESSING))
623635
return 0;
624636

625-
atexit(reset_std_console_mode);
626637
return 1;
627638
}
628639

0 commit comments

Comments
 (0)