diff options
Diffstat (limited to 'win32')
-rw-r--r-- | win32/winansi.c | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/win32/winansi.c b/win32/winansi.c index c4c7ee87c..dd99b42af 100644 --- a/win32/winansi.c +++ b/win32/winansi.c | |||
@@ -53,12 +53,44 @@ static int is_console_in(int fd) | |||
53 | return isatty(fd) && GetStdHandle(STD_INPUT_HANDLE) != INVALID_HANDLE_VALUE; | 53 | return isatty(fd) && GetStdHandle(STD_INPUT_HANDLE) != INVALID_HANDLE_VALUE; |
54 | } | 54 | } |
55 | 55 | ||
56 | #define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 | ||
57 | #define DISABLE_NEWLINE_AUTO_RETURN 0x0008 | ||
58 | |||
56 | int skip_ansi_emulation(int reset) | 59 | int skip_ansi_emulation(int reset) |
57 | { | 60 | { |
58 | static int skip = -1; | 61 | static int skip = -1; |
59 | 62 | ||
60 | if (skip < 0 || reset) | 63 | if (skip < 0 || reset) { |
61 | skip = getenv(bb_skip_ansi_emulation) != NULL; | 64 | const char *var = getenv(bb_skip_ansi_emulation); |
65 | skip = var != NULL; | ||
66 | if (skip) { | ||
67 | switch (xatou(var)) { | ||
68 | case 1: | ||
69 | break; | ||
70 | case 2: | ||
71 | skip = 2; | ||
72 | break; | ||
73 | default: | ||
74 | skip = 0; | ||
75 | break; | ||
76 | } | ||
77 | } | ||
78 | |||
79 | if (is_console(STDOUT_FILENO)) { | ||
80 | HANDLE h = get_console(); | ||
81 | DWORD mode; | ||
82 | |||
83 | if (GetConsoleMode(h, &mode)) { | ||
84 | if (skip) | ||
85 | mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; | ||
86 | else | ||
87 | mode &= ~ENABLE_VIRTUAL_TERMINAL_PROCESSING; | ||
88 | mode &= ~DISABLE_NEWLINE_AUTO_RETURN; | ||
89 | if (!SetConsoleMode(h, mode) && skip == 2) | ||
90 | skip = 0; | ||
91 | } | ||
92 | } | ||
93 | } | ||
62 | 94 | ||
63 | return skip; | 95 | return skip; |
64 | } | 96 | } |