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

commit dabb3f4d61da14bfb25c650a05f5943bea8ea4b4
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Thu Nov 2 08:16:12 2023 +0900
Commit:     GitHub <nore...@github.com>
CommitDate: Thu Nov 2 08:16:12 2023 +0900

    [IMM32][SDK] Add CtfAImmIsIME, CtfImmSetAppCompatFlags etc. (#5862)
    
    - Add CtfAImmIsIME, CtfImmIsCiceroStartedInThread and 
CtfImmSetAppCompatFlags functions.
    - Implement CtfImmDispatchDefImeMessage function.
    - Modify imm32.spec.
    - Add the prototypes of ImmGetAppCompatFlags, CtfAImmIsIME, 
CtfImmIsCiceroStartedInThread,
      CtfImmSetAppCompatFlags, and CtfImmDispatchDefImeMessage into 
<imm32_undoc.h>.
    CORE-19268
---
 dll/win32/imm32/ctf.c             | 62 +++++++++++++++++++++++++++++++++++++--
 dll/win32/imm32/imm32.spec        |  5 +++-
 dll/win32/imm32/keymsg.c          |  7 ++++-
 dll/win32/imm32/precomp.h         |  1 +
 sdk/include/reactos/imm32_undoc.h | 11 +++++++
 5 files changed, 82 insertions(+), 4 deletions(-)

diff --git a/dll/win32/imm32/ctf.c b/dll/win32/imm32/ctf.c
index eeeae62b588..b403cb3ad59 100644
--- a/dll/win32/imm32/ctf.c
+++ b/dll/win32/imm32/ctf.c
@@ -29,6 +29,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(imm);
  * this folder.
  */
 
+/* "Active IMM" compatibility flags */
+DWORD g_aimm_compat_flags = 0;
+
 /* The instance of the CTF IME file */
 HINSTANCE g_hCtfIme = NULL;
 
@@ -192,6 +195,45 @@ CtfImeDestroyThreadMgr(VOID)
     return CTF_IME_FN(CtfImeDestroyThreadMgr)();
 }
 
+/***********************************************************************
+ *             CtfAImmIsIME (IMM32.@)
+ *
+ * @return TRUE if CTF IME or IMM IME is enabled.
+ */
+BOOL WINAPI
+CtfAImmIsIME(_In_ HKL hKL)
+{
+    TRACE("(%p)\n", hKL);
+    if (!Imm32LoadCtfIme())
+        return ImmIsIME(hKL);
+    return CTF_IME_FN(CtfImeIsIME)(hKL);
+}
+
+/***********************************************************************
+ *             CtfImmIsCiceroStartedInThread (IMM32.@)
+ *
+ * @return TRUE if Cicero is started in the current thread.
+ */
+BOOL WINAPI
+CtfImmIsCiceroStartedInThread(VOID)
+{
+    TRACE("()\n");
+    return !!(GetWin32ClientInfo()->CI_flags & 0x200);
+}
+
+/***********************************************************************
+ *             CtfImmSetAppCompatFlags (IMM32.@)
+ *
+ * Sets the application compatibility flags.
+ */
+VOID WINAPI
+CtfImmSetAppCompatFlags(_In_ DWORD dwFlags)
+{
+    TRACE("(0x%08X)\n", dwFlags);
+    if (!(dwFlags & 0xF0FFFFFF))
+        g_aimm_compat_flags = dwFlags;
+}
+
 /***********************************************************************
  * This function calls the same name function of the CTF IME side.
  */
@@ -361,6 +403,18 @@ CtfImmHideToolbarWnd(VOID)
     return 0;
 }
 
+BOOL Imm32InsideLoaderLock(VOID)
+{
+    return (NtCurrentTeb()->ProcessEnvironmentBlock->LoaderLock->OwningThread 
==
+            NtCurrentTeb()->ClientId.UniqueThread);
+}
+
+/* FIXME: Use RTL */
+BOOL WINAPI RtlDllShutdownInProgress(VOID)
+{
+    return FALSE;
+}
+
 /***********************************************************************
  *             CtfImmDispatchDefImeMessage(IMM32.@)
  */
