From: Marc-Aurel Zent <mzent@codeweavers.com> --- dlls/imm32/ime.c | 13 +++++++++++-- dlls/win32u/driver.c | 2 +- dlls/win32u/imm.c | 42 +++++++++++++++++++++++------------------- 3 files changed, 35 insertions(+), 22 deletions(-) diff --git a/dlls/imm32/ime.c b/dlls/imm32/ime.c index 9e6c96537c8..fcf2454f857 100644 --- a/dlls/imm32/ime.c +++ b/dlls/imm32/ime.c @@ -563,6 +563,7 @@ UINT WINAPI ImeToAsciiEx( UINT vkey, UINT vsc, BYTE *state, TRANSMSGLIST *msgs, INPUTCONTEXT *ctx; NTSTATUS status; BOOL key_consumed = TRUE; + struct ime_driver_call_params params = {.himc = himc, .state = state}; TRACE( "vkey %#x, vsc %#x, state %p, msgs %p, flags %#x, himc %p\n", vkey, vsc, state, msgs, flags, himc ); @@ -575,7 +576,6 @@ UINT WINAPI ImeToAsciiEx( UINT vkey, UINT vsc, BYTE *state, TRANSMSGLIST *msgs, do { - struct ime_driver_call_params params = {.himc = himc, .state = state}; HIMCC himcc; ImmUnlockIMCC( ctx->hCompStr ); @@ -587,9 +587,18 @@ UINT WINAPI ImeToAsciiEx( UINT vkey, UINT vsc, BYTE *state, TRANSMSGLIST *msgs, status = NtUserMessageCall( ctx->hWnd, WINE_IME_TO_ASCII_EX, vkey, vsc, ¶ms, NtUserImeDriverCall, FALSE ); size = compstr->dwSize; + params.state = NULL; } while (status == STATUS_BUFFER_TOO_SMALL); - if (status) WARN( "WINE_IME_TO_ASCII_EX returned status %#lx\n", status ); + if (status == STATUS_NOT_IMPLEMENTED) + { + TRANSMSG msg = {.message = vsc & KF_UP ? WM_KEYUP : WM_KEYDOWN, .wParam = vkey, .lParam = vsc}; + msgs->TransMsg[count++] = msg; + ImmUnlockIMCC( ctx->hCompStr ); + goto done; + } + + if (status) WARN( "WINE_IME_TO_ASCII_EX returned unexpected status %#lx\n", status ); else { if (compstr->dwCompStrOffset || compstr->dwResultStrLen) diff --git a/dlls/win32u/driver.c b/dlls/win32u/driver.c index 36f0205b8b3..40ccdefc6e0 100644 --- a/dlls/win32u/driver.c +++ b/dlls/win32u/driver.c @@ -672,7 +672,7 @@ static void nulldrv_ReleaseKbdTables( const KBDTABLES *tables ) static UINT nulldrv_ImeProcessKey( HIMC himc, UINT wparam, UINT lparam, const BYTE *state ) { - return 0; + return 1; } static UINT nulldrv_ImeToAsciiEx( UINT vkey, UINT vsc, const BYTE *state, HIMC himc ) diff --git a/dlls/win32u/imm.c b/dlls/win32u/imm.c index f585b80a383..68e19bc7a68 100644 --- a/dlls/win32u/imm.c +++ b/dlls/win32u/imm.c @@ -664,28 +664,32 @@ LRESULT ime_driver_call( HWND hwnd, enum wine_ime_call call, WPARAM wparam, LPAR switch (call) { case WINE_IME_PROCESS_KEY: - { - struct imm_thread_data *data = get_imm_thread_data(); - - data->ime_process_scan = HIWORD(lparam); - data->ime_process_vkey = LOWORD(wparam); res = user_driver->pImeProcessKey( params->himc, wparam, lparam, params->state ); - data->ime_process_vkey = data->ime_process_scan = 0; - - if (data->update) - { - data->update->key_consumed = res; - pthread_mutex_lock( &imm_mutex ); - list_add_tail( &ime_updates, &data->update->entry ); - pthread_mutex_unlock( &imm_mutex ); - data->update = NULL; - res = TRUE; - } - - TRACE( "processing vkey %#x, scan %#x -> %lu\n", LOWORD(wparam), HIWORD(lparam), res ); + TRACE( "ImeProcessKey vkey %#x, scan %#x -> %lu\n", LOWORD(wparam), HIWORD(lparam), res ); return res; - } case WINE_IME_TO_ASCII_EX: + if (params->state) + { + struct imm_thread_data *data = get_imm_thread_data(); + + data->ime_process_scan = LOWORD(lparam); + data->ime_process_vkey = LOWORD(wparam); + res = user_driver->pImeToAsciiEx( wparam, lparam, params->state, params->himc ); + data->ime_process_vkey = data->ime_process_scan = 0; + + if (data->update) + { + data->update->key_consumed = !res; + pthread_mutex_lock( &imm_mutex ); + list_add_tail( &ime_updates, &data->update->entry ); + pthread_mutex_unlock( &imm_mutex ); + data->update = NULL; + res = STATUS_SUCCESS; + } + + TRACE( "processing vkey %#x, scan %#x -> %lu\n", LOWORD(wparam), LOWORD(lparam), res ); + if (res) return res; + } return ime_to_tascii_ex( wparam, lparam, params->state, params->compstr, params->key_consumed, params->himc ); case WINE_IME_POST_UPDATE: post_ime_update( hwnd, wparam, (WCHAR *)lparam, (WCHAR *)params ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9992