https://git.reactos.org/?p=reactos.git;a=commitdiff;h=39fe905efaa650bf7d15a7...
commit 39fe905efaa650bf7d15a75cd77b3daeb5581a16 Author: Katayama Hirofumi MZ katayama.hirofumi.mz@gmail.com AuthorDate: Thu Oct 20 02:57:47 2022 +0900 Commit: GitHub noreply@github.com CommitDate: Thu Oct 20 02:57:47 2022 +0900
[NTUSER] Improve IntSetImeHotKey (#4789)
- Use the LOWORD value for VK_PACKET detection. - IntGetImeHotKeyByKeyAndLang accepts the neutral language identifier (that is zero). CORE-11700 --- win32ss/user/ntuser/ime.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-)
diff --git a/win32ss/user/ntuser/ime.c b/win32ss/user/ntuser/ime.c index 7f252e36af9..62e71747f50 100644 --- a/win32ss/user/ntuser/ime.c +++ b/win32ss/user/ntuser/ime.c @@ -183,7 +183,7 @@ IntGetImeHotKeyByKeyAndLang(PIMEHOTKEY pList, UINT uModKeys, UINT uLeftRight, continue;
LangID = IntGetImeHotKeyLangId(pNode->dwHotKeyId); - if (LangID != TargetLangId) + if (LangID != TargetLangId && LangID != 0) continue;
uModifiers = pNode->uModifiers; @@ -358,32 +358,33 @@ IntSetImeHotKey(DWORD dwHotKeyId, UINT uModifiers, UINT uVirtualKey, HKL hKL, DW switch (dwAction) { case SETIMEHOTKEY_DELETE: - pNode = IntGetImeHotKeyById(gpImeHotKeyList, dwHotKeyId); + pNode = IntGetImeHotKeyById(gpImeHotKeyList, dwHotKeyId); /* Find hotkey by ID */ if (!pNode) { ERR("dwHotKeyId: 0x%lX\n", dwHotKeyId); return FALSE; }
- IntDeleteImeHotKey(&gpImeHotKeyList, pNode); + IntDeleteImeHotKey(&gpImeHotKeyList, pNode); /* Delete it */ return TRUE;
case SETIMEHOTKEY_ADD: - if (uVirtualKey == VK_PACKET) + if (LOWORD(uVirtualKey) == VK_PACKET) /* In case of VK_PACKET */ return FALSE;
LangId = IntGetImeHotKeyLangId(dwHotKeyId); if (LangId == LANGID_KOREAN) - return FALSE; + return FALSE; /* Korean can't add IME hotkeys */
+ /* Find hotkey by key and language */ pNode = IntGetImeHotKeyByKeyAndLang(gpImeHotKeyList, (uModifiers & MOD_KEYS), (uModifiers & MOD_LEFT_RIGHT), uVirtualKey, LangId); - if (!pNode) - pNode = IntGetImeHotKeyById(gpImeHotKeyList, dwHotKeyId); + if (pNode == NULL) /* If not found */ + pNode = IntGetImeHotKeyById(gpImeHotKeyList, dwHotKeyId); /* Find by ID */
- if (pNode) + if (pNode) /* Already exists */ { pNode->uModifiers = uModifiers; pNode->uVirtualKey = uVirtualKey; @@ -391,23 +392,26 @@ IntSetImeHotKey(DWORD dwHotKeyId, UINT uModifiers, UINT uVirtualKey, HKL hKL, DW return TRUE; }
+ /* Allocate new hotkey */ pNode = ExAllocatePoolWithTag(PagedPool, sizeof(IMEHOTKEY), USERTAG_IMEHOTKEY); if (!pNode) return FALSE;
+ /* Populate */ pNode->pNext = NULL; pNode->dwHotKeyId = dwHotKeyId; pNode->uModifiers = uModifiers; pNode->uVirtualKey = uVirtualKey; pNode->hKL = hKL; - IntAddImeHotKey(&gpImeHotKeyList, pNode); + IntAddImeHotKey(&gpImeHotKeyList, pNode); /* Add it */ return TRUE;
case SETIMEHOTKEY_INITIALIZE: - IntFreeImeHotKeys(); + IntFreeImeHotKeys(); /* Delete all the IME hotkeys */ return TRUE;
default: + ERR("0x%lX\n", dwAction); return FALSE; } }