https://git.reactos.org/?p=reactos.git;a=commitdiff;h=64378a88ba36e0ec0513dfa9472fc295e85ceccc

commit 64378a88ba36e0ec0513dfa9472fc295e85ceccc
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Tue Dec 19 14:24:48 2023 +0900
Commit:     GitHub <nore...@github.com>
CommitDate: Tue Dec 19 14:24:48 2023 +0900

    [MSCTFIME] Implement CtfImeDispatchDefImeMessage (#6193)
    
    and add IsMsImeMessage helper funciton.
    CORE-19360
---
 dll/ime/msctfime/msctfime.cpp | 44 +++++++++++++++++++++++++++++++++++++++++--
 dll/ime/msctfime/msctfime.h   |  2 ++
 2 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/dll/ime/msctfime/msctfime.cpp b/dll/ime/msctfime/msctfime.cpp
index d5354b23bdc..8bf27f62d61 100644
--- a/dll/ime/msctfime/msctfime.cpp
+++ b/dll/ime/msctfime/msctfime.cpp
@@ -26,6 +26,20 @@ UINT WM_MSIME_SHOWIMEPAD = 0;
 UINT WM_MSIME_MOUSE = 0;
 UINT WM_MSIME_KEYMAP = 0;
 
+BOOL IsMsImeMessage(UINT uMsg)
+{
+    return (uMsg == WM_MSIME_SERVICE ||
+            uMsg == WM_MSIME_UIREADY ||
+            uMsg == WM_MSIME_RECONVERTREQUEST ||
+            uMsg == WM_MSIME_RECONVERT ||
+            uMsg == WM_MSIME_DOCUMENTFEED ||
+            uMsg == WM_MSIME_QUERYPOSITION ||
+            uMsg == WM_MSIME_MODEBIAS ||
+            uMsg == WM_MSIME_SHOWIMEPAD ||
+            uMsg == WM_MSIME_MOUSE ||
+            uMsg == WM_MSIME_KEYMAP);
+}
+
 typedef BOOLEAN (WINAPI *FN_DllShutDownInProgress)(VOID);
 
 EXTERN_C BOOLEAN WINAPI
@@ -871,6 +885,11 @@ CtfImeProcessCicHotkey(
     return E_NOTIMPL;
 }
 
+/***********************************************************************
+ *      CtfImeDispatchDefImeMessage (MSCTFIME.@)
+ *
+ * @implemented
+ */
 EXTERN_C LRESULT WINAPI
 CtfImeDispatchDefImeMessage(
     _In_ HWND hWnd,
@@ -878,8 +897,29 @@ CtfImeDispatchDefImeMessage(
     _In_ WPARAM wParam,
     _In_ LPARAM lParam)
 {
-    FIXME("stub:(%p, %u, %p, %p)\n", hWnd, uMsg, wParam, lParam);
-    return 0;
+    TRACE("(%p, %u, %p, %p)\n", hWnd, uMsg, wParam, lParam);
+
+    TLS *pTLS = TLS::GetTLS();
+    if (pTLS)
+    {
+        if (uMsg == WM_CREATE)
+            ++pTLS->m_cWnds;
+        else if (uMsg == WM_DESTROY)
+            --pTLS->m_cWnds;
+    }
+
+    if (!IsMsImeMessage(uMsg))
+        return 0;
+
+    HKL hKL = GetKeyboardLayout(0);
+    if (IS_IME_HKL(hKL))
+        return 0;
+
+    HWND hImeWnd = (HWND)SendMessageW(hWnd, WM_IME_NOTIFY, 0x17, 0);
+    if (!IsWindow(hImeWnd))
+        return 0;
+
+    return SendMessageW(hImeWnd, uMsg, wParam, lParam);
 }
 
 EXTERN_C BOOL WINAPI
diff --git a/dll/ime/msctfime/msctfime.h b/dll/ime/msctfime/msctfime.h
index e227b5b8d7e..9e492902348 100644
--- a/dll/ime/msctfime/msctfime.h
+++ b/dll/ime/msctfime/msctfime.h
@@ -28,4 +28,6 @@
 
 #include "resource.h"
 
+#define IS_IME_HKL(hKL) ((((ULONG_PTR)(hKL)) & 0xF0000000) == 0xE0000000)
+
 extern HINSTANCE g_hInst;

Reply via email to