[IMM32] Rewrite ImmConfigureIMEA/W (#3956)
authorKatayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
Mon, 13 Sep 2021 03:47:15 +0000 (12:47 +0900)
committerGitHub <noreply@github.com>
Mon, 13 Sep 2021 03:47:15 +0000 (12:47 +0900)
- Rewrite ImmConfigureIMEA and ImmConfigureIMEW functions.
- Add IMS_... macros for WM_IME_SYSTEM message, into <undocuser.h>.
- Delete useless strdupAtoW and strdupWtoA inline functions.
CORE-11700

dll/win32/imm32/ime.c
dll/win32/imm32/imm.c
sdk/include/reactos/undocuser.h

index ba68a9a..572d653 100644 (file)
@@ -1199,3 +1199,121 @@ BOOL WINAPI ImmSetConversionStatus(HIMC hIMC, DWORD fdwConversion, DWORD fdwSent
 
     return TRUE;
 }
+
+/***********************************************************************
+ *             ImmConfigureIMEA (IMM32.@)
+ */
+BOOL WINAPI ImmConfigureIMEA(HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData)
+{
+    BOOL ret = FALSE;
+    PIMEDPI pImeDpi;
+    REGISTERWORDW RegWordW;
+    LPREGISTERWORDA pRegWordA;
+
+    TRACE("(%p, %p, 0x%lX, %p)", hKL, hWnd, dwMode, lpData);
+
+    if (!ValidateHwndNoErr(hWnd) || Imm32IsCrossProcessAccess(hWnd))
+        return FALSE;
+
+    pImeDpi = ImmLockOrLoadImeDpi(hKL);
+    if (!pImeDpi)
+        return FALSE;
+
+    RtlZeroMemory(&RegWordW, sizeof(RegWordW));
+
+    if (!(pImeDpi->ImeInfo.fdwProperty & IME_PROP_UNICODE) || !lpData ||
+        dwMode != IME_CONFIG_REGISTERWORD)
+    {
+        goto DoIt;
+    }
+
+    pRegWordA = lpData;
+
+    if (pRegWordA->lpReading)
+    {
+        RegWordW.lpReading = Imm32WideFromAnsi(pRegWordA->lpReading);
+        if (!RegWordW.lpReading)
+            goto Quit;
+    }
+
+    if (pRegWordA->lpWord)
+    {
+        RegWordW.lpWord = Imm32WideFromAnsi(pRegWordA->lpWord);
+        if (!RegWordW.lpWord)
+            goto Quit;
+    }
+
+    lpData = &RegWordW;
+
+DoIt:
+    SendMessageW(hWnd, WM_IME_SYSTEM, IMS_OPENPROPERTYWINDOW, 0);
+    ret = pImeDpi->ImeConfigure(hKL, hWnd, dwMode, lpData);
+    SendMessageW(hWnd, WM_IME_SYSTEM, IMS_CLOSEPROPERTYWINDOW, 0);
+
+Quit:
+    if (RegWordW.lpReading)
+        HeapFree(g_hImm32Heap, 0, RegWordW.lpReading);
+    if (RegWordW.lpWord)
+        HeapFree(g_hImm32Heap, 0, RegWordW.lpWord);
+    ImmUnlockImeDpi(pImeDpi);
+    return ret;
+}
+
+/***********************************************************************
+ *             ImmConfigureIMEW (IMM32.@)
+ */
+BOOL WINAPI ImmConfigureIMEW(HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData)
+{
+    BOOL ret = FALSE;
+    PIMEDPI pImeDpi;
+    REGISTERWORDA RegWordA;
+    LPREGISTERWORDW pRegWordW;
+
+    TRACE("(%p, %p, 0x%lX, %p)", hKL, hWnd, dwMode, lpData);
+
+    if (!ValidateHwndNoErr(hWnd) || Imm32IsCrossProcessAccess(hWnd))
+        return FALSE;
+
+    pImeDpi = ImmLockOrLoadImeDpi(hKL);
+    if (!pImeDpi)
+        return FALSE;
+
+    RtlZeroMemory(&RegWordA, sizeof(RegWordA));
+
+    if ((pImeDpi->ImeInfo.fdwProperty & IME_PROP_UNICODE) || !lpData ||
+        dwMode != IME_CONFIG_REGISTERWORD)
+    {
+        goto DoIt;
+    }
+
+    pRegWordW = lpData;
+
+    if (pRegWordW->lpReading)
+    {
+        RegWordA.lpReading = Imm32AnsiFromWide(pRegWordW->lpReading);
+        if (!RegWordA.lpReading)
+            goto Quit;
+    }
+
+    if (pRegWordW->lpWord)
+    {
+        RegWordA.lpWord = Imm32AnsiFromWide(pRegWordW->lpWord);
+        if (!RegWordA.lpWord)
+            goto Quit;
+    }
+
+    lpData = &RegWordA;
+
+DoIt:
+    SendMessageW(hWnd, WM_IME_SYSTEM, IMS_OPENPROPERTYWINDOW, 0);
+    ret = pImeDpi->ImeConfigure(hKL, hWnd, dwMode, lpData);
+    SendMessageW(hWnd, WM_IME_SYSTEM, IMS_CLOSEPROPERTYWINDOW, 0);
+
+Quit:
+    if (RegWordA.lpReading)
+        HeapFree(g_hImm32Heap, 0, RegWordA.lpReading);
+    if (RegWordA.lpWord)
+        HeapFree(g_hImm32Heap, 0, RegWordA.lpWord);
+    ImmUnlockImeDpi(pImeDpi);
+    return ret;
+}
index 38dd4b5..a07a6c6 100644 (file)
@@ -177,30 +177,6 @@ static inline BOOL is_kbd_ime_unicode(const ImmHkl *hkl)
 
 static InputContextData* get_imc_data(HIMC hIMC);
 
-static inline WCHAR *strdupAtoW( const char *str )
-{
-    WCHAR *ret = NULL;
-    if (str)
-    {
-        DWORD len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0 );
-        if ((ret = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) )))
-            MultiByteToWideChar( CP_ACP, 0, str, -1, ret, len );
-    }
-    return ret;
-}
-
-static inline CHAR *strdupWtoA( const WCHAR *str )
-{
-    CHAR *ret = NULL;
-    if (str)
-    {
-        DWORD len = WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL );
-        if ((ret = HeapAlloc( GetProcessHeap(), 0, len )))
-            WideCharToMultiByte( CP_ACP, 0, str, -1, ret, len, NULL, NULL );
-    }
-    return ret;
-}
-
 static HMODULE load_graphics_driver(void)
 {
     static const WCHAR display_device_guid_propW[] = {
@@ -446,74 +422,6 @@ BOOL WINAPI ImmAssociateContextEx(HWND hWnd, HIMC hIMC, DWORD dwFlags)
     }
 }
 
