Piotr Caban : imm32: Use ImmSetActiveContext in ImmAssociateContext.

Alexandre Julliard julliard at winehq.org
Fri Oct 15 15:40:06 CDT 2021


Module: wine
Branch: master
Commit: e6d53d63019a3344bed6b1cd561d463fcca9c761
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=e6d53d63019a3344bed6b1cd561d463fcca9c761

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Fri Oct 15 15:27:03 2021 +0200

imm32: Use ImmSetActiveContext in ImmAssociateContext.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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);
 }




More information about the wine-cvs mailing list