From 17c63bbab3aafabe3d3306b0121b85e041d4f4e8 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Sun, 11 May 2003 02:58:19 +0000 Subject: [PATCH] Added A<->W mappings for WM_IME_CHAR. --- dlls/user/message.c | 78 ++++++++++++++++++++++++++++++--------------- windows/winproc.c | 42 ++++++++++++++++++++++++ 2 files changed, 95 insertions(+), 25 deletions(-) diff --git a/dlls/user/message.c b/dlls/user/message.c index 72c3cdf7e5..6fba2d4054 100644 --- a/dlls/user/message.c +++ b/dlls/user/message.c @@ -187,7 +187,7 @@ static const unsigned int message_unicode_flags[] = /* 0x260 - 0x27f */ 0, /* 0x280 - 0x29f */ - 0, + SET(WM_IME_CHAR), /* 0x2a0 - 0x2bf */ 0, /* 0x2c0 - 0x2df */ @@ -325,18 +325,32 @@ static BOOL CALLBACK broadcast_message_callback( HWND hwnd, LPARAM lparam ) */ static WPARAM map_wparam_AtoW( UINT message, WPARAM wparam ) { - if (message == WM_CHARTOITEM || - message == EM_SETPASSWORDCHAR || - message == WM_CHAR || - message == WM_DEADCHAR || - message == WM_SYSCHAR || - message == WM_SYSDEADCHAR || - message == WM_MENUCHAR) - { - char ch = LOWORD(wparam); - WCHAR wch; - MultiByteToWideChar(CP_ACP, 0, &ch, 1, &wch, 1); - wparam = MAKEWPARAM( wch, HIWORD(wparam) ); + switch(message) + { + case WM_CHARTOITEM: + case EM_SETPASSWORDCHAR: + case WM_CHAR: + case WM_DEADCHAR: + case WM_SYSCHAR: + case WM_SYSDEADCHAR: + case WM_MENUCHAR: + { + char ch = LOWORD(wparam); + WCHAR wch; + MultiByteToWideChar(CP_ACP, 0, &ch, 1, &wch, 1); + wparam = MAKEWPARAM( wch, HIWORD(wparam) ); + } + break; + case WM_IME_CHAR: + { + char ch[2]; + WCHAR wch; + ch[0] = (wparam >> 8); + ch[1] = (wparam & 0xff); + MultiByteToWideChar(CP_ACP, 0, ch, 2, &wch, 1); + wparam = MAKEWPARAM( wch, HIWORD(wparam) ); + } + break; } return wparam; } @@ -349,18 +363,32 @@ static WPARAM map_wparam_AtoW( UINT message, WPARAM wparam ) */ static WPARAM map_wparam_WtoA( UINT message, WPARAM wparam ) { - if (message == WM_CHARTOITEM || - message == EM_SETPASSWORDCHAR || - message == WM_CHAR || - message == WM_DEADCHAR || - message == WM_SYSCHAR || - message == WM_SYSDEADCHAR || - message == WM_MENUCHAR) - { - WCHAR wch = LOWORD(wparam); - char ch; - WideCharToMultiByte( CP_ACP, 0, &wch, 1, &ch, 1, NULL, NULL ); - wparam = MAKEWPARAM( (unsigned char)ch, HIWORD(wparam) ); + switch(message) + { + case WM_CHARTOITEM: + case EM_SETPASSWORDCHAR: + case WM_CHAR: + case WM_DEADCHAR: + case WM_SYSCHAR: + case WM_SYSDEADCHAR: + case WM_MENUCHAR: + { + WCHAR wch = LOWORD(wparam); + BYTE ch; + WideCharToMultiByte( CP_ACP, 0, &wch, 1, &ch, 1, NULL, NULL ); + wparam = MAKEWPARAM( ch, HIWORD(wparam) ); + } + break; + case WM_IME_CHAR: + { + WCHAR wch = LOWORD(wparam); + BYTE ch[2]; + + ch[1] = 0; + WideCharToMultiByte( CP_ACP, 0, &wch, 1, ch, 2, NULL, NULL ); + wparam = MAKEWPARAM( (ch[0] << 8) | ch[1], HIWORD(wparam) ); + } + break; } return wparam; } diff --git a/windows/winproc.c b/windows/winproc.c index 0430f623fd..d07720614b 100644 --- a/windows/winproc.c +++ b/windows/winproc.c @@ -729,6 +729,17 @@ INT WINPROC_MapMsg32ATo32W( HWND hwnd, UINT msg, WPARAM *pwparam, LPARAM *plpara } return 0; + case WM_IME_CHAR: + { + BYTE ch[2]; + WCHAR wch; + ch[0] = (*pwparam >> 8); + ch[1] = *pwparam & 0xff; + MultiByteToWideChar(CP_ACP, 0, ch, 2, &wch, 1); + *pwparam = MAKEWPARAM( wch, HIWORD(*pwparam) ); + } + return 0; + case WM_PAINTCLIPBOARD: case WM_SIZECLIPBOARD: FIXME_(msg)("message %s (0x%x) needs translation, please report\n", SPY_GetMsgName(msg, hwnd), msg ); @@ -985,6 +996,17 @@ INT WINPROC_MapMsg32WTo32A( HWND hwnd, UINT msg, WPARAM *pwparam, LPARAM *plpara } return 0; + case WM_IME_CHAR: + { + WCHAR wch = LOWORD(*pwparam); + BYTE ch[2]; + + ch[1] = 0; + WideCharToMultiByte( CP_ACP, 0, &wch, 1, ch, 2, NULL, NULL ); + *pwparam = MAKEWPARAM( (ch[0] << 8) | ch[1], HIWORD(*pwparam) ); + } + return 0; + case WM_PAINTCLIPBOARD: case WM_SIZECLIPBOARD: FIXME_(msg)("message %s (%04x) needs translation, please report\n",SPY_GetMsgName(msg, hwnd),msg ); @@ -1648,6 +1670,15 @@ INT WINPROC_MapMsg16To32W( HWND hwnd, UINT16 msg16, WPARAM16 wParam16, UINT *pms MultiByteToWideChar( CP_ACP, 0, &ch, 1, &wch, 1); *pwparam32 = wch; return 0; + case WM_IME_CHAR: + { + char ch[2]; + ch[0] = (wParam16 >> 8); + ch[1] = wParam16 & 0xff; + MultiByteToWideChar(CP_ACP, 0, ch, 2, &wch, 1); + *pwparam32 = wch; + } + return 0; default: /* No Unicode translation needed */ return WINPROC_MapMsg16To32A( hwnd, msg16, wParam16, pmsg32, @@ -2504,6 +2535,17 @@ INT WINPROC_MapMsg32WTo16( HWND hwnd, UINT msg32, WPARAM wParam32, *pwparam16 = ch; return 0; + case WM_IME_CHAR: + { + BYTE ch[2]; + + wch = wParam32; + ch[1] = 0; + WideCharToMultiByte( CP_ACP, 0, &wch, 1, ch, 2, NULL, NULL ); + *pwparam16 = (ch[0] << 8) | ch[1]; + } + return 0; + default: /* No Unicode translation needed (?) */ return WINPROC_MapMsg32ATo16( hwnd, msg32, wParam32, pmsg16, pwparam16, plparam ); -- 2.32.0.93.g670b81a890