https://git.reactos.org/?p=reactos.git;a=commitdiff;h=4bf9f6fa4ac1ddf3be0c6a...
commit 4bf9f6fa4ac1ddf3be0c6ab0f6fbec5037efe258 Author: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org AuthorDate: Fri Dec 29 19:37:28 2017 +0100 Commit: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org CommitDate: Sun Oct 28 19:00:01 2018 +0100
[SETUP:REACTOS] Populate the list of existing installations.
- In the 1st-stage GUI setup, display the list of existing discovered NTOS installations, with its name, installation path and vendor name, and an associated icon. --- base/setup/reactos/drivepage.c | 3 + base/setup/reactos/reactos.c | 605 ++++++++++++++++++++--------------- base/setup/reactos/reactos.h | 42 +-- base/setup/reactos/reactos.rc | 4 +- base/setup/reactos/res/README.txt | 12 + base/setup/reactos/res/roslogo.ico | Bin 0 -> 10134 bytes base/setup/reactos/res/roslogo_2.ico | Bin 0 -> 10134 bytes base/setup/reactos/res/winlogo.ico | Bin 0 -> 10134 bytes base/setup/reactos/resource.h | 5 +- 9 files changed, 376 insertions(+), 295 deletions(-)
diff --git a/base/setup/reactos/drivepage.c b/base/setup/reactos/drivepage.c index 5130a2983c..b8bc07f3ce 100644 --- a/base/setup/reactos/drivepage.c +++ b/base/setup/reactos/drivepage.c @@ -29,6 +29,9 @@
/* GLOBALS ******************************************************************/
+#define IDS_LIST_COLUMN_FIRST IDS_PARTITION_NAME +#define IDS_LIST_COLUMN_LAST IDS_PARTITION_TYPE + #define MAX_LIST_COLUMNS (IDS_LIST_COLUMN_LAST - IDS_LIST_COLUMN_FIRST + 1) static const UINT column_ids[MAX_LIST_COLUMNS] = {IDS_LIST_COLUMN_FIRST, IDS_LIST_COLUMN_FIRST + 1, IDS_LIST_COLUMN_FIRST + 2}; static const INT column_widths[MAX_LIST_COLUMNS] = {200, 150, 150}; diff --git a/base/setup/reactos/reactos.c b/base/setup/reactos/reactos.c index 23c659c3d5..7bc0581b9c 100644 --- a/base/setup/reactos/reactos.c +++ b/base/setup/reactos/reactos.c @@ -39,8 +39,6 @@ SETUPDATA SetupData;
/* FUNCTIONS ****************************************************************/
-LONG LoadGenentry(HINF hinf,PCTSTR name,PGENENTRY *gen,PINFCONTEXT context); - static VOID CenterWindow(HWND hWnd) { @@ -112,14 +110,14 @@ StartDlgProc( PSETUPDATA pSetupData;
/* Retrieve pointer to the global setup data */ - pSetupData = (PSETUPDATA)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + pSetupData = (PSETUPDATA)GetWindowLongPtrW(hwndDlg, GWLP_USERDATA);
switch (uMsg) { case WM_INITDIALOG: /* Save pointer to the global setup data */ pSetupData = (PSETUPDATA)((LPPROPSHEETPAGE)lParam)->lParam; - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (DWORD_PTR)pSetupData); + SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (DWORD_PTR)pSetupData);
/* Center the wizard window */ CenterWindow(GetParent(hwndDlg)); @@ -166,22 +164,37 @@ TypeDlgProc( PSETUPDATA pSetupData;
/* Retrieve pointer to the global setup data */ - pSetupData = (PSETUPDATA)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + pSetupData = (PSETUPDATA)GetWindowLongPtrW(hwndDlg, GWLP_USERDATA);
switch (uMsg) { case WM_INITDIALOG: + { /* Save pointer to the global setup data */ pSetupData = (PSETUPDATA)((LPPROPSHEETPAGE)lParam)->lParam; - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (DWORD_PTR)pSetupData); + SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (DWORD_PTR)pSetupData);
/* Check the 'install' radio button */ CheckDlgButton(hwndDlg, IDC_INSTALL, BST_CHECKED);
- /* Disable the 'update' radio button and text */ - EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE), FALSE); - EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATETEXT), FALSE); + /* + * Enable the 'update' radio button and text only if we have + * available NT installations, otherwise disable them. + */ + if (pSetupData->NtOsInstallsList && + GetNumberOfListEntries(pSetupData->NtOsInstallsList) != 0) + { + EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE), TRUE); + EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATETEXT), TRUE); + } + else + { + EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATE), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_UPDATETEXT), FALSE); + } + break; + }
case WM_NOTIFY: { @@ -194,20 +207,38 @@ TypeDlgProc( break;
case PSN_QUERYCANCEL: - SetWindowLongPtr(hwndDlg, - DWLP_MSGRESULT, - MessageBox(GetParent(hwndDlg), - pSetupData->szAbortMessage, - pSetupData->szAbortTitle, - MB_YESNO | MB_ICONQUESTION) != IDYES); + SetWindowLongPtrW(hwndDlg, + DWLP_MSGRESULT, + MessageBoxW(GetParent(hwndDlg), + pSetupData->szAbortMessage, + pSetupData->szAbortTitle, + MB_YESNO | MB_ICONQUESTION) != IDYES); return TRUE;
- case PSN_WIZNEXT: // set the selected data - pSetupData->RepairUpdateFlag = !(SendMessage(GetDlgItem(hwndDlg, IDC_INSTALL), - BM_GETCHECK, - (WPARAM) 0, - (LPARAM) 0) == BST_CHECKED); + case PSN_WIZNEXT: /* Set the selected data */ + { + pSetupData->RepairUpdateFlag = + !(SendMessageW(GetDlgItem(hwndDlg, IDC_INSTALL), + BM_GETCHECK, + 0, 0) == BST_CHECKED); + + /* + * Display the existing NT installations page only + * if we have more than one available NT installations. + */ + if (pSetupData->NtOsInstallsList && + GetNumberOfListEntries(pSetupData->NtOsInstallsList) > 1) + { + /* Actually the best would be to dynamically insert the page only when needed */ + SetWindowLongPtrW(hwndDlg, DWLP_MSGRESULT, IDD_UPDATEREPAIRPAGE); + } + else + { + SetWindowLongPtrW(hwndDlg, DWLP_MSGRESULT, IDD_DEVICEPAGE); + } + return TRUE; + }
default: break; @@ -222,9 +253,187 @@ TypeDlgProc( return FALSE; }
+ + +typedef VOID +(NTAPI *PGET_ENTRY_DESCRIPTION)( + IN PGENERIC_LIST_ENTRY Entry, + OUT PWSTR Buffer, + IN SIZE_T cchBufferSize); + +VOID +InitGenericComboList( + IN HWND hWndList, + IN PGENERIC_LIST List, + IN PGET_ENTRY_DESCRIPTION GetEntryDescriptionProc) +{ + INT Index, CurrentEntryIndex = 0; + PGENERIC_LIST_ENTRY ListEntry; + PLIST_ENTRY Entry; + WCHAR CurrentItemText[256]; + + for (Entry = List->ListHead.Flink; + Entry != &List->ListHead; + Entry = Entry->Flink) + { + ListEntry = CONTAINING_RECORD(Entry, GENERIC_LIST_ENTRY, Entry); + + if (GetEntryDescriptionProc) + { + GetEntryDescriptionProc(ListEntry, + CurrentItemText, + ARRAYSIZE(CurrentItemText)); + Index = SendMessageW(hWndList, CB_ADDSTRING, 0, (LPARAM)CurrentItemText); + } + else + { + Index = SendMessageW(hWndList, CB_ADDSTRING, 0, (LPARAM)L"n/a"); + } + + if (ListEntry == List->CurrentEntry) + CurrentEntryIndex = Index; + + SendMessageW(hWndList, CB_SETITEMDATA, Index, (LPARAM)ListEntry); + } + + SendMessageW(hWndList, CB_SETCURSEL, CurrentEntryIndex, 0); +} + +INT +GetSelectedComboListItem( + IN HWND hWndList) +{ + LRESULT Index; + + Index = SendMessageW(hWndList, CB_GETCURSEL, 0, 0); + if (Index == CB_ERR) + return CB_ERR; + + // TODO: Update List->CurrentEntry? + // return SendMessageW(hWndList, CB_GETITEMDATA, (WPARAM)Index, 0); + return Index; +} + +typedef VOID +(NTAPI *PADD_ENTRY_ITEM)( + IN HWND hWndList, + IN LVITEM* plvItem, + IN PGENERIC_LIST_ENTRY Entry, + IN OUT PWSTR Buffer, + IN SIZE_T cchBufferSize); + +VOID +InitGenericListView( + IN HWND hWndList, + IN PGENERIC_LIST List, + IN PADD_ENTRY_ITEM AddEntryItemProc) +{ + INT CurrentEntryIndex = 0; + LVITEM lvItem; + PGENERIC_LIST_ENTRY ListEntry; + PLIST_ENTRY Entry; + WCHAR CurrentItemText[256]; + + for (Entry = List->ListHead.Flink; + Entry != &List->ListHead; + Entry = Entry->Flink) + { + ListEntry = CONTAINING_RECORD(Entry, GENERIC_LIST_ENTRY, Entry); + + if (!AddEntryItemProc) + continue; + + AddEntryItemProc(hWndList, + &lvItem, + ListEntry, + CurrentItemText, + ARRAYSIZE(CurrentItemText)); + + if (ListEntry == List->CurrentEntry) + CurrentEntryIndex = lvItem.iItem; + } + + SendMessageW(hWndList, LVM_ENSUREVISIBLE, CurrentEntryIndex, FALSE); + ListView_SetItemState(hWndList, CurrentEntryIndex, LVIS_SELECTED, LVIS_SELECTED); + ListView_SetItemState(hWndList, CurrentEntryIndex, LVIS_FOCUSED, LVIS_FOCUSED); +} + + +static VOID +NTAPI +GetSettingDescription( + IN PGENERIC_LIST_ENTRY Entry, + OUT PWSTR Buffer, + IN SIZE_T cchBufferSize) +{ + StringCchCopyW(Buffer, cchBufferSize, + ((PGENENTRY)GetListEntryData(Entry))->Value); +} + +static VOID +NTAPI +AddNTOSInstallationItem( + IN HWND hWndList, + IN LVITEM* plvItem, + IN PGENERIC_LIST_ENTRY Entry, + IN OUT PWSTR Buffer, // SystemRootPath + IN SIZE_T cchBufferSize) +{ + PNTOS_INSTALLATION NtOsInstall = (PNTOS_INSTALLATION)GetListEntryData(Entry); + PPARTENTRY PartEntry = NtOsInstall->PartEntry; + + if (PartEntry && PartEntry->DriveLetter) + { + /* We have retrieved a partition that is mounted */ + StringCchPrintfW(Buffer, cchBufferSize, + L"%C:%s", + PartEntry->DriveLetter, + NtOsInstall->PathComponent); + } + else + { + /* We failed somewhere, just show the NT path */ + StringCchPrintfW(Buffer, cchBufferSize, + L"%wZ", + &NtOsInstall->SystemNtPath); + } + + plvItem->mask = LVIF_IMAGE | LVIF_TEXT | LVIF_PARAM; + plvItem->iItem = 0; + plvItem->iSubItem = 0; + plvItem->lParam = (LPARAM)Entry; + plvItem->pszText = NtOsInstall->InstallationName; + + /* Associate vendor icon */ + if (FindSubStrI(NtOsInstall->VendorName, VENDOR_REACTOS)) + { + plvItem->mask |= LVIF_IMAGE; + plvItem->iImage = 0; + } + else if (FindSubStrI(NtOsInstall->VendorName, VENDOR_MICROSOFT)) + { + plvItem->mask |= LVIF_IMAGE; + plvItem->iImage = 1; + } + + plvItem->iItem = SendMessageW(hWndList, LVM_INSERTITEMW, 0, (LPARAM)plvItem); + + plvItem->iSubItem = 1; + plvItem->pszText = Buffer; // SystemRootPath; + SendMessageW(hWndList, LVM_SETITEMTEXTW, plvItem->iItem, (LPARAM)plvItem); + + plvItem->iSubItem = 2; + plvItem->pszText = NtOsInstall->VendorName; + SendMessageW(hWndList, LVM_SETITEMTEXTW, plvItem->iItem, (LPARAM)plvItem); +} + + +#define IDS_LIST_COLUMN_FIRST IDS_INSTALLATION_NAME +#define IDS_LIST_COLUMN_LAST IDS_INSTALLATION_VENDOR + #define MAX_LIST_COLUMNS (IDS_LIST_COLUMN_LAST - IDS_LIST_COLUMN_FIRST + 1) static const UINT column_ids[MAX_LIST_COLUMNS] = {IDS_LIST_COLUMN_FIRST, IDS_LIST_COLUMN_FIRST + 1, IDS_LIST_COLUMN_FIRST + 2}; -static const INT column_widths[MAX_LIST_COLUMNS] = {200, 150, 150}; +static const INT column_widths[MAX_LIST_COLUMNS] = {200, 150, 100}; static const INT column_alignment[MAX_LIST_COLUMNS] = {LVCFMT_LEFT, LVCFMT_LEFT, LVCFMT_LEFT};
static INT_PTR CALLBACK @@ -236,9 +445,10 @@ UpgradeRepairDlgProc( { PSETUPDATA pSetupData; HWND hList; + HIMAGELIST hSmall;
/* Retrieve pointer to the global setup data */ - pSetupData = (PSETUPDATA)GetWindowLongPtrW(hwndDlg, GWL_USERDATA); + pSetupData = (PSETUPDATA)GetWindowLongPtrW(hwndDlg, GWLP_USERDATA);
switch (uMsg) { @@ -246,9 +456,9 @@ UpgradeRepairDlgProc( { /* Save pointer to the global setup data */ pSetupData = (PSETUPDATA)((LPPROPSHEETPAGE)lParam)->lParam; - SetWindowLongPtrW(hwndDlg, GWL_USERDATA, (DWORD_PTR)pSetupData); + SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (DWORD_PTR)pSetupData);
- hList = GetDlgItem(hwndDlg, IDC_LIST1); + hList = GetDlgItem(hwndDlg, IDC_NTOSLIST);
CreateListViewColumns(pSetupData->hInstance, hList, @@ -257,9 +467,33 @@ UpgradeRepairDlgProc( column_alignment, MAX_LIST_COLUMNS);
+ /* Create the ImageList */ + hSmall = ImageList_Create(GetSystemMetrics(SM_CXSMICON), + GetSystemMetrics(SM_CYSMICON), + ILC_COLOR32 | ILC_MASK, // ILC_COLOR24 + 1, 1); + + /* Add event type icons to the ImageList */ + ImageList_AddIcon(hSmall, LoadIconW(pSetupData->hInstance, MAKEINTRESOURCEW(IDI_ROSICON))); + ImageList_AddIcon(hSmall, LoadIconW(pSetupData->hInstance, MAKEINTRESOURCEW(IDI_WINICON))); + + /* Assign the ImageList to the List View */ + ListView_SetImageList(hList, hSmall, LVSIL_SMALL); + + InitGenericListView(hList, pSetupData->NtOsInstallsList, AddNTOSInstallationItem); + break; }
+ case WM_DESTROY: + { + hList = GetDlgItem(hwndDlg, IDC_NTOSLIST); + hSmall = ListView_GetImageList(hList, LVSIL_SMALL); + ListView_SetImageList(hList, NULL, LVSIL_SMALL); + ImageList_Destroy(hSmall); + return TRUE; + } + case WM_NOTIFY: { LPNMHDR lpnm = (LPNMHDR)lParam; @@ -272,18 +506,18 @@ UpgradeRepairDlgProc(
case PSN_QUERYCANCEL: SetWindowLongPtrW(hwndDlg, - DWL_MSGRESULT, - MessageBox(GetParent(hwndDlg), - pSetupData->szAbortMessage, - pSetupData->szAbortTitle, - MB_YESNO | MB_ICONQUESTION) != IDYES); + DWLP_MSGRESULT, + MessageBoxW(GetParent(hwndDlg), + pSetupData->szAbortMessage, + pSetupData->szAbortTitle, + MB_YESNO | MB_ICONQUESTION) != IDYES); return TRUE;
- case PSN_WIZNEXT: // set the selected data - pSetupData->RepairUpdateFlag = !(SendMessageW(GetDlgItem(hwndDlg, IDC_INSTALL), - BM_GETCHECK, - (WPARAM) 0, - (LPARAM) 0) == BST_CHECKED); + case PSN_WIZNEXT: /* Set the selected data */ + pSetupData->RepairUpdateFlag = + !(SendMessageW(GetDlgItem(hwndDlg, IDC_INSTALL), + BM_GETCHECK, + 0, 0) == BST_CHECKED); return TRUE;
default: @@ -307,47 +541,33 @@ DeviceDlgProc( IN LPARAM lParam) { PSETUPDATA pSetupData; - LONG i; - LRESULT tindex; HWND hList;
/* Retrieve pointer to the global setup data */ - pSetupData = (PSETUPDATA)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + pSetupData = (PSETUPDATA)GetWindowLongPtrW(hwndDlg, GWLP_USERDATA);
switch (uMsg) { case WM_INITDIALOG: + { /* Save pointer to the global setup data */ pSetupData = (PSETUPDATA)((LPPROPSHEETPAGE)lParam)->lParam; - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (DWORD_PTR)pSetupData); + SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (DWORD_PTR)pSetupData);
hList = GetDlgItem(hwndDlg, IDC_COMPUTER); - - for (i=0; i < pSetupData->CompCount; i++) - { - tindex = SendMessage(hList, CB_ADDSTRING, (WPARAM) 0, (LPARAM) pSetupData->pComputers[i].Value); - SendMessage(hList, CB_SETITEMDATA, tindex, i); - } - SendMessage(hList, CB_SETCURSEL, 0, 0); // set first as default + InitGenericComboList(hList, pSetupData->ComputerList, GetSettingDescription);
hList = GetDlgItem(hwndDlg, IDC_DISPLAY); - - for (i=0; i < pSetupData->DispCount; i++) - { - tindex = SendMessage(hList, CB_ADDSTRING, (WPARAM) 0, (LPARAM) pSetupData->pDisplays[i].Value); - SendMessage(hList, CB_SETITEMDATA, tindex, i); - } - SendMessage(hList, CB_SETCURSEL, 0, 0); // set first as default + InitGenericComboList(hList, pSetupData->DisplayList, GetSettingDescription);
hList = GetDlgItem(hwndDlg, IDC_KEYBOARD); + InitGenericComboList(hList, pSetupData->KeyboardList, GetSettingDescription); + + // hList = GetDlgItem(hwndDlg, IDC_KEYBOARD_LAYOUT); + // InitGenericComboList(hList, pSetupData->LayoutList, GetSettingDescription);
- for (i=0; i < pSetupData->KeybCount; i++) - { - tindex = SendMessage(hList,CB_ADDSTRING,(WPARAM)0,(LPARAM)pSetupData->pKeyboards[i].Value); - SendMessage(hList,CB_SETITEMDATA,tindex,i); - } - SendMessage(hList,CB_SETCURSEL,0,0); // set first as default break; + }
case WM_NOTIFY: { @@ -360,48 +580,25 @@ DeviceDlgProc( break;
case PSN_QUERYCANCEL: - SetWindowLongPtr(hwndDlg, - DWLP_MSGRESULT, - MessageBox(GetParent(hwndDlg), - pSetupData->szAbortMessage, - pSetupData->szAbortTitle, - MB_YESNO | MB_ICONQUESTION) != IDYES); + SetWindowLongPtrW(hwndDlg, + DWLP_MSGRESULT, + MessageBoxW(GetParent(hwndDlg), + pSetupData->szAbortMessage, + pSetupData->szAbortTitle, + MB_YESNO | MB_ICONQUESTION) != IDYES); return TRUE;
- case PSN_WIZNEXT: // set the selected data + case PSN_WIZNEXT: /* Set the selected data */ { - hList = GetDlgItem(hwndDlg, IDC_COMPUTER); - - tindex = SendMessage(hList, CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0); - if (tindex != CB_ERR) - { - pSetupData->SelectedComputer = SendMessage(hList, - CB_GETITEMDATA, - (WPARAM) tindex, - (LPARAM) 0); - } + hList = GetDlgItem(hwndDlg, IDC_COMPUTER); + pSetupData->SelectedComputer = GetSelectedComboListItem(hList);
hList = GetDlgItem(hwndDlg, IDC_DISPLAY); + pSetupData->SelectedDisplay = GetSelectedComboListItem(hList);
- tindex = SendMessage(hList, CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0); - if (tindex != CB_ERR) - { - pSetupData->SelectedDisplay = SendMessage(hList, - CB_GETITEMDATA, - (WPARAM) tindex, - (LPARAM) 0); - } + hList = GetDlgItem(hwndDlg, IDC_KEYBOARD); + pSetupData->SelectedKeyboard = GetSelectedComboListItem(hList);
- hList =GetDlgItem(hwndDlg, IDC_KEYBOARD); - - tindex = SendMessage(hList, CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0); - if (tindex != CB_ERR) - { - pSetupData->SelectedKeyboard = SendMessage(hList, - CB_GETITEMDATA, - (WPARAM) tindex, - (LPARAM) 0); - } return TRUE; }
@@ -428,14 +625,14 @@ SummaryDlgProc( PSETUPDATA pSetupData;
/* Retrieve pointer to the global setup data */ - pSetupData = (PSETUPDATA)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + pSetupData = (PSETUPDATA)GetWindowLongPtrW(hwndDlg, GWLP_USERDATA);
switch (uMsg) { case WM_INITDIALOG: /* Save pointer to the global setup data */ pSetupData = (PSETUPDATA)((LPPROPSHEETPAGE)lParam)->lParam; - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (DWORD_PTR)pSetupData); + SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (DWORD_PTR)pSetupData); break;
case WM_NOTIFY: @@ -444,18 +641,19 @@ SummaryDlgProc(
switch (lpnm->code) { - case PSN_SETACTIVE: + case PSN_SETACTIVE: PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT | PSWIZB_BACK); break;
case PSN_QUERYCANCEL: - SetWindowLongPtr(hwndDlg, - DWLP_MSGRESULT, - MessageBox(GetParent(hwndDlg), - pSetupData->szAbortMessage, - pSetupData->szAbortTitle, - MB_YESNO | MB_ICONQUESTION) != IDYES); + SetWindowLongPtrW(hwndDlg, + DWLP_MSGRESULT, + MessageBoxW(GetParent(hwndDlg), + pSetupData->szAbortMessage, + pSetupData->szAbortTitle, + MB_YESNO | MB_ICONQUESTION) != IDYES); return TRUE; + default: break; } @@ -479,14 +677,14 @@ ProcessDlgProc( PSETUPDATA pSetupData;
/* Retrieve pointer to the global setup data */ - pSetupData = (PSETUPDATA)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + pSetupData = (PSETUPDATA)GetWindowLongPtrW(hwndDlg, GWLP_USERDATA);
switch (uMsg) { case WM_INITDIALOG: /* Save pointer to the global setup data */ pSetupData = (PSETUPDATA)((LPPROPSHEETPAGE)lParam)->lParam; - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (DWORD_PTR)pSetupData); + SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (DWORD_PTR)pSetupData); break;
case WM_NOTIFY: @@ -501,13 +699,14 @@ ProcessDlgProc( // PropSheet_SetWizButtons(GetParent(hwndDlg), 0 ); break; case PSN_QUERYCANCEL: - SetWindowLongPtr(hwndDlg, - DWLP_MSGRESULT, - MessageBox(GetParent(hwndDlg), - pSetupData->szAbortMessage, - pSetupData->szAbortTitle, - MB_YESNO | MB_ICONQUESTION) != IDYES); + SetWindowLongPtrW(hwndDlg, + DWLP_MSGRESULT, + MessageBoxW(GetParent(hwndDlg), + pSetupData->szAbortMessage, + pSetupData->szAbortTitle, + MB_YESNO | MB_ICONQUESTION) != IDYES); return TRUE; + default: break; } @@ -532,14 +731,14 @@ RestartDlgProc( PSETUPDATA pSetupData;
/* Retrieve pointer to the global setup data */ - pSetupData = (PSETUPDATA)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + pSetupData = (PSETUPDATA)GetWindowLongPtrW(hwndDlg, GWLP_USERDATA);
switch (uMsg) { case WM_INITDIALOG: /* Save pointer to the global setup data */ pSetupData = (PSETUPDATA)((LPPROPSHEETPAGE)lParam)->lParam; - SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (DWORD_PTR)pSetupData); + SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (DWORD_PTR)pSetupData);
/* Set title font */ /*SendDlgItemMessage(hwndDlg, @@ -555,7 +754,7 @@ RestartDlgProc( HWND hWndProgress;
hWndProgress = GetDlgItem(hwndDlg, IDC_RESTART_PROGRESS); - Position = SendMessage(hWndProgress, PBM_GETPOS, 0, 0); + Position = SendMessageW(hWndProgress, PBM_GETPOS, 0, 0); if (Position == 300) { KillTimer(hwndDlg, 1); @@ -563,7 +762,7 @@ RestartDlgProc( } else { - SendMessage(hWndProgress, PBM_SETPOS, Position + 1, 0); + SendMessageW(hWndProgress, PBM_SETPOS, Position + 1, 0); } return TRUE; } @@ -602,78 +801,34 @@ BOOL LoadSetupData( IN OUT PSETUPDATA pSetupData) { BOOL ret = TRUE; - INFCONTEXT InfContext; - TCHAR tmp[10]; - //TCHAR szValue[MAX_PATH]; - DWORD LineLength; - LONG Count; - - // get language list - pSetupData->LangCount = SetupGetLineCount(pSetupData->SetupInf, _T("Language")); - if (pSetupData->LangCount > 0) - { - pSetupData->pLanguages = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(LANG) * pSetupData->LangCount); - if (pSetupData->pLanguages == NULL) - { - ret = FALSE; - goto done; - } + // INFCONTEXT InfContext; + // TCHAR tmp[10]; + // DWORD LineLength; + // LONG Count;
- Count = 0; - if (SetupFindFirstLine(pSetupData->SetupInf, _T("Language"), NULL, &InfContext)) - { - do - { - SetupGetStringField(&InfContext, - 0, - pSetupData->pLanguages[Count].LangId, - sizeof(pSetupData->pLanguages[Count].LangId) / sizeof(TCHAR), - &LineLength); - - SetupGetStringField(&InfContext, - 1, - pSetupData->pLanguages[Count].LangName, - sizeof(pSetupData->pLanguages[Count].LangName) / sizeof(TCHAR), - &LineLength); - ++Count; - } - while (SetupFindNextLine(&InfContext, &InfContext) && Count < pSetupData->LangCount); - } - } + /* Load the hardware, language and keyboard layout lists */
- // get keyboard layout list - pSetupData->KbLayoutCount = SetupGetLineCount(pSetupData->SetupInf, _T("KeyboardLayout")); - if (pSetupData->KbLayoutCount > 0) - { - pSetupData->pKbLayouts = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(KBLAYOUT) * pSetupData->KbLayoutCount); - if (pSetupData->pKbLayouts == NULL) - { - ret = FALSE; - goto done; - } + pSetupData->ComputerList = CreateComputerTypeList(pSetupData->SetupInf); + pSetupData->DisplayList = CreateDisplayDriverList(pSetupData->SetupInf); + pSetupData->KeyboardList = CreateKeyboardDriverList(pSetupData->SetupInf);
- Count = 0; - if (SetupFindFirstLine(pSetupData->SetupInf, _T("KeyboardLayout"), NULL, &InfContext)) - { - do - { - SetupGetStringField(&InfContext, - 0, - pSetupData->pKbLayouts[Count].LayoutId, - sizeof(pSetupData->pKbLayouts[Count].LayoutId) / sizeof(TCHAR), - &LineLength); - - SetupGetStringField(&InfContext, - 1, - pSetupData->pKbLayouts[Count].LayoutName, - sizeof(pSetupData->pKbLayouts[Count].LayoutName) / sizeof(TCHAR), - &LineLength); - ++Count; - } - while (SetupFindNextLine(&InfContext, &InfContext) && Count < pSetupData->KbLayoutCount); - } - } + pSetupData->LanguageList = CreateLanguageList(pSetupData->SetupInf, pSetupData->DefaultLanguage); + + pSetupData->PartitionList = CreatePartitionList(); + + pSetupData->NtOsInstallsList = CreateNTOSInstallationsList(pSetupData->PartitionList); + if (!pSetupData->NtOsInstallsList) + DPRINT1("Failed to get a list of NTOS installations; continue installation...\n"); + + + /* new part */ + pSetupData->SelectedLanguageId = pSetupData->DefaultLanguage; + wcscpy(pSetupData->DefaultLanguage, pSetupData->USetupData.LocaleID); + pSetupData->USetupData.LanguageId = (LANGID)(wcstol(pSetupData->SelectedLanguageId, NULL, 16) & 0xFFFF); + + pSetupData->LayoutList = CreateKeyboardLayoutList(pSetupData->SetupInf, pSetupData->SelectedLanguageId, pSetupData->DefaultKBLayout);
+#if 0 // get default for keyboard and language pSetupData->DefaultKBLayout = -1; pSetupData->DefaultLang = -1; @@ -681,7 +836,7 @@ BOOL LoadSetupData( // TODO: get defaults from underlaying running system if (SetupFindFirstLine(pSetupData->SetupInf, _T("NLS"), _T("DefaultLayout"), &InfContext)) { - SetupGetStringField(&InfContext, 1, tmp, sizeof(tmp) / sizeof(TCHAR), &LineLength); + SetupGetStringField(&InfContext, 1, tmp, ARRAYSIZE(tmp), &LineLength); for (Count = 0; Count < pSetupData->KbLayoutCount; Count++) { if (_tcscmp(tmp, pSetupData->pKbLayouts[Count].LayoutId) == 0) @@ -694,7 +849,7 @@ BOOL LoadSetupData(
if (SetupFindFirstLine(pSetupData->SetupInf, _T("NLS"), _T("DefaultLanguage"), &InfContext)) { - SetupGetStringField(&InfContext, 1, tmp, sizeof(tmp) / sizeof(TCHAR), &LineLength); + SetupGetStringField(&InfContext, 1, tmp, ARRAYSIZE(tmp), &LineLength); for (Count = 0; Count < pSetupData->LangCount; Count++) { if (_tcscmp(tmp, pSetupData->pLanguages[Count].LangId) == 0) @@ -704,82 +859,11 @@ BOOL LoadSetupData( } } } - - // get computers list - pSetupData->CompCount = LoadGenentry(pSetupData->SetupInf,_T("Computer"),&pSetupData->pComputers,&InfContext); - - // get display list - pSetupData->DispCount = LoadGenentry(pSetupData->SetupInf,_T("Display"),&pSetupData->pDisplays,&InfContext); - - // get keyboard list - pSetupData->KeybCount = LoadGenentry(pSetupData->SetupInf, _T("Keyboard"),&pSetupData->pKeyboards,&InfContext); - - // get install directory - if (SetupFindFirstLine(pSetupData->SetupInf, _T("SetupData"), _T("DefaultPath"), &InfContext)) - { - SetupGetStringField(&InfContext, - 1, - pSetupData->USetupData.InstallationDirectory, - sizeof(pSetupData->USetupData.InstallationDirectory) / sizeof(TCHAR), - &LineLength); - } - -done: - if (ret == FALSE) - { - if (pSetupData->pKbLayouts != NULL) - { - HeapFree(GetProcessHeap(), 0, pSetupData->pKbLayouts); - pSetupData->pKbLayouts = NULL; - } - - if (pSetupData->pLanguages != NULL) - { - HeapFree(GetProcessHeap(), 0, pSetupData->pLanguages); - pSetupData->pLanguages = NULL; - } - } +#endif
return ret; }
-LONG LoadGenentry(HINF hinf,PCTSTR name,PGENENTRY *gen,PINFCONTEXT context) -{ - LONG TotalCount; - DWORD LineLength; - - TotalCount = SetupGetLineCount(hinf, name); - if (TotalCount > 0) - { - *gen = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(GENENTRY) * TotalCount); - if (*gen != NULL) - { - if (SetupFindFirstLine(hinf, name, NULL, context)) - { - LONG Count = 0; - do - { - SetupGetStringField(context, - 0, - (*gen)[Count].Id, - sizeof((*gen)[Count].Id) / sizeof(TCHAR), - &LineLength); - - SetupGetStringField(context, - 1, - (*gen)[Count].Value, - sizeof((*gen)[Count].Value) / sizeof(TCHAR), - &LineLength); - ++Count; - } - while (SetupFindNextLine(context, context) && Count < TotalCount); - } - } - else return 0; - } - return TotalCount; -} - /* * Attempts to convert a pure NT file path into a corresponding Win32 path. * Adapted from GetInstallSourceWin32() in dll/win32/syssetup/wizard.c @@ -866,6 +950,7 @@ _tWinMain(HINSTANCE hInst, { NTSTATUS Status; ULONG Error; + INITCOMMONCONTROLSEX iccx; PROPSHEETHEADER psh; HPROPSHEETPAGE ahpsp[8]; PROPSHEETPAGE psp = {0}; @@ -920,9 +1005,17 @@ _tWinMain(HINSTANCE hInst, CheckUnattendedSetup(&SetupData.USetupData); SetupData.bUnattend = IsUnattendedSetup;
+ /* Cache commonly-used strings */ LoadStringW(hInst, IDS_ABORTSETUP, SetupData.szAbortMessage, ARRAYSIZE(SetupData.szAbortMessage)); LoadStringW(hInst, IDS_ABORTSETUP2, SetupData.szAbortTitle, ARRAYSIZE(SetupData.szAbortTitle));
+ /* Whenever any of the common controls are used in your app, + * you must call InitCommonControlsEx() to register the classes + * for those controls. */ + iccx.dwSize = sizeof(iccx); + iccx.dwICC = ICC_LISTVIEW_CLASSES | ICC_TREEVIEW_CLASSES /* | ICC_PROGRESS_CLASS */; + InitCommonControlsEx(&iccx); + /* Create title font */ SetupData.hTitleFont = CreateTitleFont();
diff --git a/base/setup/reactos/reactos.h b/base/setup/reactos/reactos.h index a27eea12a4..760b62708a 100644 --- a/base/setup/reactos/reactos.h +++ b/base/setup/reactos/reactos.h @@ -40,10 +40,11 @@ #include <wingdi.h> #include <winuser.h>
+#include <strsafe.h> + #include <commctrl.h> /**/#include <setupapi.h>/**/ #include <devguid.h> -// #include <wine/unicode.h>
#define NTOS_MODE_USER #include <ndk/cmtypes.h> // For CM_DISK stuff @@ -56,26 +57,14 @@ #include <../lib/setuplib.h> // #include "errorcode.h"
- -typedef struct _LANG -{ - TCHAR LangId[9]; - TCHAR LangName[128]; -} LANG, *PLANG; - +#if 0 typedef struct _KBLAYOUT { TCHAR LayoutId[9]; TCHAR LayoutName[128]; TCHAR DllName[128]; } KBLAYOUT, *PKBLAYOUT; - -// generic entries with simple 1:1 mapping -typedef struct _GENENTRY -{ - TCHAR Id[24]; - TCHAR Value[128]; -} GENENTRY, *PGENENTRY; +#endif
typedef struct _SETUPDATA @@ -92,7 +81,7 @@ typedef struct _SETUPDATA USETUP_DATA USetupData; HINF SetupInf;
- // Settings + /* Settings */ LONG DestPartSize; // if partition doesn't exist, size of partition LONG FSType; // file system type on partition LONG FormatPart; // type of format the partition @@ -106,26 +95,10 @@ typedef struct _SETUPDATA BOOLEAN RepairUpdateFlag; // flag for update/repair an installed reactos
- // txtsetup.sif data -#if 1 - LONG DefaultLang; // default language (table index) - PLANG pLanguages; - LONG LangCount; - LONG DefaultKBLayout; // default keyboard layout (table index) - PKBLAYOUT pKbLayouts; - LONG KbLayoutCount; - PGENENTRY pComputers; - LONG CompCount; - PGENENTRY pDisplays; - LONG DispCount; - PGENENTRY pKeyboards; - LONG KeybCount; - -#else - + /* txtsetup.sif data */ // LONG DefaultLang; // default language (table index) // LONG DefaultKBLayout; // default keyboard layout (table index) - PWCHAR SelectedLanguageId; + PCWSTR SelectedLanguageId; WCHAR DefaultLanguage[20]; // Copy of string inside LanguageList WCHAR DefaultKBLayout[20]; // Copy of string inside KeyboardList
@@ -138,7 +111,6 @@ typedef struct _SETUPDATA PPARTLIST PartitionList; PNTOS_INSTALLATION CurrentInstallation; PGENERIC_LIST NtOsInstallsList; -#endif
} SETUPDATA, *PSETUPDATA;
diff --git a/base/setup/reactos/reactos.rc b/base/setup/reactos/reactos.rc index e20f4a6ab0..a1f7ac5eab 100644 --- a/base/setup/reactos/reactos.rc +++ b/base/setup/reactos/reactos.rc @@ -12,7 +12,9 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
/* Icons */ -IDI_MAIN ICON "res/setup.ico" +IDI_MAIN ICON "res/setup.ico" +IDI_ROSICON ICON "res/roslogo.ico" +IDI_WINICON ICON "res/winlogo.ico"
/* Bitmaps */ IDB_WATERMARK BITMAP "res/watermark.bmp" diff --git a/base/setup/reactos/res/README.txt b/base/setup/reactos/res/README.txt new file mode 100644 index 0000000000..54c0b111c4 --- /dev/null +++ b/base/setup/reactos/res/README.txt @@ -0,0 +1,12 @@ + +roslogo.ico +----------- +(C) 2018 ReactOS Team & Contributors +Distributed under CC-BY-SA 4.0 International License Terms. + +winlogo.ico +----------- +Adapted from the WinTango IconPack, by 'heebijeebi' +See http://heebijeebi.deviantart.com and http://wintango.blogspot.com/ +Distributed under CC-BY-SA 3.0 International License Terms. +Slightly modified by Hermès Bélusca-Maïto. diff --git a/base/setup/reactos/res/roslogo.ico b/base/setup/reactos/res/roslogo.ico new file mode 100644 index 0000000000..d2f5b86308 Binary files /dev/null and b/base/setup/reactos/res/roslogo.ico differ diff --git a/base/setup/reactos/res/roslogo_2.ico b/base/setup/reactos/res/roslogo_2.ico new file mode 100644 index 0000000000..2d73e1eba7 Binary files /dev/null and b/base/setup/reactos/res/roslogo_2.ico differ diff --git a/base/setup/reactos/res/winlogo.ico b/base/setup/reactos/res/winlogo.ico new file mode 100644 index 0000000000..ab8632d566 Binary files /dev/null and b/base/setup/reactos/res/winlogo.ico differ diff --git a/base/setup/reactos/resource.h b/base/setup/reactos/resource.h index 05ea086801..0cfb9897ae 100644 --- a/base/setup/reactos/resource.h +++ b/base/setup/reactos/resource.h @@ -6,6 +6,8 @@
/* Icons */ #define IDI_MAIN 3000 +#define IDI_ROSICON 3001 +#define IDI_WINICON 3002
#define IDC_STATIC -1 @@ -84,6 +86,3 @@ #define IDS_PARTITION_NAME 5200 #define IDS_PARTITION_SIZE 5201 #define IDS_PARTITION_TYPE 5202 - -#define IDS_LIST_COLUMN_FIRST IDS_PARTITION_NAME -#define IDS_LIST_COLUMN_LAST IDS_PARTITION_TYPE