From 8d5d413697e92042c64a6a77894b88eed063a8b7 Mon Sep 17 00:00:00 2001 From: Zhiyi Zhang Date: Wed, 27 Sep 2023 15:57:53 +0800 Subject: [PATCH] user32: Enable IsDialogMessageA() ASCII to Unicode mapping only when the user default lang ID is CJK. Using GetSystemMetrics(SM_DBCSENABLED) may incorrectly enable ASCII to Unicode mapping in mixed locale environments. For example, when UserDefaultLCID is French(040c) but SystemDefaultLCID is Japanese(0411). Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=55655 --- dlls/user32/message.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/dlls/user32/message.c b/dlls/user32/message.c index 4016c95539a..86c6593e192 100644 --- a/dlls/user32/message.c +++ b/dlls/user32/message.c @@ -807,6 +807,14 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetMessageA( MSG *msg, HWND hwnd, UINT first, UINT return (msg->message != WM_QUIT); } +static BOOL is_cjk(void) +{ + int lang_id = PRIMARYLANGID(GetUserDefaultLangID()); + + if (lang_id == LANG_CHINESE || lang_id == LANG_JAPANESE || lang_id == LANG_KOREAN) + return TRUE; + return FALSE; +} /*********************************************************************** * IsDialogMessageA (USER32.@) @@ -817,7 +825,7 @@ BOOL WINAPI IsDialogMessageA( HWND hwndDlg, LPMSG pmsg ) enum wm_char_mapping mapping; MSG msg = *pmsg; - mapping = GetSystemMetrics( SM_DBCSENABLED ) ? WMCHAR_MAP_ISDIALOGMESSAGE : WMCHAR_MAP_NOMAPPING; + mapping = is_cjk() ? WMCHAR_MAP_ISDIALOGMESSAGE : WMCHAR_MAP_NOMAPPING; if (!map_wparam_AtoW( msg.message, &msg.wParam, mapping )) return TRUE; return IsDialogMessageW( hwndDlg, &msg );