[PATCH v2 0/4] MR10138: Draft: imm32: Only load IME with IME HKLs.
@mzent @bsjeon I'm thinking about doing something like that, bypassing IME entirely as we should if HKL isn't an IME one, instead of checking whether host IME needs to be fed input in ImeProcessKey, it's a bit untested though. -- v2: imm32: Only notify the host IME for known IME HKLs. winex11: Activate an IME HKL before sending IME updates. winewayland: Activate an IME HKL before sending IME updates. winemac: Keep current user locale in the generated HKLs. https://gitlab.winehq.org/wine/wine/-/merge_requests/10138
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/winemac.drv/keyboard.c | 84 ++++++++++++++++++++++++------------- 1 file changed, 55 insertions(+), 29 deletions(-) diff --git a/dlls/winemac.drv/keyboard.c b/dlls/winemac.drv/keyboard.c index 64abc5b161f..fb3c9bcf30e 100644 --- a/dlls/winemac.drv/keyboard.c +++ b/dlls/winemac.drv/keyboard.c @@ -37,6 +37,34 @@ WINE_DEFAULT_DEBUG_CHANNEL(keyboard); WINE_DECLARE_DEBUG_CHANNEL(key); +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; + } +} /* Indexed by Mac virtual keycode values defined above. */ static const struct { @@ -313,7 +341,9 @@ static struct list layout_list = LIST_INIT( layout_list ); struct layout { struct list entry; - HKL hkl; + LANGID lang; + /* "Layout Id", used by NtUserGetKeyboardLayoutName / LoadKeyboardLayoutW */ + WORD layout_id; TISInputSourceRef input_source; BOOL enabled; /* is the input source enabled - ie displayed in the input source selector UI */ }; @@ -412,27 +442,10 @@ static DWORD get_lcid(CFStringRef lang) return locale->inotneutral ? entry->id : locale->idefaultlanguage; } -static HKL get_hkl(CFStringRef lang, CFStringRef type) +static HKL get_layout_hkl(struct layout *layout, LCID locale) { - ULONG_PTR lcid = get_lcid(lang); - struct layout *layout; - - /* Look for the last occurrence of this lcid in the list and if - present use that value + 0x10000 */ - LIST_FOR_EACH_ENTRY_REV(layout, &layout_list, struct layout, entry) - { - ULONG_PTR hkl = HandleToUlong(layout->hkl); - - if (LOWORD(hkl) == lcid) - { - lcid = (hkl & ~0xe0000000) + 0x10000; - break; - } - } - - if (!CFEqual(type, kTISTypeKeyboardLayout)) lcid |= 0xe0000000; - - return (HKL)lcid; + if (!layout->layout_id) return UlongToHandle(MAKELONG(locale, layout->lang)); + return UlongToHandle(MAKELONG(locale, layout->layout_id)); } /****************************************************************** @@ -468,6 +481,7 @@ static struct layout *get_layout_from_source(TISInputSourceRef input) */ static void update_layout_list(void) { + LCID locale = LOWORD(NtUserGetKeyboardLayout(0)); CFArrayRef sources; struct layout *layout; int i; @@ -486,18 +500,28 @@ static void update_layout_list(void) layout = get_layout_from_source(input); if (!layout) { + static WORD next_layout_id = 1; + CFStringRef type = CFDictionaryGetValue(dict, macdrv_input_source_type_key); - CFStringRef lang = CFDictionaryGetValue(dict, macdrv_input_source_lang_key); + LANGID lang = get_lcid(CFDictionaryGetValue(dict, macdrv_input_source_lang_key)); + HKL lang_hkl = UlongToPtr(MAKELONG(lang, lang)); + UINT index = 0; + + LIST_FOR_EACH_ENTRY_REV(layout, &layout_list, struct layout, entry) + if (layout->lang == lang) index++; - layout = malloc(sizeof(*layout)); + layout = calloc(1, sizeof(*layout)); layout->input_source = (TISInputSourceRef)CFRetain(input); - layout->hkl = get_hkl(lang, type); + layout->lang = lang; + if (is_ime_hkl(lang_hkl) && !index) layout->layout_id = 0; /* HKL has a builtin IME */ + else if (!CFEqual(type, kTISTypeKeyboardLayout)) layout->layout_id = 0xe000 | next_layout_id++; + else if (index) layout->layout_id = 0xf000 | next_layout_id++; list_add_tail(&layout_list, &layout->entry); - TRACE("adding new layout %p\n", layout->hkl); + TRACE("adding new layout %p\n", get_layout_hkl(layout, locale)); } else - TRACE("enabling already existing layout %p\n", layout->hkl); + TRACE("enabling already existing layout %p\n", get_layout_hkl(layout, locale)); layout->enabled = TRUE; } @@ -512,6 +536,7 @@ static void update_layout_list(void) */ HKL macdrv_get_hkl_from_source(TISInputSourceRef input) { + LCID locale = LOWORD(NtUserGetKeyboardLayout(0)); struct layout *layout; HKL ret = 0; @@ -519,7 +544,7 @@ HKL macdrv_get_hkl_from_source(TISInputSourceRef input) update_layout_list(); layout = get_layout_from_source(input); - if (layout) ret = layout->hkl; + if (layout) ret = get_layout_hkl(layout, locale); pthread_mutex_unlock(&layout_list_mutex); @@ -1165,7 +1190,7 @@ BOOL macdrv_ActivateKeyboardLayout(HKL hkl, UINT flags) LIST_FOR_EACH_ENTRY(layout, &layout_list, struct layout, entry) { - if (layout->hkl == hkl) + if (HIWORD(hkl) == layout->layout_id ? layout->layout_id : layout->lang) { if (macdrv_select_input_source(layout->input_source)) { @@ -1302,6 +1327,7 @@ INT macdrv_GetKeyNameText(LONG lparam, LPWSTR buffer, INT size) */ UINT macdrv_GetKeyboardLayoutList(INT size, HKL *list) { + LCID locale = LOWORD(NtUserGetKeyboardLayout(0)); int count = 0; struct layout *layout; @@ -1317,7 +1343,7 @@ UINT macdrv_GetKeyboardLayoutList(INT size, HKL *list) if (list) { if (count >= size) break; - list[count] = layout->hkl; + list[count] = get_layout_hkl(layout, locale); TRACE("\t%d: %p\n", count, list[count]); } count++; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10138
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/winewayland.drv/wayland_keyboard.c | 53 +++++++++++++++++++++-- dlls/winewayland.drv/wayland_text_input.c | 2 + dlls/winewayland.drv/waylanddrv.h | 1 + 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/dlls/winewayland.drv/wayland_keyboard.c b/dlls/winewayland.drv/wayland_keyboard.c index 648b7f9cc2f..0a6eea2fa73 100644 --- a/dlls/winewayland.drv/wayland_keyboard.c +++ b/dlls/winewayland.drv/wayland_keyboard.c @@ -38,6 +38,40 @@ WINE_DEFAULT_DEBUG_CHANNEL(keyboard); WINE_DECLARE_DEBUG_CHANNEL(key); +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; + } +} + +static HKL get_ime_hkl(LCID locale) +{ + return ULongToHandle(MAKELONG(locale, 0xe001)); +} + struct layout { struct list entry; @@ -76,6 +110,13 @@ static struct list xkb_layouts = LIST_INIT(xkb_layouts); static struct rxkb_context *rxkb_context; static HKL keyboard_hkl; /* the HKL matching the currently active xkb group */ +void activate_keyboard_hkl(HWND hwnd, BOOL ime) +{ + HKL hkl = ime && !is_ime_hkl(keyboard_hkl) ? get_ime_hkl(LOWORD(keyboard_hkl)) : keyboard_hkl; + TRACE("Changing keyboard layout to %p\n", hkl); + NtUserPostMessage(hwnd, WM_INPUTLANGCHANGEREQUEST, 0 /*FIXME*/, (LPARAM)hkl); +} + static void xkb_layout_addref(struct layout *layout) { InterlockedIncrement(&layout->ref); @@ -573,9 +614,11 @@ static void add_xkb_layout(const char *xkb_layout, struct xkb_keymap *xkb_keymap static void set_current_xkb_group(xkb_layout_index_t xkb_group) { + struct wayland_text_input *text_input = &process_wayland.text_input; struct wayland_keyboard *keyboard = &process_wayland.keyboard; LCID locale = LOWORD(NtUserGetKeyboardLayout(0)); struct layout *layout; + BOOL ime; HKL hkl; pthread_mutex_lock(&xkb_layouts_mutex); @@ -595,9 +638,11 @@ static void set_current_xkb_group(xkb_layout_index_t xkb_group) if (hkl == keyboard_hkl) return; keyboard_hkl = hkl; - TRACE("Changing keyboard layout to %p\n", hkl); - NtUserPostMessage(keyboard->focused_hwnd, WM_INPUTLANGCHANGEREQUEST, 0 /*FIXME*/, - (LPARAM)keyboard_hkl); + pthread_mutex_lock(&text_input->mutex); + ime = text_input->focused_hwnd == keyboard->focused_hwnd; + pthread_mutex_unlock(&text_input->mutex); + + activate_keyboard_hkl(keyboard->focused_hwnd, ime); } static BOOL find_xkb_layout_variant(const char *name, const char **layout, const char **variant) @@ -962,6 +1007,8 @@ const KBDTABLES *WAYLAND_KbdLayerDescriptor(HKL hkl) TRACE("hkl=%p\n", hkl); + if (hkl == get_ime_hkl(LOWORD(hkl))) hkl = keyboard_hkl; + pthread_mutex_lock(&xkb_layouts_mutex); LIST_FOR_EACH_ENTRY(layout, &xkb_layouts, struct layout, entry) diff --git a/dlls/winewayland.drv/wayland_text_input.c b/dlls/winewayland.drv/wayland_text_input.c index 52cfef27e50..f92f051f918 100644 --- a/dlls/winewayland.drv/wayland_text_input.c +++ b/dlls/winewayland.drv/wayland_text_input.c @@ -97,6 +97,8 @@ static void text_input_enter(void *data, struct zwp_text_input_v3 *zwp_text_inpu zwp_text_input_v3_set_cursor_rectangle(text_input->zwp_text_input_v3, 0, 0, 0, 0); zwp_text_input_v3_commit(text_input->zwp_text_input_v3); pthread_mutex_unlock(&text_input->mutex); + + activate_keyboard_hkl(hwnd, TRUE); } static void text_input_leave(void *data, struct zwp_text_input_v3 *zwp_text_input_v3, diff --git a/dlls/winewayland.drv/waylanddrv.h b/dlls/winewayland.drv/waylanddrv.h index ad41a1b474e..3b0c300a1f6 100644 --- a/dlls/winewayland.drv/waylanddrv.h +++ b/dlls/winewayland.drv/waylanddrv.h @@ -392,6 +392,7 @@ void wayland_keyboard_init(struct wl_keyboard *wl_keyboard); void wayland_keyboard_deinit(void); const KBDTABLES *WAYLAND_KbdLayerDescriptor(HKL hkl); void WAYLAND_ReleaseKbdTables(const KBDTABLES *); +void activate_keyboard_hkl(HWND hwnd, BOOL ime); /********************************************************************** * Wayland pointer -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10138
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/winex11.drv/keyboard.c | 2 +- dlls/winex11.drv/xim.c | 43 +++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c index 25836fe835d..e2281bef017 100644 --- a/dlls/winex11.drv/keyboard.c +++ b/dlls/winex11.drv/keyboard.c @@ -1823,7 +1823,7 @@ void X11DRV_InitKeyboard( Display *display ) */ BOOL X11DRV_ActivateKeyboardLayout(HKL hkl, UINT flags) { - FIXME("%p, %04x: semi-stub!\n", hkl, flags); + WARN("%p, %04x: semi-stub!\n", hkl, flags); if (flags & KLF_SETFORPROCESS) { diff --git a/dlls/winex11.drv/xim.c b/dlls/winex11.drv/xim.c index 0bb30e9ccea..2c2049ac763 100644 --- a/dlls/winex11.drv/xim.c +++ b/dlls/winex11.drv/xim.c @@ -74,8 +74,49 @@ BOOL xim_in_compose_mode(void) return !!ime_comp_buf; } +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; + } +} + +static HKL get_ime_hkl( LCID locale ) +{ + return ULongToHandle( MAKELONG( locale, 0xe001 ) ); +} + +static void activate_ime_hkl( HWND hwnd ) +{ + HKL hkl = NtUserGetKeyboardLayout( 0 ); + if (!is_ime_hkl( hkl )) NtUserActivateKeyboardLayout( get_ime_hkl( LOWORD(hkl) ), 0 ); +} + static void post_ime_update( HWND hwnd, UINT cursor_pos, WCHAR *comp_str, WCHAR *result_str ) { + activate_ime_hkl( hwnd ); NtUserMessageCall( hwnd, WINE_IME_POST_UPDATE, cursor_pos, (LPARAM)comp_str, result_str, NtUserImeDriverCall, FALSE ); } @@ -128,6 +169,7 @@ static BOOL xic_preedit_state_notify( XIC xic, XPointer user, XPointer arg ) switch (state) { case XIMPreeditEnable: + activate_ime_hkl( hwnd ); NtUserPostMessage( hwnd, WM_WINE_IME_NOTIFY, IMN_WINE_SET_OPEN_STATUS, TRUE ); break; case XIMPreeditDisable: @@ -147,6 +189,7 @@ static int xic_preedit_start( XIC xic, XPointer user, XPointer arg ) if ((ime_comp_buf = realloc( ime_comp_buf, sizeof(WCHAR) ))) *ime_comp_buf = 0; else ERR( "Failed to allocate preedit buffer\n" ); + activate_ime_hkl( hwnd ); NtUserPostMessage( hwnd, WM_WINE_IME_NOTIFY, IMN_WINE_SET_OPEN_STATUS, TRUE ); post_ime_update( hwnd, 0, ime_comp_buf, NULL ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10138
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
Thanks, I've made a couple of changes, let me know what you think. * Fix the test failures, the native builtin IMEs still seem to operate in a limited fashion. We only skip ImeProcessKey / ImeToAsciiEx with non-IME HKLs. * Consider a few more HKL as IMEs, as native actually uses IMEs for these and I suspect some applications might expect that. Any host IME for other language is using custom IME HKL instead. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10138#note_133986
It is a bit unfortunate that `is_ime_hkl()` has to be duplicated a bunch of times like that... -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10138#note_134209
On Mon Mar 30 09:41:37 2026 +0000, Marc-Aurel Zent wrote:
It is a bit unfortunate that `is_ime_hkl()` has to be duplicated a bunch of times like that... Sure, but I think it's simple enough that it isn't so much of an issue.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/10138#note_134337
participants (3)
-
Marc-Aurel Zent (@mzent) -
Rémi Bernon -
Rémi Bernon (@rbernon)