From f972a9fbd54c662b0d3387517f247684512e13c3 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Wed, 28 Jul 2021 23:26:02 +0900 Subject: [PATCH] [IMM32] Rewrite ImmSetCompositionWindow (#3855) Implementing Japanese input... CORE-11700 --- dll/win32/imm32/imm.c | 40 +++++++++++++++------------------------- 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/dll/win32/imm32/imm.c b/dll/win32/imm32/imm.c index 1523c74dbbf..13c79d1a226 100644 --- a/dll/win32/imm32/imm.c +++ b/dll/win32/imm32/imm.c @@ -2997,38 +2997,28 @@ BOOL WINAPI ImmSetCompositionStringW( BOOL WINAPI ImmSetCompositionWindow( HIMC hIMC, LPCOMPOSITIONFORM lpCompForm) { - BOOL reshow = FALSE; - InputContextData *data = get_imc_data(hIMC); + DWORD dwImeThreadId, dwThreadId; + LPINPUTCONTEXT pIC; + HWND hWnd; - TRACE("(%p, %p)\n", hIMC, lpCompForm); - if (lpCompForm) - TRACE("\t%x, %s, %s\n", lpCompForm->dwStyle, - wine_dbgstr_point(&lpCompForm->ptCurrentPos), - wine_dbgstr_rect(&lpCompForm->rcArea)); - - if (!data) - { - SetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } - - if (IMM_IsCrossThreadAccess(NULL, hIMC)) + dwImeThreadId = NtUserQueryInputContext(hIMC, 1); + dwThreadId = GetCurrentThreadId(); + if (dwImeThreadId != dwThreadId) return FALSE; - data->IMC.cfCompForm = *lpCompForm; + pIC = ImmLockIMC(hIMC); + if (pIC == NULL) + return FALSE; - if (IsWindowVisible(data->immKbd->UIWnd)) - { - reshow = TRUE; - ShowWindow(data->immKbd->UIWnd,SW_HIDE); - } + pIC->cfCompForm = *lpCompForm; + pIC->fdwInit |= INIT_COMPFORM; - /* FIXME: this is a partial stub */ + hWnd = pIC->hWnd; - if (reshow) - ShowWindow(data->immKbd->UIWnd,SW_SHOWNOACTIVATE); + ImmUnlockIMC(hIMC); - ImmInternalSendIMENotify(data, IMN_SETCOMPOSITIONWINDOW, 0); + Imm32NotifyAction(hIMC, hWnd, NI_CONTEXTUPDATED, 0, + IMC_SETCOMPOSITIONWINDOW, IMN_SETCOMPOSITIONWINDOW, 0); return TRUE; }