From e6d53d63019a3344bed6b1cd561d463fcca9c761 Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Fri, 15 Oct 2021 15:27:03 +0200 Subject: [PATCH] imm32: Use ImmSetActiveContext in ImmAssociateContext. Signed-off-by: Piotr Caban Signed-off-by: Alexandre Julliard --- dlls/imm32/imm.c | 34 ++++++++++++---------------------- dlls/imm32/tests/imm32.c | 26 ++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 22 deletions(-) diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c index cbcc70daedf..790afc34adc 100644 --- a/dlls/imm32/imm.c +++ b/dlls/imm32/imm.c @@ -601,35 +601,25 @@ HIMC WINAPI ImmAssociateContext(HWND hWnd, HIMC hIMC) if (hIMC && IMM_IsCrossThreadAccess(hWnd, hIMC)) return NULL; + old = GetPropW(hWnd, szwWineIMCProperty); defaultContext = get_default_context( hWnd ); - old = RemovePropW(hWnd, szwWineIMCProperty); - if (old == NULL) + if (!old) old = defaultContext; else if (old == (HIMC)-1) old = NULL; - if (hIMC != defaultContext) - { - if (hIMC == NULL) /* Meaning disable imm for that window*/ - SetPropW(hWnd, szwWineIMCProperty, (HANDLE)-1); - else - SetPropW(hWnd, szwWineIMCProperty, hIMC); - } - - if (old) - { - InputContextData *old_data = old; - if (old_data->IMC.hWnd == hWnd) - old_data->IMC.hWnd = NULL; - } - - if (!hIMC) - return old; + if (old == hIMC) + return hIMC; - SendMessageW(data->IMC.hWnd, WM_IME_SETCONTEXT, FALSE, ISC_SHOWUIALL); - data->IMC.hWnd = hWnd; - SendMessageW(data->IMC.hWnd, WM_IME_SETCONTEXT, TRUE, ISC_SHOWUIALL); + if (!hIMC) /* Meaning disable imm for that window*/ + SetPropW(hWnd, szwWineIMCProperty, (HANDLE)-1); + else if (hIMC == defaultContext) + RemovePropW(hWnd, szwWineIMCProperty); + else + SetPropW(hWnd, szwWineIMCProperty, hIMC); + 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 18d69724e58..77df36b8e38 100644 --- a/dlls/imm32/tests/imm32.c +++ b/dlls/imm32/tests/imm32.c @@ -663,29 +663,55 @@ static void test_ImmAssociateContextEx(void) { HIMC retimc, newimc; + SET_ENABLE(WM_IME_SETCONTEXT_ACTIVATE, TRUE); + SET_ENABLE(WM_IME_SETCONTEXT_DEACTIVATE, TRUE); + + ok(GetActiveWindow() == hwnd, "hwnd is not active\n"); newimc = ImmCreateContext(); ok(newimc != imc, "handles should not be the same\n"); rc = pImmAssociateContextEx(NULL, NULL, 0); ok(!rc, "ImmAssociateContextEx succeeded\n"); + SET_EXPECT(WM_IME_SETCONTEXT_DEACTIVATE); + SET_EXPECT(WM_IME_SETCONTEXT_ACTIVATE); rc = pImmAssociateContextEx(hwnd, NULL, 0); + CHECK_CALLED(WM_IME_SETCONTEXT_DEACTIVATE); + CHECK_CALLED(WM_IME_SETCONTEXT_ACTIVATE); ok(rc, "ImmAssociateContextEx failed\n"); rc = pImmAssociateContextEx(NULL, imc, 0); ok(!rc, "ImmAssociateContextEx succeeded\n"); + SET_EXPECT(WM_IME_SETCONTEXT_DEACTIVATE); + SET_EXPECT(WM_IME_SETCONTEXT_ACTIVATE); rc = pImmAssociateContextEx(hwnd, imc, 0); + CHECK_CALLED(WM_IME_SETCONTEXT_DEACTIVATE); + CHECK_CALLED(WM_IME_SETCONTEXT_ACTIVATE); ok(rc, "ImmAssociateContextEx failed\n"); retimc = ImmGetContext(hwnd); ok(retimc == imc, "handles should be the same\n"); ImmReleaseContext(hwnd,retimc); + rc = pImmAssociateContextEx(hwnd, imc, 0); + ok(rc, "ImmAssociateContextEx failed\n"); + + SET_EXPECT(WM_IME_SETCONTEXT_DEACTIVATE); + SET_EXPECT(WM_IME_SETCONTEXT_ACTIVATE); rc = pImmAssociateContextEx(hwnd, newimc, 0); + CHECK_CALLED(WM_IME_SETCONTEXT_DEACTIVATE); + CHECK_CALLED(WM_IME_SETCONTEXT_ACTIVATE); ok(rc, "ImmAssociateContextEx failed\n"); retimc = ImmGetContext(hwnd); ok(retimc == newimc, "handles should be the same\n"); ImmReleaseContext(hwnd,retimc); + SET_EXPECT(WM_IME_SETCONTEXT_DEACTIVATE); + SET_EXPECT(WM_IME_SETCONTEXT_ACTIVATE); 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); + SET_ENABLE(WM_IME_SETCONTEXT_DEACTIVATE, FALSE); } ImmReleaseContext(hwnd,imc); } -- 2.11.4.GIT