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

commit 1e62771c7821b3ab221e47d786c1323f266e4208
Author:     Katayama Hirofumi MZ <[email protected]>
AuthorDate: Tue Aug 10 08:08:23 2021 +0900
Commit:     GitHub <[email protected]>
CommitDate: Tue Aug 10 08:08:23 2021 +0900

    [IMM32] Rewrite ImmRegisterWordA (#3881)
    
    - Rewrite ImmRegisterWordA function.
    - Modify imetable.h.
    CORE-11700
---
 dll/win32/imm32/imm.c      | 87 ++++++++++++++++++++++++++++++++++++----------
 win32ss/include/imetable.h | 10 +++---
 2 files changed, 73 insertions(+), 24 deletions(-)

diff --git a/dll/win32/imm32/imm.c b/dll/win32/imm32/imm.c
index 7ae9094844c..963ebb9acab 100644
--- a/dll/win32/imm32/imm.c
+++ b/dll/win32/imm32/imm.c
@@ -437,6 +437,27 @@ BOOL WINAPI ImmLoadIME(HKL hKL)
     return (pImeDpi != NULL);
 }
 
+PIMEDPI APIENTRY ImmLockOrLoadImeDpi(HKL hKL)
+{
+    PW32CLIENTINFO pInfo;
+    PIMEDPI pImeDpi;
+
+    if (!IS_IME_HKL(hKL))
+    {
+        if (!g_psi || !(g_psi->dwSRVIFlags & SRVINFO_CICERO_ENABLED))
+            return NULL;
+
+        pInfo = (PW32CLIENTINFO)(NtCurrentTeb()->Win32ClientInfo);
+        if ((pInfo->W32ClientInfo[0] & 2))
+            return NULL;
+    }
+
+    pImeDpi = ImmLockImeDpi(hKL);
+    if (pImeDpi == NULL)
+        pImeDpi = Ime32LoadImeDpi(hKL, TRUE);
+    return pImeDpi;
+}
+
 HKL WINAPI ImmLoadLayout(HKL hKL, PIMEINFOEX pImeInfoEx)
 {
     DWORD cbData;
@@ -3332,28 +3353,56 @@ BOOL WINAPI ImmNotifyIME(
 BOOL WINAPI ImmRegisterWordA(
   HKL hKL, LPCSTR lpszReading, DWORD dwStyle, LPCSTR lpszRegister)
 {
-    ImmHkl *immHkl = IMM_GetImmHkl(hKL);
-    TRACE("(%p, %s, %d, %s):\n", hKL, debugstr_a(lpszReading), dwStyle,
-                    debugstr_a(lpszRegister));
-    if (immHkl->hIME && immHkl->pImeRegisterWord)
+    BOOL ret = FALSE;
+    PIMEDPI pImeDpi;
+    LPWSTR pszReadingW = NULL, pszRegisterW = NULL;
+    INT cch;
+
+    TRACE("(%p, %s, 0x%lX, %s)\n", hKL, debugstr_a(lpszReading), dwStyle,
+          debugstr_a(lpszRegister));
+
+    pImeDpi = ImmLockOrLoadImeDpi(hKL);
+    if (!pImeDpi)
+        return FALSE;
+
+    if (!(pImeDpi->ImeInfo.fdwProperty & IME_PROP_UNICODE))
     {
-        if (!is_kbd_ime_unicode(immHkl))
-            return immHkl->pImeRegisterWord((LPCWSTR)lpszReading,dwStyle,
-                                            (LPCWSTR)lpszRegister);
-        else
-        {
-            LPWSTR lpszwReading = strdupAtoW(lpszReading);
-            LPWSTR lpszwRegister = strdupAtoW(lpszRegister);
-            BOOL rc;
+        ret = pImeDpi->ImeRegisterWord(lpszReading, dwStyle, lpszRegister);
+        ImmUnlockImeDpi(pImeDpi);
+        return ret;
+    }
 
-            rc = immHkl->pImeRegisterWord(lpszwReading,dwStyle,lpszwRegister);
-            HeapFree(GetProcessHeap(),0,lpszwReading);
-            HeapFree(GetProcessHeap(),0,lpszwRegister);
-            return rc;
-        }
+    if (lpszReading)
+    {
+        cch = lstrlenA(lpszReading);
+        pszReadingW = Imm32HeapAlloc(0, (cch + 1) * sizeof(WCHAR));
+        if (pszReadingW == NULL)
+            goto Quit;
+        cch = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpszReading, cch,
+                                  pszReadingW, cch + 1);
+        pszReadingW[cch] = 0;
     }
-    else
-        return FALSE;
+
+    if (lpszRegister)
+    {
+        cch = lstrlenA(lpszRegister);
+        pszRegisterW = Imm32HeapAlloc(0, (cch + 1) * sizeof(WCHAR));
+        if (pszRegisterW == NULL)
+            goto Quit;
+        cch = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, lpszRegister, cch,
+                                  pszRegisterW, cch + 1);
+        pszRegisterW[cch] = 0;
+    }
+
+    ret = ImmRegisterWordW(hKL, pszReadingW, dwStyle, pszRegisterW);
+
+Quit:
+    if (pszReadingW)
+        HeapFree(g_hImm32Heap, 0, pszReadingW);
+    if (pszRegisterW)
+        HeapFree(g_hImm32Heap, 0, pszRegisterW);
+    ImmUnlockImeDpi(pImeDpi);
+    return ret;
 }
 
 /***********************************************************************
diff --git a/win32ss/include/imetable.h b/win32ss/include/imetable.h
index 5157ec43030..3bfd5c1d562 100644
--- a/win32ss/include/imetable.h
+++ b/win32ss/include/imetable.h
@@ -1,10 +1,10 @@
 /* DEFINE_IME_ENTRY(type, name, params, extended) */
