[IMM32] Rewrite ImmIsUIMessageA/W (#3907)

- Rewrite ImmIsUIMessageA and ImmIsUIMessageW functions.
- Modify HIMC and HIMCC handle types for strictness. Add typecasts.
- Add WM_IME_SYSTEM macro.
- Modify imm32.spec.
CORE-11700
This commit is contained in:
Katayama Hirofumi MZ 2021-08-16 15:33:51 +09:00 committed by GitHub
parent cc097ec485
commit 77911014f3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 57 additions and 46 deletions

View file

@ -784,7 +784,7 @@ static void ImmInternalSendIMEMessage(InputContextData *data, UINT msg, WPARAM w
static InputContextData* get_imc_data(HIMC hIMC) static InputContextData* get_imc_data(HIMC hIMC)
{ {
InputContextData *data = hIMC; InputContextData *data = (InputContextData *)hIMC;
if (hIMC == NULL) if (hIMC == NULL)
return NULL; return NULL;
@ -861,7 +861,7 @@ HIMC WINAPI ImmAssociateContext(HWND hWnd, HIMC hIMC)
if (old) if (old)
{ {
InputContextData *old_data = old; InputContextData *old_data = (InputContextData *)old;
if (old_data->IMC.hWnd == hWnd) if (old_data->IMC.hWnd == hWnd)
old_data->IMC.hWnd = NULL; old_data->IMC.hWnd = NULL;
} }
@ -2546,7 +2546,7 @@ HIMC WINAPI ImmGetContext(HWND hWnd)
if (rc) if (rc)
{ {
InputContextData *data = rc; InputContextData *data = (InputContextData *)rc;
data->IMC.hWnd = hWnd; data->IMC.hWnd = hWnd;
} }
@ -3340,26 +3340,38 @@ BOOL WINAPI ImmIsIME(HKL hKL)
return !!ImmGetImeInfoEx(&info, ImeInfoExImeWindow, &hKL); return !!ImmGetImeInfoEx(&info, ImeInfoExImeWindow, &hKL);
} }
static BOOL APIENTRY
ImmIsUIMessageAW(HWND hWndIME, UINT msg, WPARAM wParam, LPARAM lParam, BOOL bAnsi)
{
switch (msg)
{
case WM_IME_STARTCOMPOSITION: case WM_IME_ENDCOMPOSITION:
case WM_IME_COMPOSITION: case WM_IME_SETCONTEXT: case WM_IME_NOTIFY:
case WM_IME_COMPOSITIONFULL: case WM_IME_SELECT: case WM_IME_SYSTEM:
break;
default:
return FALSE;
}
if (!hWndIME)
return TRUE;
if (bAnsi)
SendMessageA(hWndIME, msg, wParam, lParam);
else
SendMessageW(hWndIME, msg, wParam, lParam);
return TRUE;
}
/*********************************************************************** /***********************************************************************
* ImmIsUIMessageA (IMM32.@) * ImmIsUIMessageA (IMM32.@)
*/ */
BOOL WINAPI ImmIsUIMessageA( BOOL WINAPI ImmIsUIMessageA(
HWND hWndIME, UINT msg, WPARAM wParam, LPARAM lParam) HWND hWndIME, UINT msg, WPARAM wParam, LPARAM lParam)
{ {
TRACE("(%p, %x, %ld, %ld)\n", hWndIME, msg, wParam, lParam); TRACE("(%p, 0x%X, %p, %p)\n", hWndIME, msg, wParam, lParam);
if ((msg >= WM_IME_STARTCOMPOSITION && msg <= WM_IME_KEYLAST) || return ImmIsUIMessageAW(hWndIME, msg, wParam, lParam, TRUE);
(msg == WM_IME_SETCONTEXT) ||
(msg == WM_IME_NOTIFY) ||
(msg == WM_IME_COMPOSITIONFULL) ||
(msg == WM_IME_SELECT) ||
(msg == 0x287 /* FIXME: WM_IME_SYSTEM */))
{
if (hWndIME)
SendMessageA(hWndIME, msg, wParam, lParam);
return TRUE;
}
return FALSE;
} }
/*********************************************************************** /***********************************************************************
@ -3368,20 +3380,8 @@ BOOL WINAPI ImmIsUIMessageA(
BOOL WINAPI ImmIsUIMessageW( BOOL WINAPI ImmIsUIMessageW(
HWND hWndIME, UINT msg, WPARAM wParam, LPARAM lParam) HWND hWndIME, UINT msg, WPARAM wParam, LPARAM lParam)
{ {
TRACE("(%p, %x, %ld, %ld)\n", hWndIME, msg, wParam, lParam); TRACE("(%p, 0x%X, %p, %p)\n", hWndIME, msg, wParam, lParam);
if ((msg >= WM_IME_STARTCOMPOSITION && msg <= WM_IME_KEYLAST) || return ImmIsUIMessageAW(hWndIME, msg, wParam, lParam, FALSE);
(msg == WM_IME_SETCONTEXT) ||
(msg == WM_IME_NOTIFY) ||
(msg == WM_IME_COMPOSITIONFULL) ||
(msg == WM_IME_SELECT) ||
(msg == 0x287 /* FIXME: WM_IME_SYSTEM */))
{
if (hWndIME)
SendMessageW(hWndIME, msg, wParam, lParam);
return TRUE;
}
return FALSE;
} }
/*********************************************************************** /***********************************************************************
@ -4543,7 +4543,7 @@ BOOL WINAPI ImmTranslateMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lKeyD
TRACE("%p %x %x %x\n",hwnd, msg, (UINT)wParam, (UINT)lKeyData); TRACE("%p %x %x %x\n",hwnd, msg, (UINT)wParam, (UINT)lKeyData);
if (imc) if (imc)
data = imc; data = (InputContextData *)imc;
else else
return FALSE; return FALSE;
@ -4602,7 +4602,7 @@ BOOL WINAPI ImmProcessKey(HWND hwnd, HKL hKL, UINT vKey, LPARAM lKeyData, DWORD
TRACE("%p %p %x %x %x\n",hwnd, hKL, vKey, (UINT)lKeyData, unknown); TRACE("%p %p %x %x %x\n",hwnd, hKL, vKey, (UINT)lKeyData, unknown);
if (imc) if (imc)
data = imc; data = (InputContextData *)imc;
else else
return FALSE; return FALSE;
@ -4800,7 +4800,7 @@ BOOL WINAPI User32InitializeImmEntryTable(DWORD);
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{ {
HKL hKL; HKL hKL;
HWND hWnd; HIMC hIMC;
PTEB pTeb; PTEB pTeb;
TRACE("(%p, 0x%X, %p)\n", hinstDLL, fdwReason, lpReserved); TRACE("(%p, 0x%X, %p)\n", hinstDLL, fdwReason, lpReserved);
@ -4833,8 +4833,9 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
return TRUE; return TRUE;
hKL = GetKeyboardLayout(0); hKL = GetKeyboardLayout(0);
hWnd = (HWND)Imm32GetThreadState(THREADSTATE_CAPTUREWINDOW); // FIXME: NtUserGetThreadState and enum ThreadStateRoutines are broken.
Imm32CleanupContext(hWnd, hKL, TRUE); hIMC = (HIMC)Imm32GetThreadState(4);
Imm32CleanupContext(hIMC, hKL, TRUE);
break; break;
case DLL_PROCESS_DETACH: case DLL_PROCESS_DETACH:

View file

@ -66,8 +66,8 @@
@ stdcall ImmInstallIMEA(str str) @ stdcall ImmInstallIMEA(str str)
@ stdcall ImmInstallIMEW(wstr wstr) @ stdcall ImmInstallIMEW(wstr wstr)
@ stdcall ImmIsIME(long) @ stdcall ImmIsIME(long)
@ stdcall ImmIsUIMessageA(long long long long) @ stdcall ImmIsUIMessageA(ptr long ptr ptr)
@ stdcall ImmIsUIMessageW(long long long long) @ stdcall ImmIsUIMessageW(ptr long ptr ptr)
@ stdcall ImmLoadIME(ptr) @ stdcall ImmLoadIME(ptr)
@ stdcall ImmLoadLayout(ptr ptr) @ stdcall ImmLoadLayout(ptr ptr)
@ stdcall ImmLockClientImc(ptr) @ stdcall ImmLockClientImc(ptr)

View file

@ -28,11 +28,11 @@ START_TEST(clientimc)
pClientImc->cLockObj = 2; pClientImc->cLockObj = 2;
pClientImc->dwFlags = 0x40; pClientImc->dwFlags = 0x40;
RtlInitializeCriticalSection(&pClientImc->cs); RtlInitializeCriticalSection(&pClientImc->cs);
ok_long(ImmGetIMCCSize(pClientImc->hImc), 4); ok_long(ImmGetIMCCSize((HIMCC)pClientImc->hImc), 4);
ImmUnlockClientImc(pClientImc); ImmUnlockClientImc(pClientImc);
ok_long(pClientImc->cLockObj, 1); ok_long(pClientImc->cLockObj, 1);
ok_long(ImmGetIMCCSize(pClientImc->hImc), 4); ok_long(ImmGetIMCCSize((HIMCC)pClientImc->hImc), 4);
dwCode = 0; dwCode = 0;
_SEH2_TRY _SEH2_TRY
@ -47,7 +47,7 @@ START_TEST(clientimc)
ok_long(dwCode, STATUS_ACCESS_VIOLATION); ok_long(dwCode, STATUS_ACCESS_VIOLATION);
ok_long(pClientImc->cLockObj, 0); ok_long(pClientImc->cLockObj, 0);
ok_long(ImmGetIMCCSize(pClientImc->hImc), 0); ok_long(ImmGetIMCCSize((HIMCC)pClientImc->hImc), 0);
HeapFree(GetProcessHeap(), 0, pClientImc); HeapFree(GetProcessHeap(), 0, pClientImc);
} }

View file

@ -606,9 +606,17 @@ static void test_ImmIME(void)
if (imc) if (imc)
{ {
BOOL rc; BOOL rc;
#ifdef __REACTOS__
rc = ImmConfigureIMEA((HKL)imc, NULL, IME_CONFIG_REGISTERWORD, NULL);
#else
rc = ImmConfigureIMEA(imc, NULL, IME_CONFIG_REGISTERWORD, NULL); rc = ImmConfigureIMEA(imc, NULL, IME_CONFIG_REGISTERWORD, NULL);
#endif
ok (rc == 0, "ImmConfigureIMEA did not fail\n"); ok (rc == 0, "ImmConfigureIMEA did not fail\n");
#ifdef __REACTOS__
rc = ImmConfigureIMEW((HKL)imc, NULL, IME_CONFIG_REGISTERWORD, NULL);
#else
rc = ImmConfigureIMEW(imc, NULL, IME_CONFIG_REGISTERWORD, NULL); rc = ImmConfigureIMEW(imc, NULL, IME_CONFIG_REGISTERWORD, NULL);
#endif
ok (rc == 0, "ImmConfigureIMEW did not fail\n"); ok (rc == 0, "ImmConfigureIMEW did not fail\n");
} }
ImmReleaseContext(hwnd,imc); ImmReleaseContext(hwnd,imc);

View file

@ -25,10 +25,13 @@
extern "C" { extern "C" {
#endif #endif
#ifdef __REACTOS__
DECLARE_HANDLE(HIMC);
DECLARE_HANDLE(HIMCC);
typedef HKL *LPHKL;
#else
typedef HANDLE HIMC; typedef HANDLE HIMC;
typedef HANDLE HIMCC; typedef HANDLE HIMCC;
#ifdef __REACTOS__
typedef HKL *LPHKL;
#endif #endif
typedef struct tagREGISTERWORDA { typedef struct tagREGISTERWORDA {

View file

@ -6,9 +6,8 @@ struct _THREADINFO;
struct _DESKTOP; struct _DESKTOP;
struct _WND; struct _WND;
struct tagPOPUPMENU; struct tagPOPUPMENU;
#ifndef HIMC
typedef HANDLE HIMC; #define WM_IME_SYSTEM 0x287
#endif
#define FIRST_USER_HANDLE 0x0020 /* first possible value for low word of user handle */ #define FIRST_USER_HANDLE 0x0020 /* first possible value for low word of user handle */
#define LAST_USER_HANDLE 0xffef /* last possible value for low word of user handle */ #define LAST_USER_HANDLE 0xffef /* last possible value for low word of user handle */