https://git.reactos.org/?p=reactos.git;a=commitdiff;h=6c748ca8a9253d3e4241ec...
commit 6c748ca8a9253d3e4241ec0bc945b16dec39e15e Author: Katayama Hirofumi MZ katayama.hirofumi.mz@gmail.com AuthorDate: Sat Aug 20 09:45:06 2022 +0900 Commit: GitHub noreply@github.com CommitDate: Sat Aug 20 09:45:06 2022 +0900
[NTUSER] Rewrite NtUserUnloadKeyboardLayout (#4613)
- Add co_IntUnloadKeyboardLayoutEx (Win: xxxInternalUnloadKeyboardLayout), IntUnloadKeyboardLayout (Win: xxxUnloadKeyboardLayout) helper functions. - Rewrite NtUserUnloadKeyboardLayout function. CORE-11700 --- win32ss/user/ntuser/kbdlayout.c | 75 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 67 insertions(+), 8 deletions(-)
diff --git a/win32ss/user/ntuser/kbdlayout.c b/win32ss/user/ntuser/kbdlayout.c index 90ad390cac4..fde11969f9b 100644 --- a/win32ss/user/ntuser/kbdlayout.c +++ b/win32ss/user/ntuser/kbdlayout.c @@ -23,6 +23,7 @@ PKL gspklBaseLayout = NULL; /* FIXME: Please move this to pWinSta->spklList */ PKBDFILE gpkfList = NULL; DWORD gSystemFS = 0; UINT gSystemCPCharSet = 0; +DWORD gLCIDSentToShell = 0;
typedef PVOID (*PFN_KBDLAYERDESCRIPTOR)(VOID);
@@ -774,6 +775,67 @@ co_IntActivateKeyboardLayout( return co_UserActivateKeyboardLayout(pKL, uFlags, pWnd); }
+// Win: xxxInternalUnloadKeyboardLayout +static BOOL APIENTRY +co_IntUnloadKeyboardLayoutEx( + _Inout_ PWINSTATION_OBJECT pWinSta, + _Inout_ PKL pKL, + _In_ DWORD dwFlags) +{ + PKL pNextKL; + USER_REFERENCE_ENTRY Ref1, Ref2; + PTHREADINFO pti = gptiCurrent; + + if (pKL == gspklBaseLayout && !(dwFlags & 0x80000000)) + return FALSE; + + UserRefObjectCo(pKL, &Ref1); /* Add reference */ + + /* Regard as unloaded */ + UserMarkObjectDestroy(pKL); + pKL->dwKL_Flags |= KLF_UNLOAD; + + if (!(dwFlags & 0x80000000) && pti->KeyboardLayout == pKL) + { + pNextKL = IntHKLtoPKL(pti, (HKL)(ULONG_PTR)HKL_NEXT); + if (pNextKL) + { + UserRefObjectCo(pNextKL, &Ref2); /* Add reference */ + co_UserActivateKeyboardLayout(pNextKL, dwFlags, NULL); + UserDerefObjectCo(pNextKL); /* Release reference */ + } + } + + if (gspklBaseLayout == pKL && pKL != pKL->pklNext) + { + /* Set next layout as default (FIXME: Use UserAssignmentLock?) */ + gspklBaseLayout = pKL->pklNext; + } + + UserDerefObjectCo(pKL); /* Release reference */ + + if (pti->pDeskInfo->fsHooks) + { + co_IntShellHookNotify(HSHELL_LANGUAGE, 0, 0); + gLCIDSentToShell = 0; + } + + return TRUE; +} + +// Win: xxxUnloadKeyboardLayout +static BOOL APIENTRY +IntUnloadKeyboardLayout(_Inout_ PWINSTATION_OBJECT pWinSta, _In_ HKL hKL) +{ + PKL pKL = IntHKLtoPKL(gptiCurrent, hKL); + if (!pKL) + { + ERR("Invalid HKL %p!\n", hKL); + return FALSE; + } + return co_IntUnloadKeyboardLayoutEx(pWinSta, pKL, 0); +} + /* EXPORTS *******************************************************************/
/* @@ -1081,19 +1143,16 @@ APIENTRY NtUserUnloadKeyboardLayout( HKL hKl) { - PKL pKl; - BOOL bRet = FALSE; + BOOL ret; + PWINSTATION_OBJECT pWinSta;
UserEnterExclusive();
- pKl = UserHklToKbl(hKl); - if (pKl) - bRet = UserUnloadKbl(pKl); - else - ERR("Invalid HKL %p!\n", hKl); + pWinSta = IntGetProcessWindowStation(NULL); + ret = IntUnloadKeyboardLayout(pWinSta, hKl);
UserLeave(); - return bRet; + return ret; }
/* EOF */