-/***********************************************************************
- *             ImmConfigureIMEA (IMM32.@)
- */
-BOOL WINAPI ImmConfigureIMEA(HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData)
-{
-    ImmHkl *immHkl = IMM_GetImmHkl(hKL);
-
-    TRACE("(%p, %p, %d, %p):\n", hKL, hWnd, dwMode, lpData);
-
-    if (dwMode == IME_CONFIG_REGISTERWORD && !lpData)
-        return FALSE;
-
-    if (immHkl->hIME && immHkl->pImeConfigure)
-    {
-        if (dwMode != IME_CONFIG_REGISTERWORD || !is_kbd_ime_unicode(immHkl))
-            return immHkl->pImeConfigure(hKL,hWnd,dwMode,lpData);
-        else
-        {
-            REGISTERWORDW rww;
-            REGISTERWORDA *rwa = lpData;
-            BOOL rc;
-
-            rww.lpReading = strdupAtoW(rwa->lpReading);
-            rww.lpWord = strdupAtoW(rwa->lpWord);
-            rc = immHkl->pImeConfigure(hKL,hWnd,dwMode,&rww);
-            HeapFree(GetProcessHeap(),0,rww.lpReading);
-            HeapFree(GetProcessHeap(),0,rww.lpWord);
-            return rc;
-        }
-    }
-    else
-        return FALSE;
-}
-
-/***********************************************************************
- *             ImmConfigureIMEW (IMM32.@)
- */
-BOOL WINAPI ImmConfigureIMEW(HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData)
-{
-    ImmHkl *immHkl = IMM_GetImmHkl(hKL);
-
-    TRACE("(%p, %p, %d, %p):\n", hKL, hWnd, dwMode, lpData);
-
-    if (dwMode == IME_CONFIG_REGISTERWORD && !lpData)
-        return FALSE;
-
-    if (immHkl->hIME && immHkl->pImeConfigure)
-    {
-        if (dwMode != IME_CONFIG_REGISTERWORD || is_kbd_ime_unicode(immHkl))
-            return immHkl->pImeConfigure(hKL,hWnd,dwMode,lpData);
-        else
-        {
-            REGISTERWORDW *rww = lpData;
-            REGISTERWORDA rwa;
-            BOOL rc;
-
-            rwa.lpReading = strdupWtoA(rww->lpReading);
-            rwa.lpWord = strdupWtoA(rww->lpWord);
-            rc = immHkl->pImeConfigure(hKL,hWnd,dwMode,&rwa);
-            HeapFree(GetProcessHeap(),0,rwa.lpReading);
-            HeapFree(GetProcessHeap(),0,rwa.lpWord);
-            return rc;
-        }
-    }
-    else
-        return FALSE;
-}
-
 /***********************************************************************
  *             ImmCreateContext (IMM32.@)
  */
