From: Marc-Aurel Zent <mzent@codeweavers.com> --- dlls/imm32/ime.c | 13 ++++++++++++- dlls/win32u/driver.c | 2 +- dlls/win32u/imm.c | 14 +++++++++----- include/ntuser.h | 1 + 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/dlls/imm32/ime.c b/dlls/imm32/ime.c index 9e6c96537c8..fcdadd24a1f 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 ); @@ -573,9 +574,19 @@ UINT WINAPI ImeToAsciiEx( UINT vkey, UINT vsc, BYTE *state, TRANSMSGLIST *msgs, if (!(compstr = ImmLockIMCC( ctx->hCompStr ))) goto done; size = max( compstr->dwSize, sizeof(COMPOSITIONSTRING) ); + status = NtUserMessageCall( ctx->hWnd, WINE_IME_TO_ASCII_EX_USER, vkey, vsc, ¶ms, + NtUserImeDriverCall, FALSE ); + + if (!NT_SUCCESS(status)) + { + TRANSMSG msg = {.message = vsc & KF_UP ? WM_KEYUP : WM_KEYDOWN, .wParam = vkey, .lParam = vsc}; + msgs->TransMsg[count++] = msg; + ImmUnlockIMCC( ctx->hCompStr ); + goto done; + } + do { - struct ime_driver_call_params params = {.himc = himc, .state = state}; HIMCC himcc; ImmUnlockIMCC( ctx->hCompStr ); 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..3c650a9c5f9 100644 --- a/dlls/win32u/imm.c +++ b/dlls/win32u/imm.c @@ -664,25 +664,29 @@ LRESULT ime_driver_call( HWND hwnd, enum wine_ime_call call, WPARAM wparam, LPAR switch (call) { case WINE_IME_PROCESS_KEY: + res = user_driver->pImeProcessKey( params->himc, wparam, lparam, params->state ); + TRACE( "ImeProcessKey vkey %#x, scan %#x -> %lu\n", LOWORD(wparam), HIWORD(lparam), res ); + return res; + case WINE_IME_TO_ASCII_EX_USER: { struct imm_thread_data *data = get_imm_thread_data(); - data->ime_process_scan = HIWORD(lparam); + data->ime_process_scan = LOWORD(lparam); data->ime_process_vkey = LOWORD(wparam); - res = user_driver->pImeProcessKey( params->himc, wparam, lparam, params->state ); + res = user_driver->pImeToAsciiEx( wparam, lparam, (BYTE *)params->state, params->himc ); data->ime_process_vkey = data->ime_process_scan = 0; if (data->update) { - data->update->key_consumed = res; + data->update->key_consumed = NT_SUCCESS(res); pthread_mutex_lock( &imm_mutex ); list_add_tail( &ime_updates, &data->update->entry ); pthread_mutex_unlock( &imm_mutex ); data->update = NULL; - res = TRUE; + res = STATUS_SUCCESS; } - TRACE( "processing vkey %#x, scan %#x -> %lu\n", LOWORD(wparam), HIWORD(lparam), res ); + TRACE( "processing vkey %#x, scan %#x -> %lu\n", LOWORD(wparam), LOWORD(lparam), res ); return res; } case WINE_IME_TO_ASCII_EX: diff --git a/include/ntuser.h b/include/ntuser.h index 939771c9121..3ff7fd574e6 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -679,6 +679,7 @@ enum wine_ime_call WINE_IME_PROCESS_KEY, WINE_IME_TO_ASCII_EX, WINE_IME_POST_UPDATE, /* for the user drivers */ + WINE_IME_TO_ASCII_EX_USER, }; /* NtUserImeDriverCall params */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9992