https://git.reactos.org/?p=reactos.git;a=commitdiff;h=8e110335e706a267cae1d691a6ac774add6ad931
commit 8e110335e706a267cae1d691a6ac774add6ad931 Author: Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com> AuthorDate: Wed Sep 14 02:58:28 2022 +0900 Commit: GitHub <nore...@github.com> CommitDate: Wed Sep 14 02:58:28 2022 +0900 [USER32] Load keyboard layouts on logon correctly (#4686) - Add IntLoadPreloadKeyboardLayouts helper function to load the layouts on log-on. - In UpdatePerUserSystemParameters function, call CliImmInitializeHotKeys and IntLoadPreloadKeyboardLayouts functions. CORE-16600 --- win32ss/user/user32/include/user32p.h | 2 ++ win32ss/user/user32/misc/logon.c | 6 ++++ win32ss/user/user32/windows/input.c | 63 +++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+) diff --git a/win32ss/user/user32/include/user32p.h b/win32ss/user/user32/include/user32p.h index 78a0b6be53f..e531ad847af 100644 --- a/win32ss/user/user32/include/user32p.h +++ b/win32ss/user/user32/include/user32p.h @@ -130,5 +130,7 @@ HANDLE FASTCALL UserGetProp(HWND hWnd, ATOM Atom, BOOLEAN SystemProp); BOOL WINAPI InitializeImmEntryTable(VOID); HRESULT User32GetImmFileName(_Out_ LPWSTR lpBuffer, _In_ size_t cchBuffer); BOOL WINAPI UpdatePerUserImmEnabling(VOID); +VOID APIENTRY CliImmInitializeHotKeys(DWORD dwAction, HKL hKL); +VOID IntLoadPreloadKeyboardLayouts(VOID); /* EOF */ diff --git a/win32ss/user/user32/misc/logon.c b/win32ss/user/user32/misc/logon.c index bc735aa7ab4..a763e24e370 100644 --- a/win32ss/user/user32/misc/logon.c +++ b/win32ss/user/user32/misc/logon.c @@ -104,5 +104,11 @@ UpdatePerUserSystemParameters(DWORD dwReserved, // Update Imm support and load Imm32.dll. UpdatePerUserImmEnabling(); + /* Delete all the IME hotkeys */ + CliImmInitializeHotKeys(SETIMEHOTKEY_DELETEALL, NULL); + + /* Load Preload keyboard layouts */ + IntLoadPreloadKeyboardLayouts(); + return NtUserUpdatePerUserSystemParameters(dwReserved, bEnable); } diff --git a/win32ss/user/user32/windows/input.c b/win32ss/user/user32/windows/input.c index a018d3aeca2..87df74fc06b 100644 --- a/win32ss/user/user32/windows/input.c +++ b/win32ss/user/user32/windows/input.c @@ -143,6 +143,69 @@ Failure: return FALSE; } + +/* Win: LoadPreloadKeyboardLayouts */ +VOID IntLoadPreloadKeyboardLayouts(VOID) +{ + UINT nNumber, uFlags; + DWORD cbValue, dwType; + WCHAR szNumber[32], szValue[KL_NAMELENGTH]; + HKEY hPreloadKey; + BOOL bOK = FALSE; + HKL hKL, hDefaultKL = NULL; + + if (RegOpenKeyW(HKEY_CURRENT_USER, + L"Keyboard Layout\\Preload", + &hPreloadKey) != ERROR_SUCCESS) + { + return; + } + + for (nNumber = 1; nNumber <= 1000; ++nNumber) + { + _ultow(nNumber, szNumber, 10); + + cbValue = sizeof(szValue); + if (RegQueryValueExW(hPreloadKey, + szNumber, + NULL, + &dwType, + (LPBYTE)szValue, + &cbValue) != ERROR_SUCCESS) + { + break; + } + + if (dwType != REG_SZ) + continue; + + if (nNumber == 1) /* The first entry is for default keyboard layout */ + uFlags = KLF_SUBSTITUTE_OK | KLF_ACTIVATE | KLF_RESET; + else + uFlags = KLF_SUBSTITUTE_OK | KLF_NOTELLSHELL | KLF_REPLACELANG; + + hKL = LoadKeyboardLayoutW(szValue, uFlags); + if (hKL) + { + bOK = TRUE; + if (nNumber == 1) /* The first entry */ + hDefaultKL = hKL; + } + } + + RegCloseKey(hPreloadKey); + + if (hDefaultKL) + SystemParametersInfoW(SPI_SETDEFAULTINPUTLANG, 0, &hDefaultKL, 0); + + if (!bOK) + { + /* Fallback to English (US) */ + LoadKeyboardLayoutW(L"00000409", KLF_SUBSTITUTE_OK | KLF_ACTIVATE | KLF_RESET); + } +} + + BOOL APIENTRY CliSaveImeHotKey(DWORD dwID, UINT uModifiers, UINT uVirtualKey, HKL hKL, BOOL bDelete) {