Module: wine Branch: master Commit: aee674c9b8fc73302ecf6a77d7cb78970a7e6c29 URL: http://source.winehq.org/git/wine.git/?a=commit;h=aee674c9b8fc73302ecf6a77d7...
Author: Eric Pouech eric.pouech@orange.fr Date: Mon Jan 24 22:13:32 2011 +0100
kernel32: Properly manage UTF-8 (and any wcs) input strings.
---
dlls/kernel32/console.c | 18 ++++++++++++++---- dlls/kernel32/console_private.h | 2 +- dlls/kernel32/term.c | 11 ++++------- 3 files changed, 19 insertions(+), 12 deletions(-)
diff --git a/dlls/kernel32/console.c b/dlls/kernel32/console.c index b7253f8..fc7d7f0 100644 --- a/dlls/kernel32/console.c +++ b/dlls/kernel32/console.c @@ -1101,8 +1101,9 @@ static enum read_console_input_return bare_console_fetch_input(HANDLE handle, in { enum read_console_input_return ret; char input[8]; + WCHAR inputw[8]; int i; - size_t idx = 0; + size_t idx = 0, idxw; unsigned numEvent; INPUT_RECORD ir[8]; DWORD written; @@ -1157,12 +1158,21 @@ static enum read_console_input_return bare_console_fetch_input(HANDLE handle, in break; case -1: /* we haven't found the string into key-db, push full input string into server */ - for (i = 0; i < idx; i++) + idxw = MultiByteToWideChar(CP_UNIXCP, 0, input, idx, inputw, sizeof(inputw) / sizeof(inputw[0])); + + /* we cannot translate yet... likely we need more chars (wait max 1/2s for next char) */ + if (idxw == 0) + { + timeout = 500; + next_char = TRUE; + break; + } + for (i = 0; i < idxw; i++) { - numEvent = TERM_FillSimpleChar(input[i], ir); + numEvent = TERM_FillSimpleChar(inputw[i], ir); WriteConsoleInputW(handle, ir, numEvent, &written); } - ret = idx == 0 ? rci_timeout : rci_gotone; + ret = rci_gotone; break; default: /* we got a transformation from key-db... push this into server */ diff --git a/dlls/kernel32/console_private.h b/dlls/kernel32/console_private.h index b25f65c..d4bc996 100644 --- a/dlls/kernel32/console_private.h +++ b/dlls/kernel32/console_private.h @@ -36,7 +36,7 @@ extern WCHAR* CONSOLE_Readline(HANDLE, BOOL); /* term.c */ extern BOOL TERM_Init(void); extern BOOL TERM_Exit(void); -extern unsigned TERM_FillSimpleChar(unsigned real_inchar, INPUT_RECORD* ir); +extern unsigned TERM_FillSimpleChar(WCHAR real_inchar, INPUT_RECORD* ir); extern int TERM_FillInputRecord(const char* in, size_t len, INPUT_RECORD* ir);
#endif /* __WINE_CONSOLE_PRIVATE_H */ diff --git a/dlls/kernel32/term.c b/dlls/kernel32/term.c index ee879e3..f3dd77b 100644 --- a/dlls/kernel32/term.c +++ b/dlls/kernel32/term.c @@ -87,11 +87,10 @@ static inline void init_complex_char(INPUT_RECORD* ir, BOOL down, WORD vk, WORD * TERM_FillSimpleChar * */ -unsigned TERM_FillSimpleChar(unsigned real_inchar, INPUT_RECORD* ir) +unsigned TERM_FillSimpleChar(WCHAR real_inchar, INPUT_RECORD* ir) { unsigned vk; - unsigned inchar; - char ch; + WCHAR inchar; unsigned numEvent = 0; DWORD cks = 0;
@@ -110,8 +109,7 @@ unsigned TERM_FillSimpleChar(unsigned real_inchar, INPUT_RECORD* ir) inchar = real_inchar; break; } - if ((inchar & ~0xFF) != 0) FIXME("What a char (%u)\n", inchar); - vk = vkkeyscan_table[inchar]; + vk = (inchar < 256) ? vkkeyscan_table[inchar] : 0; if (vk & 0x0100) init_complex_char(&ir[numEvent++], 1, 0x2a, 0x10, SHIFT_PRESSED); if ((vk & 0x0200) || (unsigned char)real_inchar <= 26) @@ -132,8 +130,7 @@ unsigned TERM_FillSimpleChar(unsigned real_inchar, INPUT_RECORD* ir) ir[numEvent].Event.KeyEvent.wVirtualKeyCode = vk; ir[numEvent].Event.KeyEvent.wVirtualScanCode = mapvkey_0[vk & 0x00ff]; /* VirtualKeyCodes to ScanCode */
- ch = inchar; - MultiByteToWideChar(CP_UNIXCP, 0, &ch, 1, &ir[numEvent].Event.KeyEvent.uChar.UnicodeChar, 1); + ir[numEvent].Event.KeyEvent.uChar.UnicodeChar = inchar; ir[numEvent + 1] = ir[numEvent]; ir[numEvent + 1].Event.KeyEvent.bKeyDown = 0;