Module: wine Branch: master Commit: 5fb543f6e2a9a40fee88ae51d7660295a7f7451e URL: http://source.winehq.org/git/wine.git/?a=commit;h=5fb543f6e2a9a40fee88ae51d7...
Author: Ken Thomases ken@codeweavers.com Date: Sun Feb 3 17:20:22 2013 -0600
user32: In TranslateMessage, handle ToUnicode returning 2 or more chars.
---
dlls/user32/message.c | 26 ++++++++++++++------------ 1 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/dlls/user32/message.c b/dlls/user32/message.c index 79066a8..b0bf176 100644 --- a/dlls/user32/message.c +++ b/dlls/user32/message.c @@ -3803,8 +3803,9 @@ BOOL WINAPI IsDialogMessageA( HWND hwndDlg, LPMSG pmsg ) BOOL WINAPI TranslateMessage( const MSG *msg ) { UINT message; - WCHAR wp[2]; + WCHAR wp[8]; BYTE state[256]; + INT len;
if (msg->message < WM_KEYFIRST || msg->message > WM_KEYLAST) return FALSE; if (msg->message != WM_KEYDOWN && msg->message != WM_SYSKEYDOWN) return TRUE; @@ -3826,22 +3827,23 @@ BOOL WINAPI TranslateMessage( const MSG *msg ) }
GetKeyboardState( state ); - /* FIXME : should handle ToUnicode yielding 2 */ - switch (ToUnicode(msg->wParam, HIWORD(msg->lParam), state, wp, 2, 0)) + len = ToUnicode(msg->wParam, HIWORD(msg->lParam), state, wp, sizeof(wp)/sizeof(WCHAR), 0); + if (len == -1) { - case 1: - message = (msg->message == WM_KEYDOWN) ? WM_CHAR : WM_SYSCHAR; - TRACE_(key)("1 -> PostMessageW(%p,%s,%04x,%08lx)\n", - msg->hwnd, SPY_GetMsgName(message, msg->hwnd), wp[0], msg->lParam); - PostMessageW( msg->hwnd, message, wp[0], msg->lParam ); - break; - - case -1: message = (msg->message == WM_KEYDOWN) ? WM_DEADCHAR : WM_SYSDEADCHAR; TRACE_(key)("-1 -> PostMessageW(%p,%s,%04x,%08lx)\n", msg->hwnd, SPY_GetMsgName(message, msg->hwnd), wp[0], msg->lParam); PostMessageW( msg->hwnd, message, wp[0], msg->lParam ); - break; + } + else if (len > 0) + { + INT i; + + message = (msg->message == WM_KEYDOWN) ? WM_CHAR : WM_SYSCHAR; + TRACE_(key)("%d -> PostMessageW(%p,%s,<x>,%08lx) for <x> in %s\n", len, msg->hwnd, + SPY_GetMsgName(message, msg->hwnd), msg->lParam, debugstr_wn(wp, len)); + for (i = 0; i < len; i++) + PostMessageW( msg->hwnd, message, wp[i], msg->lParam ); } return TRUE; }