@@ -371,8 +425,12 @@ CtfImmDispatchDefImeMessage(
     _In_ WPARAM wParam,
     _In_ LPARAM lParam)
 {
-    /* FIXME("(%p, %u, %p, %p)\n", hWnd, uMsg, wParam, lParam); */
-    return 0;
+    TRACE("(%p, %u, %p, %p)\n", hWnd, uMsg, wParam, lParam);
+
+    if (RtlDllShutdownInProgress() || Imm32InsideLoaderLock() || 
!Imm32LoadCtfIme())
+        return 0;
+
+    return CTF_IME_FN(CtfImeDispatchDefImeMessage)(hWnd, uMsg, wParam, lParam);
 }
 
 /***********************************************************************
diff --git a/dll/win32/imm32/imm32.spec b/dll/win32/imm32/imm32.spec
index eec7202482a..89293195098 100644
--- a/dll/win32/imm32/imm32.spec
+++ b/dll/win32/imm32/imm32.spec
@@ -1,6 +1,8 @@
 @ stdcall CtfAImmActivate(ptr)
 @ stdcall CtfAImmDeactivate(long)
+@ stdcall CtfAImmIsIME(ptr)
 @ stdcall CtfImmIsCiceroEnabled()
+@ stdcall CtfImmIsCiceroStartedInThread()
 @ stdcall CtfImmIsTextFrameServiceDisabled()
 @ stdcall CtfImmTIMActivate(ptr)
 @ stdcall CtfImmRestoreToolbarWnd(long)
@@ -8,6 +10,7 @@
 @ stdcall CtfImmDispatchDefImeMessage(ptr long ptr ptr)
 @ stdcall CtfImmIsGuidMapEnable(ptr)
 @ stdcall CtfImmGetGuidAtom(ptr long ptr)
+@ stdcall CtfImmSetAppCompatFlags(long)
 @ stdcall ImmActivateLayout(ptr)
 @ stdcall ImmAssociateContext(ptr ptr)
 @ stdcall ImmAssociateContextEx(ptr ptr long)
@@ -31,6 +34,7 @@
 @ stdcall ImmEscapeW(long ptr long ptr)
 @ stdcall ImmFreeLayout(long)
 @ stdcall ImmGenerateMessage(ptr)
+@ stdcall ImmGetAppCompatFlags(ptr)
 @ stdcall ImmGetCandidateListA(long long ptr long)
 @ stdcall ImmGetCandidateListCountA(long ptr)
 @ stdcall ImmGetCandidateListCountW(long ptr)
@@ -84,7 +88,6 @@
 @ stdcall ImmLockIMCC(ptr)
 @ stdcall ImmLockImeDpi(ptr)
 @ stdcall ImmNotifyIME(ptr long long long)
-@ stub ImmPenAuxInput
 @ stdcall ImmProcessKey(ptr long long long long)
 @ stdcall ImmPutImeMenuItemsIntoMappedFile(ptr)
 @ stdcall ImmReSizeIMCC(ptr long)
diff --git a/dll/win32/imm32/keymsg.c b/dll/win32/imm32/keymsg.c
index 3e05fe416b9..3f2fb48be31 100644
--- a/dll/win32/imm32/keymsg.c
+++ b/dll/win32/imm32/keymsg.c
@@ -752,18 +752,23 @@ UINT WINAPI ImmGetVirtualKey(HWND hWnd)
     return ret;
 }
 
+/***********************************************************************
+ *             ImmGetAppCompatFlags (IMM32.@)
+ */
 DWORD WINAPI ImmGetAppCompatFlags(HIMC hIMC)
 {
     PCLIENTIMC pClientIMC;
     DWORD dwFlags;
 
+    TRACE("(%p)\n", hIMC);
+
     pClientIMC = ImmLockClientImc(hIMC);
     if (IS_NULL_UNEXPECTEDLY(pClientIMC))
         return 0;
 
     dwFlags = pClientIMC->dwCompatFlags;
     ImmUnlockClientImc(pClientIMC);
-    return dwFlags;
+    return (dwFlags | g_aimm_compat_flags);
 }
 
 /***********************************************************************
diff --git a/dll/win32/imm32/precomp.h b/dll/win32/imm32/precomp.h
index 6e0512af409..8fc4b27d4b7 100644
--- a/dll/win32/imm32/precomp.h
+++ b/dll/win32/imm32/precomp.h
@@ -75,6 +75,7 @@ extern PIMEDPI gpImeDpiList;
 extern PSERVERINFO gpsi;
 extern SHAREDINFO gSharedInfo;
 extern HANDLE ghImmHeap;
+extern DWORD g_aimm_compat_flags;
 
 BOOL Imm32GetSystemLibraryPath(LPWSTR pszPath, DWORD cchPath, LPCWSTR 
pszFileName);
 VOID APIENTRY LogFontAnsiToWide(const LOGFONTA *plfA, LPLOGFONTW plfW);
diff --git a/sdk/include/reactos/imm32_undoc.h 
b/sdk/include/reactos/imm32_undoc.h
index 49cb047182a..d2622dd8423 100644
--- a/sdk/include/reactos/imm32_undoc.h
+++ b/sdk/include/reactos/imm32_undoc.h
@@ -20,9 +20,20 @@ VOID WINAPI ImmUnlockClientImc(PCLIENTIMC pClientImc);
 PIMEDPI WINAPI ImmLockImeDpi(HKL hKL);
 VOID WINAPI ImmUnlockImeDpi(PIMEDPI pImeDpi);
 HRESULT WINAPI CtfImmTIMActivate(HKL hKL);
+DWORD WINAPI ImmGetAppCompatFlags(HIMC hIMC);
 
 HRESULT WINAPI CtfAImmActivate(_Out_opt_ HINSTANCE *phinstCtfIme);
 HRESULT WINAPI CtfAImmDeactivate(_In_ BOOL bDestroy);
+BOOL WINAPI CtfAImmIsIME(_In_ HKL hKL);
+BOOL WINAPI CtfImmIsCiceroStartedInThread(VOID);
+VOID WINAPI CtfImmSetAppCompatFlags(_In_ DWORD dwFlags);
+
+LRESULT WINAPI
+CtfImmDispatchDefImeMessage(
+    _In_ HWND hWnd,
+    _In_ UINT uMsg,
+    _In_ WPARAM wParam,
+    _In_ LPARAM lParam);
 
 #ifdef __cplusplus
 } // extern "C"

Reply via email to