mirror of
https://github.com/reactos/reactos.git
synced 2025-05-06 10:28:45 +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)
|
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:
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in a new issue