[USER32] Implement ImeWnd_OnImeNotify (#4318)
authorKatayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
Fri, 28 Jan 2022 10:21:21 +0000 (19:21 +0900)
committerGitHub <noreply@github.com>
Fri, 28 Jan 2022 10:21:21 +0000 (19:21 +0900)
- Modify CMakeLists.txt to include <ddk/imm.h>
- Implement WM_IME_NOTIFY message handling of the IME window.
CORE-11700

win32ss/user/user32/CMakeLists.txt
win32ss/user/user32/misc/imm.c

index fb2655d..4cf9620 100644 (file)
@@ -4,6 +4,7 @@ spec2def(user32.dll user32.spec ADD_IMPORTLIB)
 include_directories(
     ${REACTOS_SOURCE_DIR}/sdk/include/reactos/subsys
     include
+    ${REACTOS_SOURCE_DIR}/sdk/include/reactos/wine
     ${REACTOS_SOURCE_DIR}/win32ss/include)
 
 list(APPEND SOURCE
index 7e70167..8a7a5eb 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <user32.h>
 #include <strsafe.h>
+#include <ddk/imm.h>
 
 WINE_DEFAULT_DEBUG_CHANNEL(user32);
 
@@ -209,6 +210,48 @@ static VOID User32UpdateImcOfImeUI(PIMEUI pimeui, HIMC hNewIMC)
         User32SetImeWindowOfImc(hNewIMC, hImeWnd);
 }
 
+static LRESULT ImeWnd_OnImeNotify(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
+{
+    LRESULT ret = 0;
+    HIMC hIMC;
+    LPINPUTCONTEXT pIC;
+    HWND hwndUI, hwndIMC;
+
+    switch (wParam)
+    {
+        case IMN_SETCONVERSIONMODE:
+        case IMN_SETOPENSTATUS:
+            hIMC = pimeui->hIMC;
+            pIC = IMM_FN(ImmLockIMC)(hIMC);
+            if (pIC)
+            {
+                hwndIMC = pimeui->hwndIMC;
+                if (IsWindow(hwndIMC))
+                {
+                    NtUserNotifyIMEStatus(hwndIMC, pIC->fOpen, pIC->fdwConversion);
+                }
+                else
+                {
+                    // TODO:
+                }
+
+                IMM_FN(ImmUnlockIMC)(hIMC);
+            }
+            /* FALL THROUGH */
+        default:
+            ret = User32SendImeUIMessage(pimeui, WM_IME_NOTIFY, wParam, lParam, TRUE);
+            break;
+
+        case IMN_PRIVATE:
+            hwndUI = pimeui->hwndUI;
+            if (IsWindow(hwndUI))
+                ret = SendMessageW(hwndUI, WM_IME_NOTIFY, wParam, lParam);
+            break;
+    }
+
+    return ret;
+}
+
 static HWND User32CreateImeUIWindow(PIMEUI pimeui, HKL hKL)
 {
     IMEINFOEX ImeInfoEx;
@@ -428,8 +471,7 @@ LRESULT WINAPI ImeWndProc_common( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa
             break;
 
         case WM_IME_NOTIFY:
-            // TODO:
-            break;
+            return ImeWnd_OnImeNotify(pimeui, wParam, lParam);
 
         case WM_IME_REQUEST:
             break;