diff --git a/res/localization/rufus.loc b/res/localization/rufus.loc index f17c7456..c32ae2aa 100644 --- a/res/localization/rufus.loc +++ b/res/localization/rufus.loc @@ -280,11 +280,11 @@ t MSG_084 "This ISO image seems to use an obsolete version of '%s'.\n" "Note: The new file will be downloaded in the current directory and once a " "'%s' exists there, it will be reused automatically." t MSG_085 "Downloading '%s'" -t MSG_086 "No image selected" +#t MSG_086 "No image selected" # The content between the quotes below (\"Create a bootable disk\") should match # the beginning of the IDC_BOOT text -t MSG_087 "Please click on the disc button to select a bootable image, " - "or uncheck the \"Create a bootable disk using\" checkbox." +#t MSG_087 "Please click on the disc button to select a bootable image, " +# "or uncheck the \"Create a bootable disk using\" checkbox." t MSG_088 "Image is too big" t MSG_089 "The image is too big for the selected target." t MSG_090 "Unsupported ISO" @@ -359,13 +359,10 @@ t MSG_116 "This image uses Grub %s but the application only includes the install "Note: The file will be downloaded in the current application directory and will be reused " "automatically if present. If no match can be found online, then the default version will be used." # Tooltips -# Partition Scheme and Target Type -t MSG_150 "Usually the safest choice. However, if you have an UEFI computer and want to install " - "an Operating System in native EFI mode, you should select one of the other options" -t MSG_151 "Use this if you want to install an Operating System in native EFI mode, but will need " - "to access the USB content from Windows XP" -t MSG_152 "The preferred option to install an Operating System in native EFI mode, when USB access " - "is not required from Windows XP" +t MSG_150 "Method that will be used to create partitions." +t MSG_151 "Type of computer you plan to use this bootable drive with. It is up to YOU to find whether your target is of BIOS or UEFI type.\n" + "Be mindful that CSM, which can be enabled or disabled on UEFI computers, means 'BIOS emulation', and is not really UEFI." +t MSG_152 "Note: 'UEFI-CSM' means BIOS emulation under UEFI, and is not the same as genuine UEFI." t MSG_153 "Test pattern: 0x%02X" t MSG_154 "Test pattern: 0x%02X, 0x%02X" t MSG_155 "Test pattern: 0x%02X, 0x%02X, 0x%02X" diff --git a/src/checksum.c b/src/checksum.c index be70c5c6..3bd094c9 100644 --- a/src/checksum.c +++ b/src/checksum.c @@ -835,8 +835,6 @@ INT_PTR CALLBACK ChecksumCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM case IDCANCEL: reset_localization(IDD_CHECKSUM); EndDialog(hDlg, LOWORD(wParam)); - // Reset focus to our toolbar - PostMessage(hMainDialog, WM_NEXTDLGCTL, (WPARAM)hStatusToolbar, TRUE); return (INT_PTR)TRUE; } } diff --git a/src/format.c b/src/format.c index 422c9c53..ca82e1b6 100644 --- a/src/format.c +++ b/src/format.c @@ -61,7 +61,7 @@ static int task_number = 0; extern const int nb_steps[FS_MAX]; extern uint32_t dur_mins, dur_secs; static int fs_index = 0, wintogo_index = -1; -extern BOOL force_large_fat32, enable_ntfs_compression, lock_drive, zero_drive, disable_file_indexing; +extern BOOL force_large_fat32, enable_ntfs_compression, lock_drive, zero_drive, disable_file_indexing, write_as_image; uint8_t *grub2_buf = NULL; long grub2_len; static BOOL WritePBR(HANDLE hLogicalDrive); @@ -1654,8 +1654,6 @@ DWORD WINAPI FormatThread(void* param) char efi_dst[] = "?:\\efi\\boot\\bootx64.efi"; char kolibri_dst[] = "?:\\MTLD_F32"; char grub4dos_dst[] = "?:\\grldr"; - // TODO: Have a boolean to indicate DD writing - BOOL write_as_image = FALSE; use_large_fat32 = (fs == FS_FAT32) && ((SelectedDrive.DiskSize > LARGE_FAT32_SIZE) || (force_large_fat32)); windows_to_go = (togo_mode) && HAS_WINTOGO(img_report) && (Button_GetCheck(GetDlgItem(hMainDialog, IDC_WINDOWS_TO_GO)) == BST_CHECKED); diff --git a/src/localization.c b/src/localization.c index 17751ae7..da2076eb 100644 --- a/src/localization.c +++ b/src/localization.c @@ -390,7 +390,7 @@ char* lmprintf(uint32_t msg_id, ...) buf[buf_id][0] = 0; msg_id &= MSG_MASK; - if ((msg_id > MSG_000) && (msg_id < MSG_MAX)) { + if ((msg_id >= MSG_000) && (msg_id < MSG_MAX)) { format = msg_table[msg_id - MSG_000]; } @@ -518,7 +518,7 @@ void PrintStatusInfo(BOOL info, BOOL debug, unsigned int duration, int msg_id, . if (!info) szStatusMessage = szMessage[MSG_STATUS][(duration > 0)?MSG_LOW_PRI:MSG_HIGH_PRI]; - if ((msg_id > MSG_000) && (msg_id < MSG_MAX)) + if ((msg_id >= MSG_000) && (msg_id < MSG_MAX)) format = msg_table[msg_id - MSG_000]; if (format == NULL) { safe_sprintf(msg_hi, MSG_LEN, "MSG_%03d UNTRANSLATED", msg_id - MSG_000); diff --git a/src/localization_data.h b/src/localization_data.h index cf146afd..ecba7838 100644 --- a/src/localization_data.h +++ b/src/localization_data.h @@ -54,8 +54,6 @@ const loc_control_id control_id[] = { LOC_CTRL(IDC_EXTENDED_LABEL), LOC_CTRL(IDC_RUFUS_MBR), LOC_CTRL(IDC_TARGET_SYSTEM), - LOC_CTRL(IDC_INFO), - LOC_CTRL(IDC_LANG), LOC_CTRL(IDC_DISK_ID), LOC_CTRL(IDC_OLD_BIOS_FIXES), LOC_CTRL(IDC_LIST_USB_HDD), @@ -73,12 +71,14 @@ const loc_control_id control_id[] = { LOC_CTRL(IDC_NOTIFICATION_LINE), LOC_CTRL(IDC_ADVANCED_DEVICE_TOOLBAR), LOC_CTRL(IDC_ADVANCED_FORMAT_TOOLBAR), - LOC_CTRL(IDC_ABOUT), - LOC_CTRL(IDC_LOG), LOC_CTRL(IDC_WINDOWS_INSTALL), LOC_CTRL(IDC_WINDOWS_TO_GO), + LOC_CTRL(IDC_CHECKSUM_TOOLBAR), LOC_CTRL(IDC_MULTI_TOOLBAR), + LOC_CTRL(IDC_LANG), + LOC_CTRL(IDC_ABOUT), LOC_CTRL(IDC_SETTINGS), + LOC_CTRL(IDC_LOG), LOC_CTRL(IDC_LOG_EDIT), LOC_CTRL(IDC_LOG_SAVE), LOC_CTRL(IDC_LOG_CLEAR), @@ -141,6 +141,7 @@ const loc_control_id control_id[] = { LOC_CTRL(IDS_FILESYSTEM_TXT), LOC_CTRL(IDS_CLUSTERSIZE_TXT), LOC_CTRL(IDS_LABEL_TXT), + LOC_CTRL(IDS_CSM_HELP_TXT), LOC_CTRL(IDS_UPDATE_SETTINGS_GRP), LOC_CTRL(IDS_UPDATE_FREQUENCY_TXT), LOC_CTRL(IDS_INCLUDE_BETAS_TXT), diff --git a/src/resource.h b/src/resource.h index 7405cefa..d4ce3be4 100644 --- a/src/resource.h +++ b/src/resource.h @@ -90,7 +90,6 @@ #define IDC_EXTENDED_LABEL 1015 #define IDC_RUFUS_MBR 1016 #define IDC_TARGET_SYSTEM 1017 -#define IDC_INFO 1018 #define IDC_DISK_ID 1020 #define IDC_OLD_BIOS_FIXES 1021 #define IDC_LIST_USB_HDD 1022 @@ -178,6 +177,7 @@ #define IDS_FILESYSTEM_TXT 2002 #define IDS_CLUSTERSIZE_TXT 2003 #define IDS_LABEL_TXT 2004 +#define IDS_CSM_HELP_TXT 2005 #define IDS_UPDATE_SETTINGS_GRP 2006 #define IDS_UPDATE_FREQUENCY_TXT 2007 #define IDS_INCLUDE_BETAS_TXT 2008 diff --git a/src/rufus.c b/src/rufus.c index 3646ee02..d85da903 100644 --- a/src/rufus.c +++ b/src/rufus.c @@ -53,6 +53,7 @@ static int image_option_move_ids[] = { IDC_PARTITION_TYPE, IDS_TARGET_SYSTEM_TXT, IDC_TARGET_SYSTEM, + IDS_CSM_HELP_TXT, IDC_ADVANCED_DEVICE_TOOLBAR, IDC_LIST_USB_HDD, IDC_OLD_BIOS_FIXES, @@ -72,7 +73,6 @@ static int image_option_move_ids[] = { IDC_EXTENDED_LABEL, IDS_STATUS_TXT, IDC_PROGRESS, - IDC_INFO, IDC_ABOUT, IDC_LOG, IDC_MULTI_TOOLBAR, @@ -106,7 +106,6 @@ static int advanced_device_move_ids[] = { IDC_EXTENDED_LABEL, IDS_STATUS_TXT, IDC_PROGRESS, - IDC_INFO, IDC_ABOUT, IDC_LOG, IDC_MULTI_TOOLBAR, @@ -128,7 +127,6 @@ static int advanced_device_toggle_ids[] = { static int advanced_format_move_ids[] = { IDS_STATUS_TXT, IDC_PROGRESS, - IDC_INFO, IDC_ABOUT, IDC_LOG, IDC_MULTI_TOOLBAR, @@ -146,6 +144,18 @@ static int advanced_format_toggle_ids[] = { IDC_EXTENDED_LABEL, }; +static int dd_image_toggle_ids[] = { + IDC_QUICKFORMAT, + IDC_PARTITION_TYPE, + IDC_TARGET_SYSTEM, + IDC_IMAGE_OPTION, + IDC_FILESYSTEM, + IDC_CLUSTERSIZE, + IDC_LABEL, + IDC_QUICKFORMAT, + IDC_EXTENDED_LABEL, +}; + static const char* cmdline_hogger = "rufus.com"; static const char* FileSystemLabel[FS_MAX] = { "FAT", "FAT32", "NTFS", "UDF", "exFAT", "ReFS" }; static const char* ep_reg = "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer"; @@ -171,7 +181,6 @@ static UINT_PTR UM_LANGUAGE_MENU_MAX = UM_LANGUAGE_MENU; static RECT relaunch_rc = { -65536, -65536, 0, 0}; static UINT uQFChecked = BST_CHECKED, uMBRChecked = BST_UNCHECKED; static HFONT hInfoFont, hLinkFont; -static HBRUSH hInfoBrush; static WNDPROC progress_original_proc = NULL; static HANDLE format_thid = NULL, dialog_handle = NULL; static HWND hSelectImage = NULL, hStart = NULL; @@ -205,12 +214,12 @@ loc_cmd* selected_locale = NULL; WORD selected_langid = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT); DWORD MainThreadId; HWND hDeviceList, hPartitionScheme, hTargetSystem, hFileSystem, hClusterSize, hLabel, hBootType, hNBPasses, hLog = NULL; -HWND hLogDlg = NULL, hProgress = NULL, hDiskID, hStatusToolbar; +HWND hLogDlg = NULL, hProgress = NULL, hDiskID; BOOL use_own_c32[NB_OLD_C32] = {FALSE, FALSE}, mbr_selected_by_user = FALSE, togo_mode = FALSE; -BOOL iso_op_in_progress = FALSE, format_op_in_progress = FALSE, right_to_left_mode = FALSE, progress_in_use = FALSE; +BOOL iso_op_in_progress = FALSE, format_op_in_progress = FALSE, right_to_left_mode = FALSE, progress_in_use = FALSE, has_uefi_csm; BOOL enable_HDDs = FALSE, force_update = FALSE, enable_ntfs_compression = FALSE, no_confirmation_on_cancel = FALSE, lock_drive = TRUE; BOOL advanced_mode_device, advanced_mode_format, allow_dual_uefi_bios, detect_fakes, enable_vmdk, force_large_fat32, usb_debug, use_fake_units, preserve_timestamps; -BOOL zero_drive = FALSE, list_non_usb_removable_drives = FALSE, disable_file_indexing, large_drive = FALSE; +BOOL zero_drive = FALSE, list_non_usb_removable_drives = FALSE, disable_file_indexing, large_drive = FALSE, write_as_image = FALSE; int dialog_showing = 0; uint16_t rufus_version[3], embedded_sl_version[2]; char embedded_sl_version_str[2][12] = { "?.??", "?.??" }; @@ -343,8 +352,10 @@ static void SetBootOptions(void) static void SetPartitionSchemeAndTargetSystem(BOOL only_target) { + // MBR, GPT, SFD BOOL allowed_partition_scheme[3] = { TRUE, TRUE, FALSE }; - BOOL allowed_target_system[3] = { TRUE, TRUE, FALSE }; + // BIOS, UEFI, DUAL + BOOL allowed_target_system[3] = { TRUE, TRUE, FALSE }; BOOL dual_boot = FALSE; // TODO: Windows To Go selected BOOL is_windows_to_go_selected = FALSE; @@ -354,6 +365,9 @@ static void SetPartitionSchemeAndTargetSystem(BOOL only_target) IGNORE_RETVAL(ComboBox_ResetContent(hTargetSystem)); bt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType)); + // If no device is selected, don't populate anything + if (ComboBox_GetCurSel(hDeviceList) < 0) + return; switch (bt) { case BT_NON_BOOTABLE: allowed_partition_scheme[PARTITION_STYLE_SFD] = TRUE; @@ -410,17 +424,21 @@ static void SetPartitionSchemeAndTargetSystem(BOOL only_target) pt = (int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme)); } - if (allowed_target_system[0] && (pt != PARTITION_STYLE_GPT)) + has_uefi_csm = FALSE; + if (allowed_target_system[0] && (pt != PARTITION_STYLE_GPT)) { IGNORE_RETVAL(ComboBox_SetItemData(hTargetSystem, ComboBox_AddStringU(hTargetSystem, lmprintf(MSG_031)), TT_BIOS)); + has_uefi_csm = TRUE; + } if (allowed_target_system[1] && !((pt == PARTITION_STYLE_MBR) && IS_BIOS_BOOTABLE(img_report) && IS_EFI_BOOTABLE(img_report)) ) IGNORE_RETVAL(ComboBox_SetItemData(hTargetSystem, ComboBox_AddStringU(hTargetSystem, lmprintf(MSG_032)), TT_UEFI)); - if (allowed_target_system[2] && (pt != PARTITION_STYLE_GPT)) + if (allowed_target_system[2] && ((pt != PARTITION_STYLE_GPT) || (bt == BT_NON_BOOTABLE))) IGNORE_RETVAL(ComboBox_SetItemData(hTargetSystem, ComboBox_AddStringU(hTargetSystem, lmprintf(MSG_033)), TT_BIOS)); IGNORE_RETVAL(ComboBox_SetCurSel(hTargetSystem, 0)); tt = (int)ComboBox_GetItemData(hTargetSystem, ComboBox_GetCurSel(hTargetSystem)); + ShowWindow(GetDlgItem(hMainDialog, IDS_CSM_HELP_TXT), has_uefi_csm ? SW_SHOW : SW_HIDE); } // Populate the Allocation unit size field @@ -612,7 +630,6 @@ static BOOL SetFileSystemAndClusterSize(char* fs_type) } } - // TODO: get fs_type from // re-select existing FS if it's one we know SelectedDrive.FSType = FS_UNKNOWN; if (safe_strlen(fs_type) != 0) { @@ -637,51 +654,9 @@ static BOOL SetFileSystemAndClusterSize(char* fs_type) SetComboEntry(hFileSystem, default_fs); } - // TODO - // At least one filesystem is go => enable formatting - // EnableWindow(hStart, TRUE); - return SetClusterSizes((int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem))); } - -// This call sets the options for "Partition Scheme" and "Target System" -// according to whether we will be running in UEFI/CSM mode or standard UEFI -// Return value is -1 if the image is pure EFI (non BIOS bootable), 0 otherwise. -//static int SetMBRForUEFI(void) -//{ -// static BOOL pure_efi = FALSE; -// BOOL useCSM = FALSE; -// -// if (ComboBox_GetCurSel(hDeviceList) < 0) -// return 0; -// -// if (image_path != NULL) { -// if ( !IS_EFI_BOOTABLE(img_report) || (HAS_BOOTMGR(img_report) && (!allow_dual_uefi_bios) && -// (Button_GetCheck(GetDlgItem(hMainDialog, IDC_WINDOWS_TO_GO)) != BST_CHECKED)) ) -// useCSM = TRUE; -// } -// -// if ((image_path != NULL) && IS_EFI_BOOTABLE(img_report) && !IS_BIOS_BOOTABLE(img_report)) { -// pure_efi = TRUE; -// // Pure EFI -> no need to add the BIOS option -// return -1; -// } -// -// pure_efi = FALSE; -// IGNORE_RETVAL(ComboBox_SetItemData(hTargetSystem, ComboBox_InsertStringU(hTargetSystem, 0, -// "BIOS (or UEFI-CSM)"), TT_BIOS)); -// IGNORE_RETVAL(ComboBox_SetItemData(hTargetSystem, ComboBox_InsertStringU(hTargetSystem, 1, -// "UEFI (non CSM)"), TT_UEFI)); -// IGNORE_RETVAL(ComboBox_SetItemData(hTargetSystem, ComboBox_InsertStringU(hTargetSystem, 2, -// "BIOS or UEFI"), TT_UEFI)); -// // IGNORE_RETVAL(ComboBox_SetItemData(hTargetSystem, ComboBox_InsertStringU(hTargetSystem, 0, -//// useCSM?"BIOS or UEFI-CSM":"BIOS (or CSM emulation"), TT_BIOS)); -// if (replace) -// IGNORE_RETVAL(ComboBox_SetCurSel(hTargetSystem, max(ComboBox_GetCurSel(hTargetSystem), 0))); -// return 0; -//} - static void SetFSFromISO(void) { int i, fs_tmp, selected_fs = FS_UNKNOWN; @@ -752,16 +727,28 @@ static void SetToGo(void) } } -static void EnableAdvancedBootOptions(BOOL enable, BOOL remove_checkboxes) +// This handles the enabling/disabling of the "Add fixes for old BIOSes" and "Use Rufus MBR" controls +static void EnableMBRBootOptions(BOOL enable, BOOL remove_checkboxes) { - BOOL actual_enable_mbr = ((tt==TT_UEFI)||(selection_default>=BT_IMAGE)||(bt == BT_NON_BOOTABLE))?FALSE:enable; - BOOL actual_enable_fix = ((tt==TT_UEFI)||(selection_default==BT_IMAGE)||(bt == BT_NON_BOOTABLE))?FALSE:enable; + BOOL actual_enable_mbr = (bt > BT_IMAGE) ? FALSE: enable; + BOOL actual_enable_fix = enable; static UINT uXPartChecked = BST_UNCHECKED; - if ((selection_default == BT_IMAGE) && IS_BIOS_BOOTABLE(img_report) && !HAS_WINPE(img_report) && !HAS_BOOTMGR(img_report)) { + if ((pt != PARTITION_STYLE_MBR) || (tt != TT_BIOS) || ((bt == BT_IMAGE) && !IS_BIOS_BOOTABLE(img_report))) { + // These options cannot apply if we aren't using MBR+BIOS, or are using an image that isn't BIOS bootable actual_enable_mbr = FALSE; - mbr_selected_by_user = FALSE; + actual_enable_fix = FALSE; + } else { + // If we are using an image, the Rufus MBR only applies if it's for Windows + if ((bt == BT_IMAGE) && !HAS_WINPE(img_report) && !HAS_BOOTMGR(img_report)) { + actual_enable_mbr = FALSE; + mbr_selected_by_user = FALSE; + } + if (bt == BT_NON_BOOTABLE) { + actual_enable_fix = FALSE; + } } + if (remove_checkboxes) { // Store/Restore the checkbox states if (IsWindowEnabled(GetDlgItem(hMainDialog, IDC_RUFUS_MBR)) && !actual_enable_mbr) { @@ -782,49 +769,29 @@ static void EnableAdvancedBootOptions(BOOL enable, BOOL remove_checkboxes) static void EnableBootOptions(BOOL enable, BOOL remove_checkboxes) { - BOOL actual_enable = ((!IS_FAT(fs)) && (fs != FS_NTFS) && (selection_default == BT_IMAGE) && (img_report.is_bootable_img))?FALSE:enable; + BOOL actual_enable_bb, actual_enable = enable; - EnableWindow(hBootType, actual_enable); - EnableWindow(hSelectImage, actual_enable); - EnableWindow(GetDlgItem(hMainDialog, IDC_WINDOWS_INSTALL), actual_enable); - EnableWindow(GetDlgItem(hMainDialog, IDC_WINDOWS_TO_GO), actual_enable); - EnableAdvancedBootOptions(actual_enable, remove_checkboxes); + // If no device is selected, don't enable anything + if (ComboBox_GetCurSel(hDeviceList) < 0) + actual_enable = FALSE; + // If boot selection is set to image, but no image is currently selected, don't enable anything + if ((bt == BT_IMAGE) && (image_path == NULL)) + actual_enable = FALSE; + actual_enable_bb = actual_enable; + // If we are dealing with a pure DD image, remove all options except Bad Blocks check + if ((bt == BT_IMAGE) && (img_report.is_bootable_img) && (!img_report.is_iso)) + actual_enable = FALSE; + + EnableWindow(GetDlgItem(hMainDialog, IDC_IMAGE_OPTION), actual_enable); + EnableMBRBootOptions(actual_enable, remove_checkboxes); + + EnableWindow(GetDlgItem(hMainDialog, IDC_LABEL), actual_enable); + EnableWindow(GetDlgItem(hMainDialog, IDC_QUICKFORMAT), actual_enable); + EnableWindow(GetDlgItem(hMainDialog, IDC_BADBLOCKS), actual_enable_bb); + EnableWindow(GetDlgItem(hMainDialog, IDC_NBPASSES), actual_enable_bb); + EnableWindow(GetDlgItem(hMainDialog, IDC_EXTENDED_LABEL), actual_enable); } -// TODO: Set target type tooltips -static void SetPartitionSchemeTooltip(void) -{ - if (tt == TT_BIOS) { - if (pt != PARTITION_STYLE_SFD) - CreateTooltip(hPartitionScheme, lmprintf(MSG_150), 15000); - else - DestroyTooltip(hPartitionScheme); - } else { - if (pt == PARTITION_STYLE_MBR) - CreateTooltip(hPartitionScheme, lmprintf(MSG_151), 15000); - else if (pt == PARTITION_STYLE_GPT) - CreateTooltip(hPartitionScheme, lmprintf(MSG_152), 15000); - else - DestroyTooltip(hPartitionScheme); - } -} - -//static void SetTargetSystem(void) -//{ -// int ts = SetMBRForUEFI(TRUE); // Will be set to -1 for pure UEFI, 0 otherwise -// if ((prefer_gpt && IS_EFI_BOOTABLE(img_report)) || SelectedDrive.PartitionType == PARTITION_STYLE_GPT) { -// ts += 2; // GPT/UEFI -// } else if (SelectedDrive.has_protective_mbr || SelectedDrive.has_mbr_uefi_marker || -// (IS_EFI_BOOTABLE(img_report) && !IS_BIOS_BOOTABLE(img_report)) ) { -// ts += 1; // MBR/UEFI -// } else { -// ts += 0; // MBR/BIOS|UEFI -// } -// IGNORE_RETVAL(ComboBox_SetCurSel(hPartitionScheme, ts)); -// // Can't call SetPartitionSchemeTooltip() directly, as we may be on a different thread -// SendMessage(hMainDialog, UM_SET_PARTITION_SCHEME_TOOLTIP, 0, 0); -//} - static void SetProposedLabel(int ComboIndex) { const char no_label[] = STR_NO_LABEL, empty[] = ""; @@ -860,6 +827,53 @@ static void SetProposedLabel(int ComboIndex) } } +// Toggle available controls when dealing with a pure DD image +static void ToggleImage(BOOL enable) +{ + int i; + for (i = 0; i < ARRAYSIZE(dd_image_toggle_ids); i++) + EnableWindow(GetDlgItem(hMainDialog, dd_image_toggle_ids[i]), enable); +} + +// Toggle controls according to operation +static void EnableControls(BOOL bEnable) +{ + // The following only get disabled on format/checksum and otherwise remain enabled, + // even if no device or image are selected + EnableWindow(hDeviceList, bEnable); + EnableWindow(hBootType, bEnable); + EnableWindow(hSelectImage, bEnable); + EnableWindow(GetDlgItem(hMainDialog, IDC_LIST_USB_HDD), bEnable); + EnableWindow(hAdvancedDeviceToolbar, bEnable); + EnableWindow(hAdvancedFormatToolbar, bEnable); + SendMessage(hMultiToolbar, TB_ENABLEBUTTON, (WPARAM)IDC_LANG, (LPARAM)bEnable); + SendMessage(hMultiToolbar, TB_ENABLEBUTTON, (WPARAM)IDC_ABOUT, (LPARAM)bEnable); + SendMessage(hMultiToolbar, TB_ENABLEBUTTON, (WPARAM)IDC_SETTINGS, (LPARAM)bEnable); + + // Checksum button is enabled if an image has been selected + EnableWindow(GetDlgItem(hMainDialog, IDC_HASH), bEnable && (image_path != NULL)); + + // Toggle CLOSE/CANCEL + SetDlgItemTextU(hMainDialog, IDCANCEL, lmprintf(bEnable ? MSG_006 : MSG_007)); + + // Only enable the following controls if a device is active + bEnable = (ComboBox_GetCurSel(hDeviceList) < 0) ? FALSE : bEnable; + EnableWindow(GetDlgItem(hMainDialog, IDC_IMAGE_OPTION), bEnable); + EnableWindow(GetDlgItem(hMainDialog, IDC_SAVE), bEnable); + + // Enable or disable the Start button and the other boot options + bEnable = ((bt == BT_IMAGE) && (image_path == NULL)) ? FALSE : bEnable; + EnableWindow(hStart, bEnable); + EnableBootOptions(bEnable, FALSE); + + // Finally, only enable the half-size dropdowns if we aren't dealing with a pure DD image + bEnable = ((bt == BT_IMAGE) && (image_path != NULL) && (!img_report.is_iso)) ? FALSE : bEnable; + EnableWindow(hPartitionScheme, bEnable); + EnableWindow(hTargetSystem, bEnable); + EnableWindow(hFileSystem, bEnable); + EnableWindow(hClusterSize, bEnable); +} + // Populate the UI main dropdown properties. // This should be called on device or boot type change. static BOOL PopulateProperties(int device_index) @@ -884,7 +898,7 @@ static BOOL PopulateProperties(int device_index) return FALSE; } - EnableBootOptions(TRUE, TRUE); + EnableControls(TRUE); // Set a proposed label according to the size (eg: "256MB", "8GB") static_sprintf(SelectedDrive.proposed_label, @@ -899,8 +913,6 @@ static BOOL PopulateProperties(int device_index) free(device_tooltip); } - EnableWindow(hStart, (bt != BT_IMAGE) || (image_path != NULL)); - out: SetProposedLabel(device_index); return TRUE; @@ -976,7 +988,7 @@ static void InitProgress(BOOL bOnlyFormat) last_end = slot_end[i+1]; } - /* Is there's no analog, adjust our discrete ends to fill the whole bar */ + // If there's no analog, adjust our discrete ends to fill the whole bar if (slots_analog == 0.0f) { for (i=0; i (uint64_t)SelectedDrive.DiskSize)) { @@ -1564,12 +1528,10 @@ static BOOL BootCheck(void) MessageBoxExU(hMainDialog, lmprintf(MSG_089), lmprintf(MSG_088), MB_OK|MB_ICONERROR|MB_IS_RTL, selected_langid); return FALSE; } - //if (bt == BT_IMG) { - // if (!IS_DD_BOOTABLE(img_report)) - // // The selected image doesn't match the boot option selected. - // MessageBoxExU(hMainDialog, lmprintf(MSG_188), lmprintf(MSG_187), MB_OK|MB_ICONERROR|MB_IS_RTL, selected_langid); - // return IS_DD_BOOTABLE(img_report); - //} + if (IS_DD_BOOTABLE(img_report) && !img_report.is_iso) { + // Pure DD images are fine at this stage + return TRUE; + } if ((togo_mode) && (Button_GetCheck(GetDlgItem(hMainDialog, IDC_WINDOWS_TO_GO)) == BST_CHECKED)) { if (fs != FS_NTFS) { // Windows To Go only works for NTFS @@ -1950,23 +1912,19 @@ static void CreateAdditionalControls(HWND hDlg) } // Fetch the up and down expand icons for the advanced options toolbar - if (nWindowsVersion < WINDOWS_8) { - hDll = GetLibraryHandle("Shell32"); - hIconDown = (HICON)LoadImage(hDll, MAKEINTRESOURCE(16750), IMAGE_ICON, s16, s16, LR_DEFAULTCOLOR | LR_SHARED); - hDownImageList = ImageList_Create(i16, i16, ILC_COLOR32, 1, 0); - ImageList_AddIcon(hDownImageList, hIconDown); + hDll = GetLibraryHandle("ComDlg32"); + hIconDown = (HICON)LoadImage(hDll, MAKEINTRESOURCE(577), IMAGE_ICON, s16, s16, LR_DEFAULTCOLOR | LR_SHARED); + hIconUp = (HICON)LoadImage(hDll, MAKEINTRESOURCE(578), IMAGE_ICON, s16, s16, LR_DEFAULTCOLOR | LR_SHARED); + // Fallback to using Shell32 if we can't locate the icons we want in ComDlg32 + hDll = GetLibraryHandle("Shell32"); + if (hIconUp == NULL) hIconUp = (HICON)LoadImage(hDll, MAKEINTRESOURCE(16749), IMAGE_ICON, s16, s16, LR_DEFAULTCOLOR | LR_SHARED); - hUpImageList = ImageList_Create(i16, i16, ILC_COLOR32, 1, 0); - ImageList_AddIcon(hUpImageList, hIconUp); - } else { - hDll = GetLibraryHandle("ComDlg32"); - hIconDown = (HICON)LoadImage(hDll, MAKEINTRESOURCE(577), IMAGE_ICON, s16, s16, LR_DEFAULTCOLOR | LR_SHARED); - hDownImageList = ImageList_Create(i16, i16, ILC_COLOR32, 1, 0); - ImageList_AddIcon(hDownImageList, hIconDown); - hIconUp = (HICON)LoadImage(hDll, MAKEINTRESOURCE(578), IMAGE_ICON, s16, s16, LR_DEFAULTCOLOR | LR_SHARED); - hUpImageList = ImageList_Create(i16, i16, ILC_COLOR32, 1, 0); - ImageList_AddIcon(hUpImageList, hIconUp); - } + if (hIconDown == NULL) + hIconDown = (HICON)LoadImage(hDll, MAKEINTRESOURCE(16750), IMAGE_ICON, s16, s16, LR_DEFAULTCOLOR | LR_SHARED); + hUpImageList = ImageList_Create(i16, i16, ILC_COLOR32, 1, 0); + hDownImageList = ImageList_Create(i16, i16, ILC_COLOR32, 1, 0); + ImageList_AddIcon(hUpImageList, hIconUp); + ImageList_AddIcon(hDownImageList, hIconDown); // Create the advanced options toolbars memset(wtbtext, 0, sizeof(wtbtext)); @@ -2432,14 +2390,9 @@ static void InitDialog(HWND hDlg) GetHalfDropwdownWidth(hDlg); GetFullWidth(hDlg); - // TODO: Don't think this is used - // Create the font and brush for the Info edit box + // Create the font and brush for the progress messages hInfoFont = CreateFontA(lfHeight, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, 0, 0, PROOF_QUALITY, 0, "Segoe UI"); -// hInfoFont = CreateFontA(48, 0, 0, 0, FW_SEMIBOLD, FALSE, FALSE, FALSE, DEFAULT_CHARSET, -// 0, 0, PROOF_QUALITY, 0, "Segoe UI"); - SendDlgItemMessageA(hDlg, IDC_INFO, WM_SETFONT, (WPARAM)hInfoFont, TRUE); - hInfoBrush = CreateSolidBrush(GetSysColor(COLOR_BTNFACE)); // Create the title bar icon SetTitleBarIcon(hDlg); @@ -2504,9 +2457,7 @@ static void InitDialog(HWND hDlg) // Fill up the boot options dropdown SetBootOptions(); - SetComboEntry(hBootType, selection_default); - // SetOptionsAccordingToBootEntry(); // Fill up the MBR masqueraded disk IDs ("8 disks should be enough for anybody") IGNORE_RETVAL(ComboBox_SetItemData(hDiskID, ComboBox_AddStringU(hDiskID, lmprintf(MSG_030, LEFT_TO_RIGHT_EMBEDDING "0x80" POP_DIRECTIONAL_FORMATTING)), 0x80)); for (i=1; i<=7; i++) { @@ -2548,6 +2499,9 @@ static void InitDialog(HWND hDlg) CreateTooltip(GetDlgItem(hDlg, IDC_LIST_USB_HDD), lmprintf(MSG_170), -1); CreateTooltip(hStart, lmprintf(MSG_171), -1); CreateTooltip(GetDlgItem(hDlg, IDC_ABOUT), lmprintf(MSG_172), -1); + CreateTooltip(hPartitionScheme, lmprintf(MSG_150), -1); + CreateTooltip(hTargetSystem, lmprintf(MSG_151), 30000); + CreateTooltip(GetDlgItem(hDlg, IDS_CSM_HELP_TXT), lmprintf(MSG_152), 30000); // CreateTooltip(GetDlgItem(hDlg, IDC_WINDOWS_INSTALL), lmprintf(MSG_199), -1); // CreateTooltip(GetDlgItem(hDlg, IDC_WINDOWS_TO_GO), lmprintf(MSG_200), -1); CreateTooltip(GetDlgItem(hDlg, IDC_HASH), lmprintf(MSG_272), -1); @@ -2558,7 +2512,6 @@ static void InitDialog(HWND hDlg) if (!advanced_mode_format) ToggleAdvancedFormatOptions(FALSE); ToggleImageOption(); - ToggleHash(); // Process commandline parameters if (iso_provided) { @@ -2800,10 +2753,6 @@ out: return ret; } -#ifdef RUFUS_TEST - extern int SelectionDyn(char* title, char* message, char** szChoice, int nChoices); -#endif - /* * Main dialog callback */ @@ -2816,6 +2765,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA static LPITEMIDLIST pidlDesktop = NULL; static SHChangeNotifyEntry NotifyEntry; static DWORD_PTR thread_affinity[4]; + static HFONT hyperlink_font = NULL; DRAWITEMSTRUCT* pDI; LPTOOLTIPTEXT lpttt; HDROP droppedFileInfo; @@ -2944,6 +2894,9 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA WriteSettingBool(SETTING_ADVANCED_MODE_DEVICE, advanced_mode_device); ToggleAdvancedDeviceOptions(advanced_mode_device); SetBootOptions(); + bt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType)); + EnableControls(TRUE); + SetFileSystemAndClusterSize(NULL); SendMessage(hMainDialog, WM_COMMAND, (CBN_SELCHANGE << 16) | IDC_FILESYSTEM, ComboBox_GetCurSel(hFileSystem)); break; @@ -2980,6 +2933,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA if (HIWORD(wParam) != CBN_SELCHANGE) break; tt = (int)ComboBox_GetItemData(hTargetSystem, ComboBox_GetCurSel(hTargetSystem)); + ShowWindow(GetDlgItem(hMainDialog, IDS_CSM_HELP_TXT), ((tt == TT_BIOS) && (has_uefi_csm)) ? SW_SHOW : SW_HIDE); SetFileSystemAndClusterSize(NULL); break; case IDC_PARTITION_TYPE: @@ -2987,18 +2941,13 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA break; pt = (int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme)); SetPartitionSchemeAndTargetSystem(TRUE); - SetPartitionSchemeTooltip(); SetFileSystemAndClusterSize(NULL); + EnableMBRBootOptions(TRUE, FALSE); break; case IDC_FILESYSTEM: if (HIWORD(wParam) != CBN_SELCHANGE) break; fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem)); - if (image_path != NULL && !img_report.is_iso) { - ToggleImage(FALSE); - EnableAdvancedBootOptions(FALSE, TRUE); - break; - } SetClusterSizes(fs); // Disable/restore the quick format control depending on large FAT32 or ReFS if ( ((fs == FS_FAT32) && ((SelectedDrive.DiskSize > LARGE_FAT32_SIZE) || (force_large_fat32))) || (fs == FS_REFS) ) { @@ -3024,7 +2973,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA } break; } - EnableAdvancedBootOptions(TRUE, TRUE); + EnableMBRBootOptions(TRUE, FALSE); SetMBRProps(); break; case IDC_BOOT_TYPE: @@ -3034,12 +2983,11 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA // TODO: do we really need both bt and selection_default? selection_default = bt; SetPartitionSchemeAndTargetSystem(FALSE); - EnableAdvancedBootOptions(TRUE, TRUE); + SetFileSystemAndClusterSize(NULL); // TODO: SetToGo() would be better invoked from ShowImageSettings() SetToGo(); - ToggleHash(); SetProposedLabel(ComboBox_GetCurSel(hDeviceList)); - PopulateProperties(ComboBox_GetCurSel(hDeviceList)); + EnableControls(TRUE); // TODO: Might wanna do this in PopulateProperties tt = (int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme)); pt = (int)ComboBox_GetItemData(hTargetSystem, ComboBox_GetCurSel(hTargetSystem)); @@ -3053,7 +3001,6 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA // If declared globaly, lmprintf(MSG_036) would be called on each message... EXT_DECL(img_ext, NULL, __VA_GROUP__("*.iso;*.img;*.vhd;*.gz;*.bzip2;*.bz2;*.xz;*.lzma;*.Z;*.zip"), __VA_GROUP__(lmprintf(MSG_036))); - EnableWindow(hStatusToolbar, FALSE); image_path = FileDialog(FALSE, NULL, &img_ext, 0); if (image_path == NULL) { if (old_image_path != NULL) { @@ -3103,6 +3050,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA tt = (int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme)); pt = (int)ComboBox_GetItemData(hTargetSystem, ComboBox_GetCurSel(hTargetSystem)); fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem)); + write_as_image = FALSE; // Disable all controls except Cancel EnableControls(FALSE); FormatStatus = 0; @@ -3136,21 +3084,20 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA } } - // Ask users how they want to write ISOHybrid images - if ((bt != BT_NON_BOOTABLE) && (img_report.is_bootable_img) && - (ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType)) == BT_IMAGE)) { - // TODO: We need to restore these MSGs - char* iso_image = lmprintf(MSG_036); - char* dd_image = lmprintf(MSG_095); - char* choices[2] = { lmprintf(MSG_276, iso_image), lmprintf(MSG_277, dd_image) }; - i = SelectionDialog(lmprintf(MSG_274), lmprintf(MSG_275, iso_image, dd_image, iso_image, dd_image), - choices, 2); - if (i < 0) { // Cancel - goto aborted_start; - } else if (i == 2) { - // TODO: set ISO vs DD mode here -// selection_default = BT_IMG; -// SetComboEntry(hBootType, selection_default); + if ((bt == BT_IMAGE) && IS_DD_BOOTABLE(img_report)) { + if (img_report.is_iso) { + // Ask users how they want to write ISOHybrid images + char* iso_image = lmprintf(MSG_036); + char* dd_image = lmprintf(MSG_095); + char* choices[2] = { lmprintf(MSG_276, iso_image), lmprintf(MSG_277, dd_image) }; + i = SelectionDialog(lmprintf(MSG_274), lmprintf(MSG_275, iso_image, dd_image, iso_image, dd_image), + choices, 2); + if (i < 0) // Cancel + goto aborted_start; + else if (i == 2) + write_as_image = TRUE; + } else { + write_as_image = TRUE; } } } @@ -3268,8 +3215,8 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA queued_hotplug_event = FALSE; GetDevices((DWORD)ComboBox_GetItemData(hDeviceList, ComboBox_GetCurSel(hDeviceList))); user_changed_label = FALSE; - } - else { + EnableControls(TRUE); + } else { queued_hotplug_event = TRUE; } return (INT_PTR)TRUE; @@ -3299,7 +3246,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA hLogDlg = MyCreateDialog(hMainInstance, IDD_LOG, hDlg, (DLGPROC)LogProc); InitDialog(hDlg); GetDevices(0); - PopulateProperties(ComboBox_GetCurSel(hDeviceList)); + EnableControls(TRUE); CheckForUpdates(FALSE); // Register MEDIA_INSERTED/MEDIA_REMOVED notifications for card readers if (SUCCEEDED(SHGetSpecialFolderLocation(0, CSIDL_DESKTOP, &pidlDesktop))) { @@ -3356,6 +3303,15 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA EndPaint(hDlg, &ps); break; + case WM_CTLCOLORSTATIC: + if ((HWND)lParam != GetDlgItem(hDlg, IDS_CSM_HELP_TXT)) + return FALSE; + SetBkMode((HDC)wParam, TRANSPARENT); + CreateStaticFont((HDC)wParam, &hyperlink_font, FALSE); + SelectObject((HDC)wParam, hyperlink_font); + SetTextColor((HDC)wParam, RGB(0, 0, 125)); // DARK_BLUE + return (INT_PTR)CreateSolidBrush(GetSysColor(COLOR_BTNFACE)); + case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case TTN_GETDISPINFO: @@ -3504,10 +3460,6 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA format_op_in_progress = FALSE; return (INT_PTR)TRUE; - // Ensures that SetPartitionSchemeTooltip() can be called from the original thread - case UM_SET_PARTITION_SCHEME_TOOLTIP: - SetPartitionSchemeTooltip(); - break; } return (INT_PTR)FALSE; } diff --git a/src/rufus.h b/src/rufus.h index a7aa288d..207d05ae 100644 --- a/src/rufus.h +++ b/src/rufus.h @@ -152,7 +152,6 @@ enum user_message_type { UM_PROGRESS_INIT, UM_PROGRESS_EXIT, UM_NO_UPDATE, - UM_SET_PARTITION_SCHEME_TOOLTIP, // Start of the WM IDs for the language menu items UM_LANGUAGE_MENU = WM_APP + 0x100 }; @@ -383,7 +382,7 @@ enum WindowsVersion { extern HINSTANCE hMainInstance; extern HWND hMainDialog, hLogDlg, hStatus, hDeviceList, hCapacity; extern HWND hPartitionScheme, hTargetSystem, hFileSystem, hClusterSize, hLabel, hBootType, hNBPasses, hLog; -extern HWND hInfo, hProgress, hDiskID, hStatusToolbar; +extern HWND hInfo, hProgress, hDiskID; extern float fScale; extern char szFolderPath[MAX_PATH], app_dir[MAX_PATH], temp_dir[MAX_PATH], system_dir[MAX_PATH], sysnative_dir[MAX_PATH]; extern char* image_path; diff --git a/src/rufus.rc b/src/rufus.rc index 92678327..993ca0cd 100644 --- a/src/rufus.rc +++ b/src/rufus.rc @@ -50,6 +50,7 @@ BEGIN COMBOBOX IDC_PARTITION_TYPE,8,97,96,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP LTEXT "Target system",IDS_TARGET_SYSTEM_TXT,128,88,96,8 COMBOBOX IDC_TARGET_SYSTEM,128,97,96,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "?",IDS_CSM_HELP_TXT,226,98,6,15,SS_NOTIFY | NOT WS_VISIBLE CONTROL "Show advanced drive properties",IDC_ADVANCED_DRIVE_PROPERTIES, "Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,8,110,216,10 CONTROL "List USB Hard Drives",IDC_LIST_USB_HDD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,120,216,10 diff --git a/src/stdlg.c b/src/stdlg.c index c4beaa2a..c69aca8f 100644 --- a/src/stdlg.c +++ b/src/stdlg.c @@ -1399,11 +1399,11 @@ INT_PTR CALLBACK NewVersionCallback(HWND hDlg, UINT message, WPARAM wParam, LPAR char cmdline[] = APPLICATION_NAME " -w 150"; static char* filepath = NULL; static int download_status = 0; + static HFONT hyperlink_font = NULL; LONG i; HWND hNotes; STARTUPINFOA si; PROCESS_INFORMATION pi; - HFONT hyperlink_font = NULL; EXT_DECL(dl_ext, NULL, __VA_GROUP__("*.exe"), __VA_GROUP__(lmprintf(MSG_037))); switch (message) {