From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/imm32/ime.c | 33 +++++++++++++++++++++++++++++++++ dlls/imm32/tests/imm32.c | 3 --- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/dlls/imm32/ime.c b/dlls/imm32/ime.c index 65f46f20550..9e6c96537c8 100644 --- a/dlls/imm32/ime.c +++ b/dlls/imm32/ime.c @@ -23,6 +23,35 @@ WINE_DEFAULT_DEBUG_CHANNEL(imm); +static BOOL is_ime_hkl( HKL hkl ) +{ + /* See https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/windo... */ + switch (HIWORD(hkl)) + { + case MAKELANGID(LANG_AMHARIC, SUBLANG_AMHARIC_ETHIOPIA): return TRUE; + case MAKELANGID(LANG_BENGALI, SUBLANG_BENGALI_INDIA): return TRUE; + case MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED): return TRUE; + case MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL): return TRUE; + case MAKELANGID(LANG_GUJARATI, SUBLANG_GUJARATI_INDIA): return TRUE; + case MAKELANGID(LANG_HINDI, SUBLANG_HINDI_INDIA): return TRUE; + case MAKELANGID(LANG_JAPANESE, SUBLANG_JAPANESE_JAPAN): return TRUE; + case MAKELANGID(LANG_KANNADA, SUBLANG_KANNADA_INDIA): return TRUE; + case MAKELANGID(LANG_KOREAN, SUBLANG_KOREAN): return TRUE; + case MAKELANGID(LANG_MALAYALAM, SUBLANG_MALAYALAM_INDIA): return TRUE; + case MAKELANGID(LANG_MARATHI, SUBLANG_MARATHI_INDIA): return TRUE; + case MAKELANGID(LANG_NEPALI, SUBLANG_NEPALI_NEPAL): return TRUE; + case MAKELANGID(LANG_ODIA, SUBLANG_ODIA_INDIA): return TRUE; + case MAKELANGID(LANG_PUNJABI, SUBLANG_PUNJABI_INDIA): return TRUE; + case MAKELANGID(LANG_TAMIL, SUBLANG_TAMIL_INDIA): return TRUE; + case MAKELANGID(LANG_TAMIL, SUBLANG_TAMIL_SRI_LANKA): return TRUE; + case MAKELANGID(LANG_TELUGU, SUBLANG_TELUGU_INDIA): return TRUE; + case MAKELANGID(LANG_TIGRINYA, SUBLANG_TIGRINYA_ETHIOPIA): return TRUE; + case MAKELANGID(LANG_VIETNAMESE, SUBLANG_VIETNAMESE_VIETNAM): return TRUE; + case MAKELANGID(LANG_YI, SUBLANG_YI_PRC): return TRUE; + default: return (HIWORD(hkl) & 0xe000) == 0xe000; + } +} + struct ime_private { BOOL in_composition; @@ -517,6 +546,8 @@ BOOL WINAPI ImeProcessKey( HIMC himc, UINT vkey, LPARAM lparam, BYTE *state ) TRACE( "himc %p, vkey %#x, lparam %#Ix, state %p\n", himc, vkey, lparam, state ); + if (!is_ime_hkl( GetKeyboardLayout( 0 ) )) return FALSE; + if (!(ctx = ImmLockIMC( himc ))) return FALSE; ret = NtUserMessageCall( ctx->hWnd, WINE_IME_PROCESS_KEY, vkey, lparam, ¶ms, NtUserImeDriverCall, FALSE ); @@ -536,6 +567,8 @@ UINT WINAPI ImeToAsciiEx( UINT vkey, UINT vsc, BYTE *state, TRANSMSGLIST *msgs, TRACE( "vkey %#x, vsc %#x, state %p, msgs %p, flags %#x, himc %p\n", vkey, vsc, state, msgs, flags, himc ); + if (!is_ime_hkl( GetKeyboardLayout( 0 ) )) return 0; + if (!(ctx = ImmLockIMC( himc ))) return 0; if (!(compstr = ImmLockIMCC( ctx->hCompStr ))) goto done; size = max( compstr->dwSize, sizeof(COMPOSITIONSTRING) ); diff --git a/dlls/imm32/tests/imm32.c b/dlls/imm32/tests/imm32.c index 5e6d847fed2..c4d1404f3ea 100644 --- a/dlls/imm32/tests/imm32.c +++ b/dlls/imm32/tests/imm32.c @@ -35,8 +35,6 @@ #include "ime_test.h" -static const BOOL is_win64 = sizeof(void *) > sizeof(int); - static const char *debugstr_wm_ime( UINT msg ) { switch (msg) @@ -7059,7 +7057,6 @@ static void test_ImmTranslateMessage( BOOL kbd_char_first ) .hkl = expect_ime, .himc = default_himc, .func = IME_TO_ASCII_EX, /* FIXME what happened to kbd_char_first here!? */ .to_ascii_ex = {.vkey = 'Q', .vsc = 0xc010}, - .todo_value = kbd_char_first && is_win64, }, {0}, }; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10138