From c91d9f0c90d96e60517a753eecb2921275ff2c4e Mon Sep 17 00:00:00 2001 From: Yoshiro Takeno Date: Mon, 26 Jan 2004 20:20:07 +0000 Subject: [PATCH] In Windows, the leading byte for multibyte characters are set to upper byte. If single byte character is used, the upper byte is set to 0. --- controls/edit.c | 3 ++- dlls/user/message.c | 10 ++++++---- windows/defwnd.c | 6 +++--- windows/winproc.c | 12 ++++++++---- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/controls/edit.c b/controls/edit.c index 2eac5a4e004..377a8d4db9a 100644 --- a/controls/edit.c +++ b/controls/edit.c @@ -772,7 +772,8 @@ static LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg, strng[0] = wParam >> 8; strng[1] = wParam & 0xff; - MultiByteToWideChar(CP_ACP, 0, strng, 2, &charW, 1); + if (strng[0]) MultiByteToWideChar(CP_ACP, 0, strng, 2, &charW, 1); + else MultiByteToWideChar(CP_ACP, 0, &strng[1], 1, &charW, 1); EDIT_WM_Char(es, charW); break; } diff --git a/dlls/user/message.c b/dlls/user/message.c index 31ee8b9efc2..ed0746955eb 100644 --- a/dlls/user/message.c +++ b/dlls/user/message.c @@ -347,7 +347,8 @@ static WPARAM map_wparam_AtoW( UINT message, WPARAM wparam ) WCHAR wch; ch[0] = (wparam >> 8); ch[1] = (wparam & 0xff); - MultiByteToWideChar(CP_ACP, 0, ch, 2, &wch, 1); + if (ch[0]) MultiByteToWideChar(CP_ACP, 0, ch, 2, &wch, 1); + else MultiByteToWideChar(CP_ACP, 0, &ch[1], 1, &wch, 1); wparam = MAKEWPARAM( wch, HIWORD(wparam) ); } break; @@ -384,9 +385,10 @@ static WPARAM map_wparam_WtoA( UINT message, WPARAM wparam ) 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) ); + if (WideCharToMultiByte( CP_ACP, 0, &wch, 1, ch, 2, NULL, NULL ) == 2) + wparam = MAKEWPARAM( (ch[0] << 8) | ch[1], HIWORD(wparam) ); + else + wparam = MAKEWPARAM( ch[0], HIWORD(wparam) ); } break; } diff --git a/windows/defwnd.c b/windows/defwnd.c index 77205d1b60e..dbd000895a8 100644 --- a/windows/defwnd.c +++ b/windows/defwnd.c @@ -871,9 +871,9 @@ LRESULT WINAPI DefWindowProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam CHAR chChar1 = (CHAR)( (wParam>>8) & 0xff ); CHAR chChar2 = (CHAR)( wParam & 0xff ); - SendMessageA( hwnd, WM_CHAR, (WPARAM)chChar1, lParam ); - if ( IsDBCSLeadByte( chChar1 ) ) - SendMessageA( hwnd, WM_CHAR, (WPARAM)chChar2, lParam ); + if (chChar1) + SendMessageA( hwnd, WM_CHAR, (WPARAM)chChar1, lParam ); + SendMessageA( hwnd, WM_CHAR, (WPARAM)chChar2, lParam ); } break; case WM_IME_KEYDOWN: diff --git a/windows/winproc.c b/windows/winproc.c index cec8d874d15..02793d5dec0 100644 --- a/windows/winproc.c +++ b/windows/winproc.c @@ -797,7 +797,10 @@ INT WINPROC_MapMsg32ATo32W( HWND hwnd, UINT msg, WPARAM *pwparam, LPARAM *plpara WCHAR wch; ch[0] = (*pwparam >> 8); ch[1] = *pwparam & 0xff; - MultiByteToWideChar(CP_ACP, 0, ch, 2, &wch, 1); + if (ch[0]) + MultiByteToWideChar(CP_ACP, 0, ch, 2, &wch, 1); + else + MultiByteToWideChar(CP_ACP, 0, &ch[1], 1, &wch, 1); *pwparam = MAKEWPARAM( wch, HIWORD(*pwparam) ); } return 0; @@ -1092,9 +1095,10 @@ INT WINPROC_MapMsg32WTo32A( HWND hwnd, UINT msg, WPARAM *pwparam, LPARAM *plpara 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) ); + if (WideCharToMultiByte( CP_ACP, 0, &wch, 1, ch, 2, NULL, NULL ) == 2) + *pwparam = MAKEWPARAM( (ch[0] << 8) | ch[1], HIWORD(*pwparam) ); + else + *pwparam = MAKEWPARAM( ch[0], HIWORD(*pwparam) ); } return 0;