-DEFINE_IME_ENTRY(BOOL, ImeInquire, (LPIMEINFO lpIMEInfo, LPWSTR lpszWndClass, 
DWORD dwSystemInfoFlags), FALSE)
-DEFINE_IME_ENTRY(DWORD, ImeConversionList, (HIMC hIMC, LPCWSTR lpSrc, 
LPCANDIDATELIST lpDst, DWORD dwBufLen, UINT uFlag), FALSE)
-DEFINE_IME_ENTRY(BOOL, ImeRegisterWord, (LPCWSTR lpszReading, DWORD dwStyle, 
LPCWSTR lpszString), FALSE)
-DEFINE_IME_ENTRY(BOOL, ImeUnregisterWord, (LPCWSTR lpszReading, DWORD dwStyle, 
LPCWSTR lpszString), FALSE)
+DEFINE_IME_ENTRY(BOOL, ImeInquire, (LPIMEINFO lpIMEInfo, LPVOID lpszWndClass, 
DWORD dwSystemInfoFlags), FALSE)
+DEFINE_IME_ENTRY(DWORD, ImeConversionList, (HIMC hIMC, LPCVOID lpSrc, 
LPCANDIDATELIST lpDst, DWORD dwBufLen, UINT uFlag), FALSE)
+DEFINE_IME_ENTRY(BOOL, ImeRegisterWord, (LPCVOID lpszReading, DWORD dwStyle, 
LPCVOID lpszString), FALSE)
+DEFINE_IME_ENTRY(BOOL, ImeUnregisterWord, (LPCVOID lpszReading, DWORD dwStyle, 
LPCVOID lpszString), FALSE)
 DEFINE_IME_ENTRY(UINT, ImeGetRegisterWordStyle, (UINT nItem, LPSTYLEBUFW 
lpStyleBuf), FALSE)
-DEFINE_IME_ENTRY(UINT, ImeEnumRegisterWord, (HKL hKL, REGISTERWORDENUMPROCW 
lpfnEnumProc, LPCWSTR lpszReading, DWORD dwStyle, LPCWSTR lpszString, LPVOID 
lpData), FALSE)
+DEFINE_IME_ENTRY(UINT, ImeEnumRegisterWord, (HKL hKL, REGISTERWORDENUMPROCW 
lpfnEnumProc, LPCVOID lpszReading, DWORD dwStyle, LPCVOID lpszString, LPVOID 
lpData), FALSE)
 DEFINE_IME_ENTRY(BOOL, ImeConfigure, (HKL hKL, HWND hWnd, DWORD dwMode, LPVOID 
lpData), FALSE)
 DEFINE_IME_ENTRY(BOOL, ImeDestroy, (UINT uReserved), FALSE)
 DEFINE_IME_ENTRY(LRESULT, ImeEscape, (HIMC hIMC, UINT uEscape, LPVOID lpData), 
FALSE)

Reply via email to