Eric Pouech : kernel32: Properly manage UTF-8 (and any wcs) input strings.
Alexandre Julliard
julliard at winehq.org
Tue Jan 25 12:01:41 CST 2011
Module: wine
Branch: master
Commit: aee674c9b8fc73302ecf6a77d7cb78970a7e6c29
URL: http://source.winehq.org/git/wine.git/?a=commit;h=aee674c9b8fc73302ecf6a77d7cb78970a7e6c29
Author: Eric Pouech <eric.pouech at 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;
More information about the wine-cvs
mailing list