https://git.reactos.org/?p=reactos.git;a=commitdiff;h=7e8de0466d76209bc0652…
commit 7e8de0466d76209bc0652d763c2cf64336ec6c46
Author: Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com>
AuthorDate: Fri Aug 2 04:35:05 2024 +0900
Commit: GitHub <noreply(a)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))