From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/winewayland.drv/wayland_keyboard.c | 16 +++++++++++++++- dlls/winewayland.drv/wayland_text_input.c | 9 +++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/dlls/winewayland.drv/wayland_keyboard.c b/dlls/winewayland.drv/wayland_keyboard.c index 648b7f9cc2f..287987780ee 100644 --- a/dlls/winewayland.drv/wayland_keyboard.c +++ b/dlls/winewayland.drv/wayland_keyboard.c @@ -38,6 +38,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(keyboard); WINE_DECLARE_DEBUG_CHANNEL(key); +static HKL get_ime_hkl(void) +{ + LCID locale = LOWORD(NtUserGetKeyboardLayout(0)); + return ULongToHandle(MAKELONG(locale, 0xe001)); +} + struct layout { struct list entry; @@ -573,6 +579,7 @@ 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; @@ -595,9 +602,14 @@ static void set_current_xkb_group(xkb_layout_index_t xkb_group) if (hkl == keyboard_hkl) return; keyboard_hkl = hkl; + pthread_mutex_lock(&text_input->mutex); + if (text_input->focused_hwnd == keyboard->focused_hwnd) + hkl = get_ime_hkl(); + pthread_mutex_unlock(&text_input->mutex); + TRACE("Changing keyboard layout to %p\n", hkl); NtUserPostMessage(keyboard->focused_hwnd, WM_INPUTLANGCHANGEREQUEST, 0 /*FIXME*/, - (LPARAM)keyboard_hkl); + (LPARAM)hkl); } static BOOL find_xkb_layout_variant(const char *name, const char **layout, const char **variant) @@ -962,6 +974,8 @@ const KBDTABLES *WAYLAND_KbdLayerDescriptor(HKL hkl) TRACE("hkl=%p\n", hkl); + if (hkl == get_ime_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..8b8f7316f9f 100644 --- a/dlls/winewayland.drv/wayland_text_input.c +++ b/dlls/winewayland.drv/wayland_text_input.c @@ -33,6 +33,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(imm); +static HKL get_ime_hkl(void) +{ + LCID locale = LOWORD(NtUserGetKeyboardLayout(0)); + return ULongToHandle(MAKELONG(locale, 0xe001)); +} + static void post_ime_update(HWND hwnd, UINT cursor_pos, WCHAR *comp_str, WCHAR *result_str) { /* Windows uses an empty string to clear the composition string. */ @@ -97,6 +103,9 @@ 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); + + NtUserPostMessage(hwnd, WM_INPUTLANGCHANGEREQUEST, 0 /*FIXME*/, + (LPARAM)get_ime_hkl()); } static void text_input_leave(void *data, struct zwp_text_input_v3 *zwp_text_input_v3, -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10138