From 01e072bb68166c235bfda20874b0fc0065a25e62 Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Fri, 15 Oct 2021 15:27:10 +0200 Subject: [PATCH] imm32: Only call ImmSetActiveContext for active window in ImmAssociateContext. Signed-off-by: Piotr Caban Signed-off-by: Alexandre Julliard --- dlls/imm32/imm.c | 14 ++++++-------- dlls/imm32/tests/imm32.c | 13 +++++++++++-- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c index 790afc34adc..eea8cdb055e 100644 --- a/dlls/imm32/imm.c +++ b/dlls/imm32/imm.c @@ -592,12 +592,6 @@ HIMC WINAPI ImmAssociateContext(HWND hWnd, HIMC hIMC) if (!IsWindow(hWnd) || (hIMC && !data)) return NULL; - /* - * If already associated just return - */ - if (hIMC && data->IMC.hWnd == hWnd) - return hIMC; - if (hIMC && IMM_IsCrossThreadAccess(hWnd, hIMC)) return NULL; @@ -608,6 +602,7 @@ HIMC WINAPI ImmAssociateContext(HWND hWnd, HIMC hIMC) else if (old == (HIMC)-1) old = NULL; + /* If already associated just return */ if (old == hIMC) return hIMC; @@ -618,8 +613,11 @@ HIMC WINAPI ImmAssociateContext(HWND hWnd, HIMC hIMC) else SetPropW(hWnd, szwWineIMCProperty, hIMC); - ImmSetActiveContext(hWnd, old, FALSE); - ImmSetActiveContext(hWnd, hIMC, TRUE); + if (GetActiveWindow() == hWnd) + { + ImmSetActiveContext(hWnd, old, FALSE); + ImmSetActiveContext(hWnd, hIMC, TRUE); + } return old; } diff --git a/dlls/imm32/tests/imm32.c b/dlls/imm32/tests/imm32.c index 77df36b8e38..f837e3da61b 100644 --- a/dlls/imm32/tests/imm32.c +++ b/dlls/imm32/tests/imm32.c @@ -662,6 +662,7 @@ static void test_ImmAssociateContextEx(void) if (imc) { HIMC retimc, newimc; + HWND focus; SET_ENABLE(WM_IME_SETCONTEXT_ACTIVATE, TRUE); SET_ENABLE(WM_IME_SETCONTEXT_DEACTIVATE, TRUE); @@ -703,11 +704,19 @@ static void test_ImmAssociateContextEx(void) ok(retimc == newimc, "handles should be the same\n"); ImmReleaseContext(hwnd,retimc); + focus = CreateWindowA("button", "button", 0, 0, 0, 0, 0, 0, 0, 0, 0); + ok(focus != NULL, "CreateWindow failed\n"); SET_EXPECT(WM_IME_SETCONTEXT_DEACTIVATE); + SetFocus(focus); + todo_wine CHECK_CALLED(WM_IME_SETCONTEXT_DEACTIVATE); + rc = pImmAssociateContextEx(hwnd, imc, 0); + ok(rc, "ImmAssociateContextEx failed\n"); SET_EXPECT(WM_IME_SETCONTEXT_ACTIVATE); + DestroyWindow(focus); + todo_wine CHECK_CALLED(WM_IME_SETCONTEXT_ACTIVATE); + SetFocus(hwnd); + rc = pImmAssociateContextEx(hwnd, NULL, IACE_DEFAULT); - CHECK_CALLED(WM_IME_SETCONTEXT_DEACTIVATE); - CHECK_CALLED(WM_IME_SETCONTEXT_ACTIVATE); ok(rc, "ImmAssociateContextEx failed\n"); SET_ENABLE(WM_IME_SETCONTEXT_ACTIVATE, FALSE);