aboutsummaryrefslogtreecommitdiff
path: root/win32
diff options
context:
space:
mode:
Diffstat (limited to 'win32')
-rw-r--r--win32/winansi.c38
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.