Ken Thomases : user32: In TranslateMessage, handle ToUnicode returning 2 or more chars.
Alexandre Julliard
julliard at winehq.org
Tue Feb 5 13:25:25 CST 2013
Module: wine
Branch: master
Commit: 5fb543f6e2a9a40fee88ae51d7660295a7f7451e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5fb543f6e2a9a40fee88ae51d7660295a7f7451e
Author: Ken Thomases <ken at 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;
}
More information about the wine-cvs
mailing list