aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2023-07-01 12:52:24 +0100
committerRon Yorston <rmy@pobox.com>2023-07-01 12:52:24 +0100
commitb5248881cd0d0bd6aa49fdef742d847aed6866b6 (patch)
treec1b3dfc8fda1657addd09cd7f517b40e9743e216
parent40217f5588a34d9ddf456307bcd79ce3ef8af2c0 (diff)
downloadbusybox-w32-b5248881cd0d0bd6aa49fdef742d847aed6866b6.tar.gz
busybox-w32-b5248881cd0d0bd6aa49fdef742d847aed6866b6.tar.bz2
busybox-w32-b5248881cd0d0bd6aa49fdef742d847aed6866b6.zip
win32: revert to previous console input method by default
Although the input method used for euro support is no longer required for that reason it does provide a more lightweight workaround for the problem with ReadConsoleInputA and UTF8. Repurpose FEATURE_EURO_INPUT as FEATURE_UTF8_INPUT.
-rw-r--r--Config.in13
-rw-r--r--win32/termios.c8
-rw-r--r--win32/winansi.c10
3 files changed, 19 insertions, 12 deletions
diff --git a/Config.in b/Config.in
index b815b7bd0..33f90fa42 100644
--- a/Config.in
+++ b/Config.in
@@ -438,6 +438,7 @@ config FEATURE_UTF8_MANIFEST
438 depends on FEATURE_RESOURCES 438 depends on FEATURE_RESOURCES
439 help 439 help
440 Include a manifest which sets the process code page to UTF-8. 440 Include a manifest which sets the process code page to UTF-8.
441 Users who enable this may also wish to enable FEATURE_UTF8_INPUT.
441 442
442config FEATURE_ICON 443config FEATURE_ICON
443 bool "Include application icon in binary" 444 bool "Include application icon in binary"
@@ -473,14 +474,14 @@ config FEATURE_EURO
473 requires the OEM code page to be 858. If the OEM code page of 474 requires the OEM code page to be 858. If the OEM code page of
474 the console is 850 when BusyBox starts it's changed to 858. 475 the console is 850 when BusyBox starts it's changed to 858.
475 476
476config FEATURE_EURO_INPUT 477config FEATURE_UTF8_INPUT
477 bool "Allow euro on input, even in code pages without euro support" 478 bool "Allow UTF8 console input (0.8 kb)"
478 default n 479 default n
479 depends on PLATFORM_MINGW32 && FEATURE_EURO 480 depends on PLATFORM_MINGW32
480 help 481 help
481 Allow the euro character to be entered in the console even if the 482 Allow characters entered in the console to be encoded as UTF8.
482 current code page doesn't support it. It isn't necessary to 483 This may be useful in conjunction with the UTF8 manifest which
483 enable this setting if the code page in use has euro support. 484 is supported in Window 10 and 11.
484 485
485config TERMINAL_MODE 486config TERMINAL_MODE
486 int "Default setting for terminal mode" 487 int "Default setting for terminal mode"
diff --git a/win32/termios.c b/win32/termios.c
index 23184e901..7d6adaafe 100644
--- a/win32/termios.c
+++ b/win32/termios.c
@@ -34,7 +34,7 @@ int64_t FAST_FUNC windows_read_key(int fd, char *buf UNUSED_PARAM, int timeout)
34 INPUT_RECORD record; 34 INPUT_RECORD record;
35 DWORD nevent_out, mode; 35 DWORD nevent_out, mode;
36 int ret = -1; 36 int ret = -1;
37#if ENABLE_FEATURE_EURO_INPUT 37#if !ENABLE_FEATURE_UTF8_INPUT
38 wchar_t uchar; 38 wchar_t uchar;
39 char achar; 39 char achar;
40#endif 40#endif
@@ -54,7 +54,7 @@ int64_t FAST_FUNC windows_read_key(int fd, char *buf UNUSED_PARAM, int timeout)
54 if (WaitForSingleObject(cin, timeout) != WAIT_OBJECT_0) 54 if (WaitForSingleObject(cin, timeout) != WAIT_OBJECT_0)
55 goto done; 55 goto done;
56 } 56 }
57#if ENABLE_FEATURE_EURO_INPUT 57#if !ENABLE_FEATURE_UTF8_INPUT
58 if (!ReadConsoleInputW(cin, &record, 1, &nevent_out)) 58 if (!ReadConsoleInputW(cin, &record, 1, &nevent_out))
59#else 59#else
60 if (!readConsoleInput_utf8(cin, &record, 1, &nevent_out)) 60 if (!readConsoleInput_utf8(cin, &record, 1, &nevent_out))
@@ -73,7 +73,7 @@ int64_t FAST_FUNC windows_read_key(int fd, char *buf UNUSED_PARAM, int timeout)
73 } 73 }
74 alt_pressed = state & LEFT_ALT_PRESSED; 74 alt_pressed = state & LEFT_ALT_PRESSED;
75 75
76#if ENABLE_FEATURE_EURO_INPUT 76#if !ENABLE_FEATURE_UTF8_INPUT
77 if (!record.Event.KeyEvent.uChar.UnicodeChar) { 77 if (!record.Event.KeyEvent.uChar.UnicodeChar) {
78#else 78#else
79 if (!record.Event.KeyEvent.uChar.AsciiChar) { 79 if (!record.Event.KeyEvent.uChar.AsciiChar) {
@@ -119,7 +119,7 @@ int64_t FAST_FUNC windows_read_key(int fd, char *buf UNUSED_PARAM, int timeout)
119 ret &= ~0x80; 119 ret &= ~0x80;
120 goto done; 120 goto done;
121 } 121 }
122#if ENABLE_FEATURE_EURO_INPUT 122#if !ENABLE_FEATURE_UTF8_INPUT
123 uchar = record.Event.KeyEvent.uChar.UnicodeChar; 123 uchar = record.Event.KeyEvent.uChar.UnicodeChar;
124 achar = uchar & 0x7f; 124 achar = uchar & 0x7f;
125 if (achar != uchar) 125 if (achar != uchar)
diff --git a/win32/winansi.c b/win32/winansi.c
index 83ce076c0..479e5ca40 100644
--- a/win32/winansi.c
+++ b/win32/winansi.c
@@ -749,8 +749,12 @@ BOOL conToCharBuffA(LPSTR s, DWORD len)
749 CPINFO acp_info, con_info; 749 CPINFO acp_info, con_info;
750 WCHAR *buf; 750 WCHAR *buf;
751 751
752 // if acp is UTF8 then we got UTF8 via readConsoleInput_utf8 752 if (acp == conicp
753 if (acp == conicp || acp == CP_UTF8) 753#if ENABLE_FEATURE_UTF8_INPUT
754 // if acp is UTF8 then we got UTF8 via readConsoleInput_utf8
755 || acp == CP_UTF8
756#endif
757 )
754 return TRUE; 758 return TRUE;
755 759
756 if (!s || !GetCPInfo(acp, &acp_info) || !GetCPInfo(conicp, &con_info) || 760 if (!s || !GetCPInfo(acp, &acp_info) || !GetCPInfo(conicp, &con_info) ||
@@ -1173,6 +1177,7 @@ int mingw_isatty(int fd)
1173 return result; 1177 return result;
1174} 1178}
1175 1179
1180#if ENABLE_FEATURE_UTF8_INPUT
1176// intentionally also converts invalid values (surrogate halfs, too big) 1181// intentionally also converts invalid values (surrogate halfs, too big)
1177static int toutf8(DWORD cp, unsigned char *buf) { 1182static int toutf8(DWORD cp, unsigned char *buf) {
1178 if (cp <= 0x7f) { 1183 if (cp <= 0x7f) {
@@ -1343,3 +1348,4 @@ BOOL readConsoleInput_utf8(HANDLE h, INPUT_RECORD *r, DWORD len, DWORD *got)
1343 *got = 1; 1348 *got = 1;
1344 return TRUE; 1349 return TRUE;
1345} 1350}
1351#endif