Author: ekohl Date: Sat Feb 13 16:12:24 2016 New Revision: 70731
URL: http://svn.reactos.org/svn/reactos?rev=70731&view=rev Log: [USERINIT] - Fill the keyboard layout list. - Try to select a matching keyboard layout when the language selection gets changed.
Modified: trunk/reactos/base/system/userinit/livecd.c
Modified: trunk/reactos/base/system/userinit/livecd.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/system/userinit/livecd... ============================================================================== --- trunk/reactos/base/system/userinit/livecd.c [iso-8859-1] (original) +++ trunk/reactos/base/system/userinit/livecd.c [iso-8859-1] Sat Feb 13 16:12:24 2016 @@ -157,6 +157,250 @@ CB_SELECTSTRING, -1, (LPARAM)langSel); +} + + +#if 0 +static +BOOL +GetLayoutID(LPWSTR szLayoutNum, LPWSTR szLCID) +{ + DWORD dwBufLen; + DWORD dwRes; + HKEY hKey; + WCHAR szTempLCID[9]; + + // Get the Layout ID + if (RegOpenKeyExW(HKEY_CURRENT_USER, L"Keyboard Layout\Preload", 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) + { + dwBufLen = sizeof(szTempLCID); + dwRes = RegQueryValueExW(hKey, szLayoutNum, NULL, NULL, (LPBYTE)szTempLCID, &dwBufLen); + + if (dwRes != ERROR_SUCCESS) + { + RegCloseKey(hKey); + return FALSE; + } + + RegCloseKey(hKey); + } + + // Look for a substitude of this layout + if (RegOpenKeyExW(HKEY_CURRENT_USER, L"Keyboard Layout\Substitutes", 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) + { + dwBufLen = sizeof(szTempLCID); + + if (RegQueryValueExW(hKey, szTempLCID, NULL, NULL, (LPBYTE)szLCID, &dwBufLen) != ERROR_SUCCESS) + { + // No substitute found, then use the old LCID + wcscpy(szLCID, szTempLCID); + } + + RegCloseKey(hKey); + } + else + { + // Substitutes key couldn't be opened, so use the old LCID + wcscpy(szLCID, szTempLCID); + } + + return TRUE; +} +#endif + + +static +BOOL +GetLayoutName( + LPCWSTR szLCID, + LPWSTR szName) +{ + HKEY hKey; + DWORD dwBufLen; + WCHAR szBuf[MAX_PATH], szDispName[MAX_PATH], szIndex[MAX_PATH], szPath[MAX_PATH]; + HANDLE hLib; + unsigned i, j, k; + + wsprintf(szBuf, L"SYSTEM\CurrentControlSet\Control\Keyboard Layouts\%s", szLCID); + + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, (LPCTSTR)szBuf, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) + { + dwBufLen = sizeof(szBuf); + + if (RegQueryValueExW(hKey, L"Layout Display Name", NULL, NULL, (LPBYTE)szDispName, &dwBufLen) == ERROR_SUCCESS) + { + if (szDispName[0] == '@') + { + for (i = 0; i < wcslen(szDispName); i++) + { + if ((szDispName[i] == ',') && (szDispName[i + 1] == '-')) + { + for (j = i + 2, k = 0; j < wcslen(szDispName)+1; j++, k++) + { + szIndex[k] = szDispName[j]; + } + szDispName[i - 1] = '\0'; + break; + } + else + szDispName[i] = szDispName[i + 1]; + } + + if (ExpandEnvironmentStringsW(szDispName, szPath, MAX_PATH)) + { + hLib = LoadLibraryW(szPath); + if (hLib) + { + if (LoadStringW(hLib, _wtoi(szIndex), szPath, sizeof(szPath) / sizeof(WCHAR)) != 0) + { + wcscpy(szName, szPath); + RegCloseKey(hKey); + return TRUE; + } + FreeLibrary(hLib); + } + } + } + } + + dwBufLen = sizeof(szBuf); + + if (RegQueryValueExW(hKey, L"Layout Text", NULL, NULL, (LPBYTE)szName, &dwBufLen) == ERROR_SUCCESS) + { + RegCloseKey(hKey); + return TRUE; + } + } + + return FALSE; +} + + +static +VOID +SetKeyboardLayout( + HWND hwnd) +{ +#if 0 + INT iCurSel; + PWSTR pszLCID; + HKL hKl; + WCHAR szLCID[9]; + + iCurSel = SendMessageW(hwnd, CB_GETCURSEL, 0, 0); + if (iCurSel == CB_ERR) + return; + + pszLCID = (PWSTR)SendMessageW(hwnd, CB_GETITEMDATA, iCurSel, 0); + if (pszLCID == (PWSTR)CB_ERR) + return; + + if (GetLayoutID(pszLCID, szLCID)) + { + hKl = LoadKeyboardLayoutW(szLCID, KLF_ACTIVATE | KLF_SETFORPROCESS); + SystemParametersInfoW(SPI_SETDEFAULTINPUTLANG, 0, &hKl, SPIF_SENDWININICHANGE); + } +#endif +} + + +static +VOID +SelectKeyboardForLanguage( + HWND hwnd, + LCID lcid) +{ + INT i, nCount; + LCID LayoutId; + + TRACE("LCID: %08lx\n", lcid); + TRACE("LangID: %04lx\n", LANGIDFROMLCID(lcid)); + + nCount = SendMessageW(hwnd, CB_GETCOUNT, 0, 0); + + for (i = 0; i < nCount; i++) + { + LayoutId = (LCID)SendMessageW(hwnd, CB_GETITEMDATA, i, 0); + TRACE("Layout: %08lx\n", LayoutId); + + if (LANGIDFROMLCID(LayoutId) == LANGIDFROMLCID(lcid)) + { + TRACE("Found 1: %08lx --> %08lx\n", LayoutId, lcid); + SendMessageW(hwnd, CB_SETCURSEL, i, 0); + return; + } + } + + for (i = 0; i < nCount; i++) + { + LayoutId = (LCID)SendMessageW(hwnd, CB_GETITEMDATA, i, 0); + TRACE("Layout: %08lx\n", LayoutId); + + if (PRIMARYLANGID(LayoutId) == PRIMARYLANGID(lcid)) + { + TRACE("Found 2: %08lx --> %08lx\n", LayoutId, lcid); + SendMessageW(hwnd, CB_SETCURSEL, i, 0); + return; + } + } + + TRACE("No match found!\n"); +} + + +static +VOID +CreateKeyboardLayoutList( + HWND hItemsList) +{ + HKEY hKey; + WCHAR szLayoutID[9], KeyName[MAX_PATH]; + DWORD dwIndex = 0; + DWORD dwSize; + INT iIndex; + LONG lError; + ULONG ulLayoutID; + + lError = RegOpenKeyExW(HKEY_LOCAL_MACHINE, + L"System\CurrentControlSet\Control\Keyboard Layouts", + 0, + KEY_ENUMERATE_SUB_KEYS, + &hKey); + if (lError != ERROR_SUCCESS) + return; + + while (TRUE) + { + dwSize = sizeof(szLayoutID) / sizeof(WCHAR); + + lError = RegEnumKeyExW(hKey, + dwIndex, + szLayoutID, + &dwSize, + NULL, + NULL, + NULL, + NULL); + if (lError != ERROR_SUCCESS) + break; + + GetLayoutName(szLayoutID, KeyName); + + iIndex = (INT)SendMessageW(hItemsList, CB_ADDSTRING, 0, (LPARAM)KeyName); + + ulLayoutID = wcstoul(szLayoutID, NULL, 16); + SendMessageW(hItemsList, CB_SETITEMDATA, iIndex, (LPARAM)ulLayoutID); + + // FIXME! + if (wcscmp(szLayoutID, L"00000409") == 0) + { + SendMessageW(hItemsList, CB_SETCURSEL, (WPARAM)iIndex, (LPARAM)0); + } + + dwIndex++; + } + + RegCloseKey(hKey); }
@@ -365,7 +609,9 @@
/* Center the dialog window */ CenterWindow (hwndDlg); + CreateLanguagesList(GetDlgItem(hwndDlg, IDC_LANGUAGELIST)); + CreateKeyboardLayoutList(GetDlgItem(hwndDlg, IDC_LAYOUTLIST));
EnableWindow(GetDlgItem(hwndDlg, IDCANCEL), FALSE); return FALSE; @@ -377,12 +623,11 @@ return TRUE;
case WM_COMMAND: - if (HIWORD(wParam) == BN_CLICKED) + switch (LOWORD(wParam)) { - switch (LOWORD(wParam)) - { - case IDOK: - { + case IDC_LANGUAGELIST: + if (HIWORD(wParam) == CBN_SELCHANGE) + { LCID NewLcid; INT iCurSel;
@@ -391,28 +636,57 @@ CB_GETCURSEL, 0, 0); - if (iCurSel == CB_ERR) + if (iCurSel == CB_ERR) + break; + + NewLcid = SendDlgItemMessageW(hwndDlg, + IDC_LANGUAGELIST, + CB_GETITEMDATA, + iCurSel, + 0); + if (NewLcid == (LCID)CB_ERR) + break; + + TRACE("LCID: 0x%08lx\n", NewLcid); + SelectKeyboardForLanguage(GetDlgItem(hwndDlg, IDC_LAYOUTLIST), + NewLcid); + } break;
- NewLcid = SendDlgItemMessageW(hwndDlg, - IDC_LANGUAGELIST, - CB_GETITEMDATA, - iCurSel, - 0); - if (NewLcid == (LCID)CB_ERR) - break; - - NtSetDefaultLocale(TRUE, NewLcid); - InitializeDefaultUserLocale(&NewLcid); - } + case IDOK: + if (HIWORD(wParam) == BN_CLICKED) + { + LCID NewLcid; + INT iCurSel; + + iCurSel = SendDlgItemMessageW(hwndDlg, + IDC_LANGUAGELIST, + CB_GETCURSEL, + 0, + 0); + if (iCurSel == CB_ERR) + break; + + NewLcid = SendDlgItemMessageW(hwndDlg, + IDC_LANGUAGELIST, + CB_GETITEMDATA, + iCurSel, + 0); + if (NewLcid == (LCID)CB_ERR) + break; + + NtSetDefaultLocale(TRUE, NewLcid); + InitializeDefaultUserLocale(&NewLcid); + + SetKeyboardLayout(GetDlgItem(hwndDlg, IDC_LAYOUTLIST));
pState->NextPage = STARTPAGE; EndDialog(hwndDlg, 0); - break; - - default: - break; - } + } + break; + + default: + break; } break;