https://git.reactos.org/?p=reactos.git;a=commitdiff;h=dc9c5826bed40e9839ba1…
commit dc9c5826bed40e9839ba1e129be5abcf9f6b08ff
Author: Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com>
AuthorDate: Mon Sep 13 12:47:15 2021 +0900
Commit: GitHub <noreply(a)github.com>
CommitDate: Mon Sep 13 12:47:15 2021 +0900
[IMM32] Rewrite ImmConfigureIMEA/W (#3956)
- 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 | 118 ++++++++++++++++++++++++++++++++++++++++
dll/win32/imm32/imm.c | 92 -------------------------------
sdk/include/reactos/undocuser.h | 34 ++++++++++++
3 files changed, 152 insertions(+), 92 deletions(-)
diff --git a/dll/win32/imm32/ime.c b/dll/win32/imm32/ime.c
index ba68a9ab3d1..572d6533f99 100644
--- a/dll/win32/imm32/ime.c
+++ b/dll/win32/imm32/ime.c
@@ -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;
+}
diff --git a/dll/win32/imm32/imm.c b/dll/win32/imm32/imm.c
index 38dd4b55b57..a07a6c6965a 100644
--- a/dll/win32/imm32/imm.c
+++ b/dll/win32/imm32/imm.c
@@ -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.@)
*/
diff --git a/sdk/include/reactos/undocuser.h b/sdk/include/reactos/undocuser.h
index b706c0f6660..8a409c04059 100644
--- a/sdk/include/reactos/undocuser.h
+++ b/sdk/include/reactos/undocuser.h
@@ -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