https://git.reactos.org/?p=reactos.git;a=commitdiff;h=7e8de0466d76209bc0652d763c2cf64336ec6c46
commit 7e8de0466d76209bc0652d763c2cf64336ec6c46 Author: Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com> AuthorDate: Fri Aug 2 04:35:05 2024 +0900 Commit: GitHub <nore...@github.com> CommitDate: Fri Aug 2 04:35:05 2024 +0900 [NTUSER] Use co_UserActivateKeyboardLayout in loading (#7200) Refactoring on keyboard layout. JIRA issue: CORE-19268 - Delete co_UserActivateKbl function. Use co_UserActivateKeyboardLayout function instead of co_UserActivateKbl in co_IntLoadKeyboardLayoutEx function. - Improve co_UserActivateKeyboardLayout. --- win32ss/user/ntuser/kbdlayout.c | 79 +++++++++++++---------------------------- 1 file changed, 24 insertions(+), 55 deletions(-) diff --git a/win32ss/user/ntuser/kbdlayout.c b/win32ss/user/ntuser/kbdlayout.c index d72b561a38b..62afa1a8a75 100644 --- a/win32ss/user/ntuser/kbdlayout.c +++ b/win32ss/user/ntuser/kbdlayout.c @@ -23,7 +23,7 @@ PKL gspklBaseLayout = NULL; /* FIXME: Please move this to pWinSta->spklList */ PKBDFILE gpkfList = NULL; DWORD gSystemFS = 0; UINT gSystemCPCharSet = 0; -DWORD gLCIDSentToShell = 0; +HKL ghKLSentToShell = NULL; typedef PVOID (*PFN_KBDLAYERDESCRIPTOR)(VOID); @@ -592,41 +592,6 @@ UserSetDefaultInputLang(HKL hKl) return TRUE; } -/* - * co_UserActivateKbl - * - * Activates given layout in specified thread - */ -static PKL -co_UserActivateKbl(PTHREADINFO pti, PKL pKl, UINT Flags) -{ - PKL pklPrev; - PWND pWnd; - - pklPrev = pti->KeyboardLayout; - - UserAssignmentLock((PVOID*)&(pti->KeyboardLayout), pKl); - pti->pClientInfo->hKL = pKl->hkl; - - if (Flags & KLF_SETFORPROCESS) - { - FIXME("KLF_SETFORPROCESS\n"); - } - - if (!(pWnd = pti->MessageQueue->spwndFocus)) - { - pWnd = pti->MessageQueue->spwndActive; - } - - // Send WM_INPUTLANGCHANGE to thread's focus window - co_IntSendMessage( pWnd ? UserHMGetHandle(pWnd) : 0, - WM_INPUTLANGCHANGE, - (WPARAM)pKl->iBaseCharset, // FIXME: How to set it? - (LPARAM)pKl->hkl); // hkl - - return pklPrev; -} - VOID APIENTRY IntImmActivateLayout( _Inout_ PTHREADINFO pti, @@ -702,10 +667,10 @@ HKL APIENTRY co_UserActivateKeyboardLayout( _Inout_ PKL pKL, _In_ ULONG uFlags, - _Inout_ PWND pWnd) + _In_opt_ PWND pWnd) { HKL hOldKL = NULL; - PKL pOldKL = NULL; + PKL pOldKL; PTHREADINFO pti = GetW32ThreadInfo(); PWND pTargetWnd, pImeWnd; HWND hTargetWnd, hImeWnd; @@ -716,12 +681,9 @@ co_UserActivateKeyboardLayout( IntReferenceThreadInfo(pti); ClientInfo = pti->pClientInfo; - if (pti->KeyboardLayout) - { - pOldKL = pti->KeyboardLayout; - if (pOldKL) - hOldKL = pOldKL->hkl; - } + pOldKL = pti->KeyboardLayout; + if (pOldKL) + hOldKL = pOldKL->hkl; if (uFlags & KLF_RESET) { @@ -734,7 +696,7 @@ co_UserActivateKeyboardLayout( return hOldKL; } - pKL->wchDiacritic = 0; + pKL->wchDiacritic = UNICODE_NULL; if (pOldKL) UserRefObjectCo(pOldKL, &Ref1); @@ -760,10 +722,15 @@ co_UserActivateKeyboardLayout( ClientInfo->hKL = pKL->hkl; } - if (gptiForeground && (gptiForeground->ppi == pti->ppi)) + /* Send shell message if necessary */ + if (gptiForeground && (gptiForeground->ppi == pti->ppi) && ISITHOOKED(WH_SHELL)) { - /* Send shell message */ - co_IntShellHookNotify(HSHELL_LANGUAGE, 0, (LPARAM)pKL->hkl); + /* Send the HKL if needed and remember it */ + if (ghKLSentToShell != pKL->hkl) + { + co_IntShellHookNotify(HSHELL_LANGUAGE, 0, (LPARAM)pKL->hkl); + ghKLSentToShell = pKL->hkl; + } } if (pti->MessageQueue) @@ -787,14 +754,15 @@ co_UserActivateKeyboardLayout( } } - /* Send WM_IME_SYSTEM:IMS_SENDNOTIFICATION message if necessary */ - if (pti && !(pti->TIF_flags & TIF_CSRSSTHREAD)) + // Refresh IME UI via WM_IME_SYSTEM:IMS_SENDNOTIFICATION messaging + if (!(pti->TIF_flags & TIF_CSRSSTHREAD)) { - if (IS_IME_HKL(pKL->hkl) || IS_CICERO_MODE()) + if (IS_IME_HKL(pKL->hkl) || (IS_CICERO_MODE() && !IS_16BIT_MODE())) { pImeWnd = pti->spwndDefaultIme; if (pImeWnd) { + bSetForProcess &= !IS_16BIT_MODE(); UserRefObjectCo(pImeWnd, &Ref2); hImeWnd = UserHMGetHandle(pImeWnd); co_IntSendMessage(hImeWnd, WM_IME_SYSTEM, IMS_SENDNOTIFICATION, bSetForProcess); @@ -815,7 +783,7 @@ co_IntActivateKeyboardLayout( _Inout_ PWINSTATION_OBJECT pWinSta, _In_ HKL hKL, _In_ ULONG uFlags, - _Inout_ PWND pWnd) + _In_opt_ PWND pWnd) { PKL pKL; PTHREADINFO pti = PsGetCurrentThreadWin32Thread(); @@ -871,10 +839,10 @@ co_IntUnloadKeyboardLayoutEx( UserDerefObjectCo(pKL); /* Release reference */ - if (pti->pDeskInfo->fsHooks) + if (ISITHOOKED(WH_SHELL)) { co_IntShellHookNotify(HSHELL_LANGUAGE, 0, 0); - gLCIDSentToShell = 0; + ghKLSentToShell = NULL; } return TRUE; @@ -892,6 +860,7 @@ IntUnloadKeyboardLayout(_Inout_ PWINSTATION_OBJECT pWinSta, _In_ HKL hKL) return co_IntUnloadKeyboardLayoutEx(pWinSta, pKL, 0); } +/// Invokes imm32!ImmLoadLayout and returns PIMEINFOEX PIMEINFOEX FASTCALL co_UserImmLoadLayout(_In_ HKL hKL) { PIMEINFOEX piiex; @@ -980,7 +949,7 @@ co_IntLoadKeyboardLayoutEx( /* Activate this layout in current thread */ if (Flags & KLF_ACTIVATE) - co_UserActivateKbl(PsGetCurrentThreadWin32Thread(), pNewKL, Flags); + co_UserActivateKeyboardLayout(pNewKL, Flags, NULL); /* Send shell message */ if (!(Flags & KLF_NOTELLSHELL))