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