index b706c0f..8a409c0 100644 (file)
@@ -62,6 +62,40 @@ extern "C" {
 #define WM_CBT              0x000003FF // ReactOS only.
 #define WM_MAXIMUM          0x0001FFFF
 
+/* wParam for WM_IME_SYSTEM */
+#define IMS_DESTROYWINDOW        0x1
+#define IMS_IME31COMPATIBLE      0x2
+#define IMS_SETOPENSTATUS        0x3
+#define IMS_SETACTIVECONTEXT     0x4
+#define IMS_CHANGE_SHOWSTAT      0x5
+#define IMS_WINDOWPOS            0x6
+#define IMS_SENDIMEMSG           0x7
+#define IMS_SENDIMEMSGEX         0x8
+#define IMS_SETCANDIDATEPOS      0x9
+#define IMS_SETCOMPOSITIONFONT   0xA
+#define IMS_SETCOMPOSITIONWINDOW 0xB
+#define IMS_CHECKENABLE          0xC
+#define IMS_CONFIGUREIME         0xD
+#define IMS_CONTROLIMEMSG        0xE
+#define IMS_SETOPENCLOSE         0xF
+#define IMS_ISACTIVATED          0x10
+#define IMS_UNLOADTHREADLAYOUT   0x11
+#define IMS_LCHGREQUEST          0x12
+#define IMS_SETSOFTKBDONOFF      0x13
+#define IMS_GETCONVERSIONMODE    0x14
+#define IMS_IMEHELP              0x15
+#define IMS_IMENT35SENDAPPMSG    0x16
+#define IMS_ACTIVATECONTEXT      0x17
+#define IMS_DEACTIVATECONTEXT    0x18
+#define IMS_ACTIVATETHREADLAYOUT 0x19
+#define IMS_CLOSEPROPERTYWINDOW  0x1A
+#define IMS_OPENPROPERTYWINDOW   0x1B
+#define IMS_GETIMEMENU           0x1C
+#define IMS_ENDIMEMENU           0x1D
+#define IMS_GETCONTEXT           0x1E
+#define IMS_SENDNOTIFICATION     0x1F
+#define IMS_FINALIZE_COMPSTR     0x20
+
 /* Non SDK DCE types.*/
 #define DCX_USESTYLE     0x00010000
 #define DCX_KEEPCLIPRGN  0x00040000