https://git.reactos.org/?p=reactos.git;a=commitdiff;h=dc9c5826bed40e9839ba1e...
commit dc9c5826bed40e9839ba1e129be5abcf9f6b08ff Author: Katayama Hirofumi MZ katayama.hirofumi.mz@gmail.com AuthorDate: Mon Sep 13 12:47:15 2021 +0900 Commit: GitHub noreply@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