diff options
Diffstat (limited to 'win32')
-rw-r--r-- | win32/winansi.c | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/win32/winansi.c b/win32/winansi.c index 11a9327e1..de6db08e2 100644 --- a/win32/winansi.c +++ b/win32/winansi.c | |||
@@ -76,7 +76,6 @@ int terminal_mode(int reset) | |||
76 | static int mode = -1; | 76 | static int mode = -1; |
77 | 77 | ||
78 | if (mode < 0 || reset) { | 78 | if (mode < 0 || reset) { |
79 | int prefer; | ||
80 | HANDLE h; | 79 | HANDLE h; |
81 | DWORD oldmode, newmode; | 80 | DWORD oldmode, newmode; |
82 | const char *term = getenv(BB_TERMINAL_MODE); | 81 | const char *term = getenv(BB_TERMINAL_MODE); |
@@ -95,30 +94,26 @@ int terminal_mode(int reset) | |||
95 | CONFIG_TERMINAL_MODE; | 94 | CONFIG_TERMINAL_MODE; |
96 | } | 95 | } |
97 | 96 | ||
98 | if (mode < 0 || mode > 7) { | 97 | if (mode < 0 || mode > 6) |
99 | prefer = mode = 0; | 98 | mode = CONFIG_TERMINAL_MODE; |
100 | } else if (mode > 3) { | ||
101 | // Try to get requested mode, fall back to console on failure. | ||
102 | prefer = mode = mode - 4; | ||
103 | } else { | ||
104 | // Force the requested mode, even if we can't get it. | ||
105 | prefer = 0; | ||
106 | } | ||
107 | 99 | ||
108 | if (is_console(STDOUT_FILENO)) { | 100 | if (is_console(STDOUT_FILENO)) { |
109 | h = get_console(); | 101 | h = get_console(); |
110 | if (GetConsoleMode(h, &oldmode)) { | 102 | if (GetConsoleMode(h, &oldmode)) { |
111 | // Try to recover from mode 0 induced by SSH. | 103 | // Try to recover from mode 0 induced by SSH. |
112 | newmode = oldmode == 0 ? 3 : oldmode; | 104 | newmode = oldmode == 0 ? 3 : oldmode; |
113 | if ((mode & VT_OUTPUT)) | 105 | |
106 | if ((mode & VT_OUTPUT)) { | ||
114 | newmode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; | 107 | newmode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; |
115 | else | 108 | } else if (mode < 4) { |
116 | newmode &= ~ENABLE_VIRTUAL_TERMINAL_PROCESSING; | 109 | newmode &= ~ENABLE_VIRTUAL_TERMINAL_PROCESSING; |
117 | newmode &= ~DISABLE_NEWLINE_AUTO_RETURN; | 110 | } else if ((oldmode & ENABLE_VIRTUAL_TERMINAL_PROCESSING)) { |
111 | mode |= VT_OUTPUT; | ||
112 | } | ||
118 | 113 | ||
119 | if (newmode != oldmode) { | 114 | if (newmode != oldmode) { |
120 | if (!SetConsoleMode(h, newmode)) { | 115 | if (!SetConsoleMode(h, newmode)) { |
121 | if ((prefer & VT_OUTPUT)) | 116 | if (mode >= 4) |
122 | mode &= ~VT_OUTPUT; | 117 | mode &= ~VT_OUTPUT; |
123 | newmode &= ~ENABLE_VIRTUAL_TERMINAL_PROCESSING; | 118 | newmode &= ~ENABLE_VIRTUAL_TERMINAL_PROCESSING; |
124 | SetConsoleMode(h, newmode); | 119 | SetConsoleMode(h, newmode); |
@@ -132,14 +127,19 @@ int terminal_mode(int reset) | |||
132 | if (GetConsoleMode(h, &oldmode)) { | 127 | if (GetConsoleMode(h, &oldmode)) { |
133 | // Try to recover from mode 0 induced by SSH. | 128 | // Try to recover from mode 0 induced by SSH. |
134 | newmode = oldmode == 0 ? 0x1f7 : oldmode; | 129 | newmode = oldmode == 0 ? 0x1f7 : oldmode; |
135 | if ((mode & VT_INPUT)) | 130 | |
136 | newmode |= ENABLE_VIRTUAL_TERMINAL_INPUT; | 131 | if (mode < 4) { |
137 | else | 132 | if ((mode & VT_INPUT)) |
138 | newmode &= ~ENABLE_VIRTUAL_TERMINAL_INPUT; | 133 | newmode |= ENABLE_VIRTUAL_TERMINAL_INPUT; |
134 | else | ||
135 | newmode &= ~ENABLE_VIRTUAL_TERMINAL_INPUT; | ||
136 | } else if ((oldmode & ENABLE_VIRTUAL_TERMINAL_INPUT)) { | ||
137 | mode |= VT_INPUT; | ||
138 | } | ||
139 | 139 | ||
140 | if (newmode != oldmode) { | 140 | if (newmode != oldmode) { |
141 | if (!SetConsoleMode(h, newmode)) { | 141 | if (!SetConsoleMode(h, newmode)) { |
142 | if ((prefer & VT_INPUT)) | 142 | if (mode >= 4) |
143 | mode &= ~VT_INPUT; | 143 | mode &= ~VT_INPUT; |
144 | // Failure to set the new mode seems to leave | 144 | // Failure to set the new mode seems to leave |
145 | // the flag set. Forcibly unset it. | 145 | // the flag set. Forcibly unset it. |