https://git.reactos.org/?p=reactos.git;a=commitdiff;h=1d0587fc27eb575026dbf…
commit 1d0587fc27eb575026dbf0a575bc16289f872de9
Author: Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com>
AuthorDate: Sat Aug 21 07:22:43 2021 +0900
Commit: GitHub <noreply(a)github.com>
CommitDate: Sat Aug 21 07:22:43 2021 +0900
[IMM32] Rewrite ImmProcessKey (#3917)
- Rewrite ImmProcessKey function.
- Modify win32ss/include/imetable.h.
- Modify ImmProcessKey prototype.
CORE-1170
---
dll/win32/imm32/imm.c | 95 +++++++++++++++++++++++++++++++---------------
sdk/include/psdk/imm.h | 2 +-
win32ss/include/imetable.h | 2 +-
win32ss/include/ntuser.h | 4 +-
4 files changed, 68 insertions(+), 35 deletions(-)
diff --git a/dll/win32/imm32/imm.c b/dll/win32/imm32/imm.c
index bb12ff791c5..055f8d3c865 100644
--- a/dll/win32/imm32/imm.c
+++ b/dll/win32/imm32/imm.c
@@ -39,7 +39,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(imm);
#define IMM_INIT_MAGIC 0x19650412
#define IMM_INVALID_CANDFORM ULONG_MAX
-
+#define INVALID_HOTKEY_ID 0xFFFFFFFF
#define MAX_CANDIDATEFORM 4
#define LANGID_CHINESE_SIMPLIFIED MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED)
@@ -4870,47 +4870,80 @@ Quit:
* ImmProcessKey(IMM32.@)
* ( Undocumented, called from user32.dll )
*/
-BOOL WINAPI ImmProcessKey(HWND hwnd, HKL hKL, UINT vKey, LPARAM lKeyData, DWORD unknown)
+DWORD WINAPI ImmProcessKey(HWND hWnd, HKL hKL, UINT vKey, LPARAM lParam, DWORD
dwHotKeyID)
{
- InputContextData *data;
- HIMC imc = ImmGetContext(hwnd);
- BYTE state[256];
-
- TRACE("%p %p %x %x %x\n",hwnd, hKL, vKey, (UINT)lKeyData, unknown);
+ DWORD ret = 0;
+ HIMC hIMC;
+ PIMEDPI pImeDpi;
+ LPINPUTCONTEXTDX pIC;
+ BYTE KeyState[256];
+ UINT vk;
+ BOOL bUseIme = TRUE, bSkipThisKey = FALSE, bLowWordOnly = FALSE;
- if (imc)
- data = (InputContextData *)imc;
- else
- return FALSE;
+ TRACE("(%p, %p, 0x%X, %p, 0x%lX)\n", hWnd, hKL, vKey, lParam, dwHotKeyID);
- /* Make sure we are inputting to the correct keyboard */
- if (data->immKbd->hkl != hKL)
+ hIMC = ImmGetContext(hWnd);
+ pImeDpi = ImmLockImeDpi(hKL);
+ if (pImeDpi)
{
- ImmHkl *new_hkl = IMM_GetImmHkl(hKL);
- if (new_hkl)
+ pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
+ if (pIC)
{
- data->immKbd->pImeSelect(imc, FALSE);
- data->immKbd->uSelected--;
- data->immKbd = new_hkl;
- data->immKbd->pImeSelect(imc, TRUE);
- data->immKbd->uSelected++;
+ if (LOBYTE(vKey) == VK_PACKET &&
+ !(pImeDpi->ImeInfo.fdwProperty & IME_PROP_ACCEPT_WIDE_VKEY))
+ {
+ if (pImeDpi->ImeInfo.fdwProperty & IME_PROP_UNICODE)
+ {
+ bLowWordOnly = TRUE;
+ }
+ else
+ {
+ bUseIme = FALSE;
+ if (pIC->fOpen)
+ bSkipThisKey = TRUE;
+ }
+ }
+
+ if (bUseIme)
+ {
+ if (GetKeyboardState(KeyState))
+ {
+ vk = (bLowWordOnly ? LOWORD(vKey) : vKey);
+ if (pImeDpi->ImeProcessKey(hIMC, vk, lParam, KeyState))
+ {
+ pIC->bNeedsTrans = TRUE;
+ pIC->nVKey = vKey;
+ ret |= IPHK_PROCESSBYIME;
+ }
+ }
+ }
+ else if (bSkipThisKey)
+ {
+ ret |= IPHK_SKIPTHISKEY;
+ }
+
+ ImmUnlockIMC(hIMC);
}
- else
- return FALSE;
+
+ ImmUnlockImeDpi(pImeDpi);
}
- if (!data->immKbd->hIME || !data->immKbd->pImeProcessKey)
- return FALSE;
+ if (dwHotKeyID != INVALID_HOTKEY_ID)
+ {
+ if (Imm32ProcessHotKey(hWnd, hIMC, hKL, dwHotKeyID))
+ {
+ if (vKey != VK_KANJI || dwHotKeyID != IME_JHOTKEY_CLOSE_OPEN)
+ ret |= IPHK_HOTKEY;
+ }
+ }
- GetKeyboardState(state);
- if (data->immKbd->pImeProcessKey(imc, vKey, lKeyData, state))
+ if (ret & IPHK_PROCESSBYIME)
{
- data->lastVK = vKey;
- return TRUE;
+ FIXME("TODO: We have to do something here.\n");
}
- data->lastVK = VK_PROCESSKEY;
- return FALSE;
+ ImmReleaseContext(hWnd, hIMC);
+ return ret;
}
/***********************************************************************
@@ -4959,7 +4992,7 @@ ImmGetHotKey(IN DWORD dwHotKey,
OUT LPUINT lpuVKey,
OUT LPHKL lphKL)
{
- TRACE("%lx, %p, %p, %p\n", dwHotKey, lpuModifiers, lpuVKey, lphKL);
+ TRACE("(0x%lX, %p, %p, %p)\n", dwHotKey, lpuModifiers, lpuVKey, lphKL);
if (lpuModifiers && lpuVKey)
return NtUserGetImeHotKey(dwHotKey, lpuModifiers, lpuVKey, lphKL);
return FALSE;
diff --git a/sdk/include/psdk/imm.h b/sdk/include/psdk/imm.h
index 7fc769ee1eb..f28b8e69f3c 100644
--- a/sdk/include/psdk/imm.h
+++ b/sdk/include/psdk/imm.h
@@ -856,7 +856,7 @@ BOOL WINAPI ImmIsUIMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_
LPARAM);
BOOL WINAPI ImmNotifyIME(_In_ HIMC, _In_ DWORD, _In_ DWORD, _In_ DWORD);
-BOOL WINAPI ImmProcessKey(HWND, HKL, UINT, LPARAM, DWORD);
+DWORD WINAPI ImmProcessKey(HWND, HKL, UINT, LPARAM, DWORD);
BOOL
WINAPI
diff --git a/win32ss/include/imetable.h b/win32ss/include/imetable.h
index 0574fce48f0..96d18de18b4 100644
--- a/win32ss/include/imetable.h
+++ b/win32ss/include/imetable.h
@@ -8,8 +8,8 @@ DEFINE_IME_ENTRY(UINT, ImeEnumRegisterWord, (LPVOID lpfnEnumProc, LPCVOID
lpszRe
DEFINE_IME_ENTRY(BOOL, ImeConfigure, (HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData),
FALSE)
DEFINE_IME_ENTRY(BOOL, ImeDestroy, (UINT uReserved), FALSE)
DEFINE_IME_ENTRY(LRESULT, ImeEscape, (HIMC hIMC, UINT uEscape, LPVOID lpData), FALSE)
-DEFINE_IME_ENTRY(BOOL, ImeSelect, (HIMC hIMC, BOOL fSelect), FALSE)
DEFINE_IME_ENTRY(BOOL, ImeProcessKey, (HIMC hIMC, UINT uVirKey, DWORD lParam, CONST
LPBYTE lpbKeyState), FALSE)
+DEFINE_IME_ENTRY(BOOL, ImeSelect, (HIMC hIMC, BOOL fSelect), FALSE)
DEFINE_IME_ENTRY(BOOL, ImeSetActiveContext, (HIMC hIMC, BOOL fFlag), FALSE)
DEFINE_IME_ENTRY(UINT, ImeToAsciiEx, (UINT uVirKey, UINT uScanCode, CONST LPBYTE
lpbKeyState, LPTRANSMSGLIST lpTransMsgList, UINT fuState, HIMC hIMC), FALSE)
DEFINE_IME_ENTRY(BOOL, NotifyIME, (HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD
dwValue), FALSE)
diff --git a/win32ss/include/ntuser.h b/win32ss/include/ntuser.h
index a4d3b95e985..71c9f3a6f43 100644
--- a/win32ss/include/ntuser.h
+++ b/win32ss/include/ntuser.h
@@ -1259,8 +1259,8 @@ C_ASSERT(offsetof(IMEDPI, ImeEnumRegisterWord) == 0x68);
C_ASSERT(offsetof(IMEDPI, ImeConfigure) == 0x6c);
C_ASSERT(offsetof(IMEDPI, ImeDestroy) == 0x70);
C_ASSERT(offsetof(IMEDPI, ImeEscape) == 0x74);
-C_ASSERT(offsetof(IMEDPI, ImeSelect) == 0x78);
-C_ASSERT(offsetof(IMEDPI, ImeProcessKey) == 0x7c);
+C_ASSERT(offsetof(IMEDPI, ImeProcessKey) == 0x78);
+C_ASSERT(offsetof(IMEDPI, ImeSelect) == 0x7c);
C_ASSERT(offsetof(IMEDPI, ImeSetActiveContext) == 0x80);
C_ASSERT(offsetof(IMEDPI, ImeToAsciiEx) == 0x84);
C_ASSERT(offsetof(IMEDPI, NotifyIME) == 0x88);