mirror of
https://github.com/reactos/reactos.git
synced 2025-05-06 18:31:26 +00:00
[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:
parent
cc097ec485
commit
77911014f3
6 changed files with 57 additions and 46 deletions
|
@ -784,7 +784,7 @@ static void ImmInternalSendIMEMessage(InputContextData *data, UINT msg, WPARAM w
|
|||
|
||||
static InputContextData* get_imc_data(HIMC hIMC)
|
||||
{
|
||||
InputContextData *data = hIMC;
|
||||
InputContextData *data = (InputContextData *)hIMC;
|
||||
|
||||
if (hIMC == NULL)
|
||||
return NULL;
|
||||
|
@ -861,7 +861,7 @@ HIMC WINAPI ImmAssociateContext(HWND hWnd, HIMC hIMC)
|
|||
|
||||
if (old)
|
||||
{
|
||||
InputContextData *old_data = old;
|
||||
InputContextData *old_data = (InputContextData *)old;
|
||||
if (old_data->IMC.hWnd == hWnd)
|
||||
old_data->IMC.hWnd = NULL;
|
||||
}
|
||||
|
@ -2546,7 +2546,7 @@ HIMC WINAPI ImmGetContext(HWND hWnd)
|
|||
|
||||
if (rc)
|
||||
{
|
||||
InputContextData *data = rc;
|
||||
InputContextData *data = (InputContextData *)rc;
|
||||
data->IMC.hWnd = hWnd;
|
||||
}
|
||||
|
||||
|
@ -3340,26 +3340,38 @@ BOOL WINAPI ImmIsIME(HKL 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.@)
|
||||
*/
|
||||
BOOL WINAPI ImmIsUIMessageA(
|
||||
HWND hWndIME, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
TRACE("(%p, %x, %ld, %ld)\n", hWndIME, msg, wParam, lParam);
|
||||
if ((msg >= WM_IME_STARTCOMPOSITION && msg <= WM_IME_KEYLAST) ||
|
||||
(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;
|
||||
TRACE("(%p, 0x%X, %p, %p)\n", hWndIME, msg, wParam, lParam);
|
||||
return ImmIsUIMessageAW(hWndIME, msg, wParam, lParam, TRUE);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
@ -3368,20 +3380,8 @@ BOOL WINAPI ImmIsUIMessageA(
|
|||
BOOL WINAPI ImmIsUIMessageW(
|
||||
HWND hWndIME, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
TRACE("(%p, %x, %ld, %ld)\n", hWndIME, msg, wParam, lParam);
|
||||
if ((msg >= WM_IME_STARTCOMPOSITION && msg <= WM_IME_KEYLAST) ||
|
||||
(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;
|
||||
TRACE("(%p, 0x%X, %p, %p)\n", hWndIME, msg, wParam, lParam);
|
||||
return ImmIsUIMessageAW(hWndIME, msg, wParam, lParam, 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);
|
||||
|
||||
if (imc)
|
||||
data = imc;
|
||||
data = (InputContextData *)imc;
|
||||
else
|
||||
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);
|
||||
|
||||
if (imc)
|
||||
data = imc;
|
||||
data = (InputContextData *)imc;
|
||||
else
|
||||
return FALSE;
|
||||
|
||||
|
@ -4800,7 +4800,7 @@ BOOL WINAPI User32InitializeImmEntryTable(DWORD);
|
|||
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
|
||||
{
|
||||
HKL hKL;
|
||||
HWND hWnd;
|
||||
HIMC hIMC;
|
||||
PTEB pTeb;
|
||||
|
||||
TRACE("(%p, 0x%X, %p)\n", hinstDLL, fdwReason, lpReserved);
|
||||
|
@ -4833,8 +4833,9 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
|
|||
return TRUE;
|
||||
|
||||
hKL = GetKeyboardLayout(0);
|
||||
hWnd = (HWND)Imm32GetThreadState(THREADSTATE_CAPTUREWINDOW);
|
||||
Imm32CleanupContext(hWnd, hKL, TRUE);
|
||||
// FIXME: NtUserGetThreadState and enum ThreadStateRoutines are broken.
|
||||
hIMC = (HIMC)Imm32GetThreadState(4);
|
||||
Imm32CleanupContext(hIMC, hKL, TRUE);
|
||||
break;
|
||||
|
||||
case DLL_PROCESS_DETACH:
|
||||
|
|
|
@ -66,8 +66,8 @@
|
|||
@ stdcall ImmInstallIMEA(str str)
|
||||
@ stdcall ImmInstallIMEW(wstr wstr)
|
||||
@ stdcall ImmIsIME(long)
|
||||
@ stdcall ImmIsUIMessageA(long long long long)
|
||||
@ stdcall ImmIsUIMessageW(long long long long)
|
||||
@ stdcall ImmIsUIMessageA(ptr long ptr ptr)
|
||||
@ stdcall ImmIsUIMessageW(ptr long ptr ptr)
|
||||
@ stdcall ImmLoadIME(ptr)
|
||||
@ stdcall ImmLoadLayout(ptr ptr)
|
||||
@ stdcall ImmLockClientImc(ptr)
|
||||
|
|
|
@ -28,11 +28,11 @@ START_TEST(clientimc)
|
|||
pClientImc->cLockObj = 2;
|
||||
pClientImc->dwFlags = 0x40;
|
||||
RtlInitializeCriticalSection(&pClientImc->cs);
|
||||
ok_long(ImmGetIMCCSize(pClientImc->hImc), 4);
|
||||
ok_long(ImmGetIMCCSize((HIMCC)pClientImc->hImc), 4);
|
||||
|
||||
ImmUnlockClientImc(pClientImc);
|
||||
ok_long(pClientImc->cLockObj, 1);
|
||||
ok_long(ImmGetIMCCSize(pClientImc->hImc), 4);
|
||||
ok_long(ImmGetIMCCSize((HIMCC)pClientImc->hImc), 4);
|
||||
|
||||
dwCode = 0;
|
||||
_SEH2_TRY
|
||||
|
@ -47,7 +47,7 @@ START_TEST(clientimc)
|
|||
ok_long(dwCode, STATUS_ACCESS_VIOLATION);
|
||||
|
||||
ok_long(pClientImc->cLockObj, 0);
|
||||
ok_long(ImmGetIMCCSize(pClientImc->hImc), 0);
|
||||
ok_long(ImmGetIMCCSize((HIMCC)pClientImc->hImc), 0);
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, pClientImc);
|
||||
}
|
||||
|
|
|
@ -606,9 +606,17 @@ static void test_ImmIME(void)
|
|||
if (imc)
|
||||
{
|
||||
BOOL rc;
|
||||
#ifdef __REACTOS__
|
||||
rc = ImmConfigureIMEA((HKL)imc, NULL, IME_CONFIG_REGISTERWORD, NULL);
|
||||
#else
|
||||
rc = ImmConfigureIMEA(imc, NULL, IME_CONFIG_REGISTERWORD, NULL);
|
||||
#endif
|
||||
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);
|
||||
#endif
|
||||
ok (rc == 0, "ImmConfigureIMEW did not fail\n");
|
||||
}
|
||||
ImmReleaseContext(hwnd,imc);
|
||||
|
|
|
@ -25,10 +25,13 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifdef __REACTOS__
|
||||
DECLARE_HANDLE(HIMC);
|
||||
DECLARE_HANDLE(HIMCC);
|
||||
typedef HKL *LPHKL;
|
||||
#else
|
||||
typedef HANDLE HIMC;
|
||||
typedef HANDLE HIMCC;
|
||||
#ifdef __REACTOS__
|
||||
typedef HKL *LPHKL;
|
||||
#endif
|
||||
|
||||
typedef struct tagREGISTERWORDA {
|
||||
|
|
|
@ -6,9 +6,8 @@ struct _THREADINFO;
|
|||
struct _DESKTOP;
|
||||
struct _WND;
|
||||
struct tagPOPUPMENU;
|
||||
#ifndef HIMC
|
||||
typedef HANDLE HIMC;
|
||||
#endif
|
||||
|
||||
#define WM_IME_SYSTEM 0x287
|
||||
|
||||
#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 */
|
||||
|
|
Loading…
Reference in a new issue