From: Rémi Bernon rbernon@codeweavers.com
--- dlls/imm32/imm.c | 28 ++++++++++++++++++++++++---- dlls/win32u/imm.c | 11 +++++++++++ include/ntuser.h | 1 + 3 files changed, 36 insertions(+), 4 deletions(-)
diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c index d7b9326bd1b..1ce9cbdc570 100644 --- a/dlls/imm32/imm.c +++ b/dlls/imm32/imm.c @@ -622,11 +622,21 @@ static INPUTCONTEXT *ime_find_input_context( struct ime *ime, HIMC himc ) return &entry->context; }
+static BOOL CALLBACK enum_himc_set_builtin_ui( HIMC himc, LPARAM lparam ) +{ + NtUserUpdateInputContext( himc, NtUserInputContextBuiltinUI, lparam ); + return TRUE; +} + static void imc_release_ime( struct imc *imc, struct ime *ime ) { INPUTCONTEXT *ctx;
- if (imc->ui_hwnd) DestroyWindow( imc->ui_hwnd ); + if (imc->ui_hwnd) + { + ImmEnumInputContext( 0, enum_himc_set_builtin_ui, (LPARAM)0 ); + DestroyWindow( imc->ui_hwnd ); + } imc->ui_hwnd = NULL; ime->pImeSelect( imc->handle, FALSE );
@@ -1017,7 +1027,10 @@ static HWND get_ime_ui_window(void) imc->ui_hwnd = CreateWindowExW( WS_EX_TOOLWINDOW, ime->ui_class, NULL, WS_POPUP, 0, 0, 1, 1, ImmGetDefaultIMEWnd( 0 ), 0, ime->module, 0 ); SetWindowLongPtrW( imc->ui_hwnd, IMMGWL_IMC, (LONG_PTR)imc->handle ); + + if (ime->is_builtin) ImmEnumInputContext( 0, enum_himc_set_builtin_ui, (LPARAM)imc->ui_hwnd ); } + return imc->ui_hwnd; }
@@ -1026,10 +1039,17 @@ static HWND get_ime_ui_window(void) */ HIMC WINAPI ImmCreateContext(void) { - struct imc *new_context; + struct imc *imc; + struct ime *ime; + HIMC himc; + + if (!(imc = create_input_context( 0 ))) return 0; + himc = imc->handle; + + if ((imc = default_input_context()) && (ime = imc_select_ime( imc )) && ime->is_builtin) + NtUserUpdateInputContext( himc, NtUserInputContextBuiltinUI, (UINT_PTR)imc->ui_hwnd );
- if (!(new_context = create_input_context(0))) return 0; - return new_context->handle; + return himc; }
static BOOL IMM_DestroyContext(HIMC hIMC) diff --git a/dlls/win32u/imm.c b/dlls/win32u/imm.c index 7dee4912e27..bf04cf82b92 100644 --- a/dlls/win32u/imm.c +++ b/dlls/win32u/imm.c @@ -40,6 +40,8 @@ struct imc struct user_object obj; DWORD thread_id; UINT_PTR client_ptr; + + HWND builtin_ui; /* IME UI window when builtin IME is used */ };
struct imm_thread_data @@ -80,6 +82,7 @@ HIMC WINAPI NtUserCreateInputContext( UINT_PTR client_ptr ) if (!(imc = malloc( sizeof(*imc) ))) return 0; imc->client_ptr = client_ptr; imc->thread_id = GetCurrentThreadId(); + imc->builtin_ui = 0; if (!(handle = alloc_user_handle( &imc->obj, NTUSER_OBJ_IMC ))) { free( imc ); @@ -127,6 +130,10 @@ BOOL WINAPI NtUserUpdateInputContext( HIMC handle, UINT attr, UINT_PTR value ) imc->client_ptr = value; break;
+ case NtUserInputContextBuiltinUI: + imc->builtin_ui = (HWND)value; + break; + default: FIXME( "unknown attr %u\n", attr ); ret = FALSE; @@ -156,6 +163,10 @@ UINT_PTR WINAPI NtUserQueryInputContext( HIMC handle, UINT attr ) ret = imc->thread_id; break;
+ case NtUserInputContextBuiltinUI: + ret = (UINT_PTR)imc->builtin_ui; + break; + default: FIXME( "unknown attr %u\n", attr ); ret = 0; diff --git a/include/ntuser.h b/include/ntuser.h index 3d43eb476e4..8da69cc1e76 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -453,6 +453,7 @@ struct draw_scroll_bar_params /* NtUserUpdateInputContext param, not compatible with Window */ enum input_context_attr { + NtUserInputContextBuiltinUI = -1, NtUserInputContextClientPtr, NtUserInputContextThreadId, };