diff --git a/reactos/base/setup/usetup/interface/usetup.c b/reactos/base/setup/usetup/interface/usetup.c index c7aeca06885..425e8641c99 100644 --- a/reactos/base/setup/usetup/interface/usetup.c +++ b/reactos/base/setup/usetup/interface/usetup.c @@ -45,6 +45,8 @@ LONG UnattendFormatPartition = 0; LONG AutoPartition = 0; WCHAR UnattendInstallationDirectory[MAX_PATH]; PWCHAR SelectedLanguageId; +WCHAR DefaultLanguage[20]; +WCHAR DefaultKBLayout[20]; BOOLEAN RepairUpdateFlag = FALSE; HANDLE hPnpThread = INVALID_HANDLE_VALUE; @@ -543,13 +545,39 @@ CheckUnattendedSetup(VOID) DPRINT("Running unattended setup\n"); } +void +UpdateKBLayout() +{ + PLIST_ENTRY Entry; + PGENERIC_LIST_ENTRY ListEntry; + WCHAR szNewLayout[20]; + + MUIDefaultKeyboardLayout(szNewLayout); + + if (LayoutList == NULL) + { + LayoutList = CreateKeyboardLayoutList(SetupInf, DefaultKBLayout); + } + Entry = LayoutList->ListHead.Flink; + while (Entry != &LayoutList->ListHead) + { + ListEntry = CONTAINING_RECORD (Entry, GENERIC_LIST_ENTRY, Entry); + if (!wcscmp(szNewLayout, ListEntry->UserData)) + { + LayoutList->CurrentEntry = ListEntry; + break; + } + Entry = Entry->Flink; + } +} + static PAGE_NUMBER LanguagePage(PINPUT_RECORD Ir) { /* Initialize the computer settings list */ if (LanguageList == NULL) { - LanguageList = CreateLanguageList(SetupInf); + LanguageList = CreateLanguageList(SetupInf, DefaultLanguage); if (LanguageList == NULL) { PopupError("Setup failed to initialize available translations", NULL, NULL, POPUP_WAIT_NONE); @@ -572,7 +600,7 @@ LanguagePage(PINPUT_RECORD Ir) if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) && (Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */ { -#if 0 //Dinamically update user interface +#if 0 //Dynamically update user interface SelectedLanguageId = (PWCHAR)LanguageList->CurrentEntry->UserData; MUIDisplayPage(LANGUAGE_PAGE); #endif @@ -596,6 +624,10 @@ LanguagePage(PINPUT_RECORD Ir) else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */ { SelectedLanguageId = (PWCHAR)LanguageList->CurrentEntry->UserData; + if (wcscmp(SelectedLanguageId, DefaultLanguage)) + { + UpdateKBLayout(); + } return INTRO_PAGE; } } @@ -713,8 +745,8 @@ SetupStartPage(PINPUT_RECORD Ir) ComputerList = CreateComputerTypeList(SetupInf); DisplayList = CreateDisplayDriverList(SetupInf); KeyboardList = CreateKeyboardDriverList(SetupInf); - LayoutList = CreateKeyboardLayoutList(SetupInf); - LanguageList = CreateLanguageList(SetupInf); + LayoutList = CreateKeyboardLayoutList(SetupInf, DefaultKBLayout); + LanguageList = CreateLanguageList(SetupInf, DefaultLanguage); return INSTALL_INTRO_PAGE; } @@ -937,7 +969,7 @@ DeviceSettingsPage(PINPUT_RECORD Ir) /* Initialize the keyboard layout list */ if (LayoutList == NULL) { - LayoutList = CreateKeyboardLayoutList(SetupInf); + LayoutList = CreateKeyboardLayoutList(SetupInf, DefaultKBLayout); if (LayoutList == NULL) { /* FIXME: report error */ diff --git a/reactos/base/setup/usetup/mui.c b/reactos/base/setup/usetup/mui.c index fb0e3e3a339..0c0b337d4a2 100644 --- a/reactos/base/setup/usetup/mui.c +++ b/reactos/base/setup/usetup/mui.c @@ -181,6 +181,27 @@ FindMUIErrorEntries () return NULL; } +VOID +MUIDefaultKeyboardLayout(WCHAR * KeyboardLayout) +{ + ULONG lngIndex = 0; + do + { + /* First we search the language list till we find current selected language messages */ + if (_wcsicmp(LanguageList[lngIndex].LanguageID , SelectedLanguageId) == 0) + { + /* Get all available error messages for this language */ + wcscpy(KeyboardLayout, LanguageList[lngIndex].LanguageKeyboardLayoutID); + return; + } + + lngIndex++; + } + while (LanguageList[lngIndex].MuiPages != NULL); + + KeyboardLayout[0] = L'\0'; +} + VOID MUIDisplayPage(ULONG page) { diff --git a/reactos/base/setup/usetup/mui.h b/reactos/base/setup/usetup/mui.h index 5571dec04f8..2158de78e6b 100644 --- a/reactos/base/setup/usetup/mui.h +++ b/reactos/base/setup/usetup/mui.h @@ -47,4 +47,8 @@ MUIDisplayPage (ULONG PageNumber); VOID MUIDisplayError (ULONG ErrorNum, PINPUT_RECORD Ir, ULONG WaitEvent); +VOID +MUIDefaultKeyboardLayout(WCHAR * KeyboardLayout); + + #endif diff --git a/reactos/base/setup/usetup/settings.c b/reactos/base/setup/usetup/settings.c index 7dd915970b9..6b6b8d5af31 100644 --- a/reactos/base/setup/usetup/settings.c +++ b/reactos/base/setup/usetup/settings.c @@ -656,7 +656,7 @@ CreateKeyboardDriverList(HINF InfFile) } PGENERIC_LIST -CreateLanguageList(HINF InfFile) +CreateLanguageList(HINF InfFile, WCHAR * DefaultLanguage) { CHAR Buffer[128]; PGENERIC_LIST List; @@ -664,7 +664,6 @@ CreateLanguageList(HINF InfFile) PWCHAR KeyName; PWCHAR KeyValue; PWCHAR UserData; - WCHAR DefaultLanguage[20]; /* Get default language id */ if (!SetupFindFirstLineW (InfFile, L"NLS", L"DefaultLanguage", &Context)) @@ -718,7 +717,7 @@ CreateLanguageList(HINF InfFile) } PGENERIC_LIST -CreateKeyboardLayoutList(HINF InfFile) +CreateKeyboardLayoutList(HINF InfFile, WCHAR * DefaultKBLayout) { CHAR Buffer[128]; PGENERIC_LIST List; @@ -726,7 +725,6 @@ CreateKeyboardLayoutList(HINF InfFile) PWCHAR KeyName; PWCHAR KeyValue; PWCHAR UserData; - WCHAR DefaultLayout[20]; /* Get default layout id */ if (!SetupFindFirstLineW (InfFile, L"NLS", L"DefaultLayout", &Context)) @@ -735,7 +733,7 @@ CreateKeyboardLayoutList(HINF InfFile) if (!INF_GetData (&Context, NULL, &KeyValue)) return NULL; - wcscpy(DefaultLayout, KeyValue); + wcscpy(DefaultKBLayout, KeyValue); List = CreateGenericList(); if (List == NULL) @@ -753,6 +751,7 @@ CreateKeyboardLayoutList(HINF InfFile) { /* FIXME: Handle error! */ DPRINT("INF_GetData() failed\n"); + DestroyGenericList(List, FALSE); break; } @@ -770,7 +769,7 @@ CreateKeyboardLayoutList(HINF InfFile) AppendGenericListEntry(List, Buffer, UserData, - _wcsicmp(KeyName, DefaultLayout) ? FALSE : TRUE); + _wcsicmp(KeyName, DefaultKBLayout) ? FALSE : TRUE); } while (SetupFindNextLine(&Context, &Context)); diff --git a/reactos/base/setup/usetup/settings.h b/reactos/base/setup/usetup/settings.h index d71afb0771a..4484828bef7 100644 --- a/reactos/base/setup/usetup/settings.h +++ b/reactos/base/setup/usetup/settings.h @@ -46,10 +46,10 @@ PGENERIC_LIST CreateKeyboardDriverList(HINF InfFile); PGENERIC_LIST -CreateKeyboardLayoutList(HINF InfFile); +CreateKeyboardLayoutList(HINF InfFile, WCHAR *DefaultKBLayout); PGENERIC_LIST -CreateLanguageList(HINF InfFile); +CreateLanguageList(HINF InfFile, WCHAR * DefaultLanguage); BOOLEAN ProcessKeyboardLayoutRegistry(PGENERIC_LIST List);