Added A<->W mappings for WM_IME_CHAR.
diff --git a/dlls/user/message.c b/dlls/user/message.c
index 72c3cdf..6fba2d4 100644
--- a/dlls/user/message.c
+++ b/dlls/user/message.c
@@ -187,7 +187,7 @@
/* 0x260 - 0x27f */
0,
/* 0x280 - 0x29f */
- 0,
+ SET(WM_IME_CHAR),
/* 0x2a0 - 0x2bf */
0,
/* 0x2c0 - 0x2df */
@@ -325,18 +325,32 @@
*/
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)
+ switch(message)
{
- char ch = LOWORD(wparam);
- WCHAR wch;
- MultiByteToWideChar(CP_ACP, 0, &ch, 1, &wch, 1);
- wparam = MAKEWPARAM( wch, HIWORD(wparam) );
+ 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_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)
+ switch(message)
{
- WCHAR wch = LOWORD(wparam);
- char ch;
- WideCharToMultiByte( CP_ACP, 0, &wch, 1, &ch, 1, NULL, NULL );
- wparam = MAKEWPARAM( (unsigned char)ch, HIWORD(wparam) );
+ 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 0430f62..d077206 100644
--- a/windows/winproc.c
+++ b/windows/winproc.c
@@ -729,6 +729,17 @@
}
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 @@
}
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 @@
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 @@
*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 );