https://git.reactos.org/?p=reactos.git;a=commitdiff;h=1d0587fc27eb575026dbf0a575bc16289f872de9

commit 1d0587fc27eb575026dbf0a575bc16289f872de9
Author:     Katayama Hirofumi MZ <[email protected]>
AuthorDate: Sat Aug 21 07:22:43 2021 +0900
Commit:     GitHub <[email protected]>
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);

Reply via email to