| ... | ... | @@ -248,9 +248,24 @@ pub fn isCygwinPty(file: File) bool { |
| 248 | 248 | /// Test whether ANSI escape codes will be treated as such. |
| 249 | 249 | pub fn supportsAnsiEscapeCodes(self: File) bool { |
| 250 | 250 | if (builtin.os.tag == .windows) { |
| 251 | | var console_mode: windows.DWORD = 0; |
| 252 | | if (windows.kernel32.GetConsoleMode(self.handle, &console_mode) != 0) { |
| 253 | | if (console_mode & windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING != 0) return true; |
| 251 | var original_console_mode: windows.DWORD = 0; |
| 252 | |
| 253 | // For Windows Terminal, VT Sequences processing is enabled by default. |
| 254 | if (windows.kernel32.GetConsoleMode(self.handle, &original_console_mode) != 0) { |
| 255 | if (original_console_mode & windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING != 0) return true; |
| 256 | |
| 257 | // For Windows Console, VT Sequences processing support was added in Windows 10 build 14361, but disabled by default. |
| 258 | // https://devblogs.microsoft.com/commandline/tmux-support-arrives-for-bash-on-ubuntu-on-windows/ |
| 259 | // Use Microsoft's recommended way to enable virtual terminal processing. |
| 260 | // https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences#example-of-enabling-virtual-terminal-processing |
| 261 | var requested_console_modes: windows.DWORD = windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING | windows.DISABLE_NEWLINE_AUTO_RETURN; |
| 262 | var console_mode = original_console_mode | requested_console_modes; |
| 263 | if (windows.kernel32.SetConsoleMode(self.handle, console_mode) != 0) return true; |
| 264 | |
| 265 | // An application receiving ERROR_INVALID_PARAMETER with one of the newer console mode flags in the bit field should gracefully degrade behavior and try again. |
| 266 | requested_console_modes = windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING; |
| 267 | console_mode = original_console_mode | requested_console_modes; |
| 268 | if (windows.kernel32.SetConsoleMode(self.handle, console_mode) != 0) return true; |
| 254 | 269 | } |
| 255 | 270 | |
| 256 | 271 | return self.isCygwinPty(); |