1
1
Fork 0
mirror of https://github.com/pbatard/rufus.git synced 2024-08-14 23:57:05 +00:00

[ui] use our own custom bar with text

* Needed because native Windows produces obnoxious tearing on redrawing.
* Also rename global partition scheme variable back to 'pt'
* Also fix major and minor version numbers in the .rc
This commit is contained in:
Pete Batard 2018-04-16 17:05:23 +02:00
parent 2fbe7be870
commit 7fef3c6434
5 changed files with 79 additions and 44 deletions

View file

@ -1662,7 +1662,7 @@ DWORD WINAPI FormatThread(void* param)
if (large_drive) if (large_drive)
uprintf("Notice: Large drive detected (may produce short writes)"); uprintf("Notice: Large drive detected (may produce short writes)");
// Find out if we need to add any extra partitions // Find out if we need to add any extra partitions
if ((windows_to_go) && (tt == TT_UEFI) && (ps == PARTITION_STYLE_GPT)) if ((windows_to_go) && (tt == TT_UEFI) && (pt == PARTITION_STYLE_GPT))
// According to Microsoft, every GPT disk (we RUN Windows from) must have an MSR due to not having hidden sectors // According to Microsoft, every GPT disk (we RUN Windows from) must have an MSR due to not having hidden sectors
// http://msdn.microsoft.com/en-us/library/windows/hardware/dn640535.aspx#gpt_faq_what_disk_require_msr // http://msdn.microsoft.com/en-us/library/windows/hardware/dn640535.aspx#gpt_faq_what_disk_require_msr
extra_partitions = XP_MSR | XP_EFI; extra_partitions = XP_MSR | XP_EFI;
@ -1848,7 +1848,7 @@ DWORD WINAPI FormatThread(void* param)
UpdateProgress(OP_ZERO_MBR, -1.0f); UpdateProgress(OP_ZERO_MBR, -1.0f);
CHECK_FOR_USER_CANCEL; CHECK_FOR_USER_CANCEL;
if (!CreatePartition(hPhysicalDrive, ps, fs, (ps==PARTITION_STYLE_MBR) && (tt==TT_UEFI), extra_partitions)) { if (!CreatePartition(hPhysicalDrive, pt, fs, (pt==PARTITION_STYLE_MBR) && (tt==TT_UEFI), extra_partitions)) {
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_PARTITION_FAILURE; FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_PARTITION_FAILURE;
goto out; goto out;
} }
@ -1882,7 +1882,7 @@ DWORD WINAPI FormatThread(void* param)
} }
// Thanks to Microsoft, we must fix the MBR AFTER the drive has been formatted // Thanks to Microsoft, we must fix the MBR AFTER the drive has been formatted
if (ps == PARTITION_STYLE_MBR) { if (pt == PARTITION_STYLE_MBR) {
PrintInfoDebug(0, MSG_228); // "Writing master boot record..." PrintInfoDebug(0, MSG_228); // "Writing master boot record..."
if ((!WriteMBR(hPhysicalDrive)) || (!WriteSBR(hPhysicalDrive))) { if ((!WriteMBR(hPhysicalDrive)) || (!WriteSBR(hPhysicalDrive))) {
if (!IS_ERROR(FormatStatus)) if (!IS_ERROR(FormatStatus))

View file

@ -413,16 +413,7 @@ static uint64_t last_msg_time[2] = { 0, 0 };
static void PrintInfoMessage(char* msg) { static void PrintInfoMessage(char* msg) {
SetWindowTextU(hProgress, msg); SetWindowTextU(hProgress, msg);
// Make sure our field gets redrawn InvalidateRect(hProgress, NULL, TRUE);
// If the progress bar is not active, it looks like WM_PAINT is
// ignored. But InvalidateRect is causing refresh tearing so we
// don't want to use that while active.
// Refresh still sucks though and marquee no longer works... :(
// TODO: Create our own progress bar control with text overlay and inverted text
if (!progress_in_use)
InvalidateRect(hProgress, NULL, TRUE);
else
SendMessage(hProgress, WM_PAINT, 0, 0);
} }
static void PrintStatusMessage(char* msg) { static void PrintStatusMessage(char* msg) {
SendMessageLU(hStatus, SB_SETTEXTW, SBT_OWNERDRAW | SB_SECTION_LEFT, msg); SendMessageLU(hStatus, SB_SETTEXTW, SBT_OWNERDRAW | SB_SECTION_LEFT, msg);

View file

@ -102,7 +102,7 @@ BUTTON_IMAGELIST bi_iso = { 0 }, bi_up = { 0 }, bi_down = { 0 }, bi_save = { 0 }
char szFolderPath[MAX_PATH], app_dir[MAX_PATH], system_dir[MAX_PATH], temp_dir[MAX_PATH], sysnative_dir[MAX_PATH]; char szFolderPath[MAX_PATH], app_dir[MAX_PATH], system_dir[MAX_PATH], temp_dir[MAX_PATH], sysnative_dir[MAX_PATH];
char *image_path = NULL, *short_image_path; char *image_path = NULL, *short_image_path;
float fScale = 1.0f; float fScale = 1.0f;
int default_fs, fs, bt, ps, tt; int default_fs, fs, bt, pt, tt; // file system, boot type, partition type, target type
int cbw, ddw, ddbh = 0, bh = 0; // (empty) check box width, (empty) drop down width, button height (for and without dropdown match) int cbw, ddw, ddbh = 0, bh = 0; // (empty) check box width, (empty) drop down width, button height (for and without dropdown match)
uint32_t dur_mins, dur_secs; uint32_t dur_mins, dur_secs;
loc_cmd* selected_locale = NULL; loc_cmd* selected_locale = NULL;
@ -334,19 +334,19 @@ static void SetPartitionSchemeAndTargetSystem(BOOL only_target)
preferred_ps = PARTITION_STYLE_MBR; preferred_ps = PARTITION_STYLE_MBR;
} }
SetComboEntry(hPartitionScheme, preferred_ps); SetComboEntry(hPartitionScheme, preferred_ps);
ps = (int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme)); pt = (int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme));
} }
has_uefi_csm = FALSE; has_uefi_csm = FALSE;
if (allowed_target_system[0] && (ps != PARTITION_STYLE_GPT)) { if (allowed_target_system[0] && (pt != PARTITION_STYLE_GPT)) {
IGNORE_RETVAL(ComboBox_SetItemData(hTargetSystem, IGNORE_RETVAL(ComboBox_SetItemData(hTargetSystem,
ComboBox_AddStringU(hTargetSystem, lmprintf(MSG_031)), TT_BIOS)); ComboBox_AddStringU(hTargetSystem, lmprintf(MSG_031)), TT_BIOS));
has_uefi_csm = TRUE; has_uefi_csm = TRUE;
} }
if (allowed_target_system[1] && !((ps == PARTITION_STYLE_MBR) && IS_BIOS_BOOTABLE(img_report) && IS_EFI_BOOTABLE(img_report)) ) if (allowed_target_system[1] && !((pt == PARTITION_STYLE_MBR) && IS_BIOS_BOOTABLE(img_report) && IS_EFI_BOOTABLE(img_report)) )
IGNORE_RETVAL(ComboBox_SetItemData(hTargetSystem, IGNORE_RETVAL(ComboBox_SetItemData(hTargetSystem,
ComboBox_AddStringU(hTargetSystem, lmprintf(MSG_032)), TT_UEFI)); ComboBox_AddStringU(hTargetSystem, lmprintf(MSG_032)), TT_UEFI));
if (allowed_target_system[2] && ((ps != PARTITION_STYLE_GPT) || (bt == BT_NON_BOOTABLE))) if (allowed_target_system[2] && ((pt != PARTITION_STYLE_GPT) || (bt == BT_NON_BOOTABLE)))
IGNORE_RETVAL(ComboBox_SetItemData(hTargetSystem, IGNORE_RETVAL(ComboBox_SetItemData(hTargetSystem,
ComboBox_AddStringU(hTargetSystem, lmprintf(MSG_033)), TT_BIOS)); ComboBox_AddStringU(hTargetSystem, lmprintf(MSG_033)), TT_BIOS));
IGNORE_RETVAL(ComboBox_SetCurSel(hTargetSystem, 0)); IGNORE_RETVAL(ComboBox_SetCurSel(hTargetSystem, 0));
@ -647,7 +647,7 @@ static void EnableMBRBootOptions(BOOL enable, BOOL remove_checkboxes)
BOOL actual_enable_fix = enable; BOOL actual_enable_fix = enable;
static UINT uXPartChecked = BST_UNCHECKED; static UINT uXPartChecked = BST_UNCHECKED;
if ((ps != PARTITION_STYLE_MBR) || (tt != TT_BIOS) || ((bt == BT_IMAGE) && !IS_BIOS_BOOTABLE(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 // 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; actual_enable_mbr = FALSE;
actual_enable_fix = FALSE; actual_enable_fix = FALSE;
@ -1444,7 +1444,7 @@ static BOOL BootCheck(void)
return FALSE; return FALSE;
} }
if (SelectedDrive.MediaType != FixedMedia) { if (SelectedDrive.MediaType != FixedMedia) {
if ((tt == TT_UEFI) && (ps == PARTITION_STYLE_GPT) && (nWindowsBuildNumber < 15000)) { if ((tt == TT_UEFI) && (pt == PARTITION_STYLE_GPT) && (nWindowsBuildNumber < 15000)) {
// Up to Windows 10 Creators Update, we were screwed, since we need access to 2 partitions at the same time. // Up to Windows 10 Creators Update, we were screwed, since we need access to 2 partitions at the same time.
// Thankfully, the newer Windows allow mounting multiple partitions on the same REMOVABLE drive. // Thankfully, the newer Windows allow mounting multiple partitions on the same REMOVABLE drive.
MessageBoxExU(hMainDialog, lmprintf(MSG_198), lmprintf(MSG_190), MB_OK|MB_ICONERROR|MB_IS_RTL, selected_langid); MessageBoxExU(hMainDialog, lmprintf(MSG_198), lmprintf(MSG_190), MB_OK|MB_ICONERROR|MB_IS_RTL, selected_langid);
@ -1750,25 +1750,69 @@ static __inline const char* IsAlphaOrBeta(void)
static INT_PTR CALLBACK ProgressCallback(HWND hCtrl, UINT message, WPARAM wParam, LPARAM lParam) static INT_PTR CALLBACK ProgressCallback(HWND hCtrl, UINT message, WPARAM wParam, LPARAM lParam)
{ {
HDC hDC; HDC hDC;
RECT rect; RECT rc;
PAINTSTRUCT paint_struct; PAINTSTRUCT ps;
wchar_t winfo[128] = L"Copying ISO files..."; SIZE size;
LONG full_right;
wchar_t winfo[128];
static WORD pos = 0, min = 0, max = 0xFFFF;
static COLORREF color = RGB(0x06, 0xB0, 0x25);
switch (message) { switch (message) {
case PBM_SETSTATE:
switch (wParam) {
case PBST_NORMAL:
color = RGB(0x06, 0xB0, 0x25);
break;
case PBST_PAUSED:
color = RGB(0xDA, 0xCB, 0x26);
break;
case PBST_ERROR:
color = RGB(0xDA, 0x26, 0x26);
break;
}
return (INT_PTR)TRUE;
case PBM_SETRANGE:
min = lParam & 0xFFFF;
max = lParam >> 16;
return (INT_PTR)TRUE;
case PBM_SETPOS:
pos = (WORD)wParam;
InvalidateRect(hProgress, NULL, TRUE);
return (INT_PTR)TRUE;
case WM_PAINT: case WM_PAINT:
hDC = BeginPaint(hCtrl, &paint_struct); hDC = BeginPaint(hCtrl, &ps);
CallWindowProc(progress_original_proc, hCtrl, message, (WPARAM)hDC, lParam); GetClientRect(hCtrl, &rc);
SelectObject(hDC, GetStockObject(DC_PEN));
SelectObject(hDC, GetStockObject(NULL_BRUSH));
SetDCPenColor(hDC, RGB(0xBC, 0xBC, 0xBC));
Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom);
InflateRect(&rc, -1, -1);
// TODO: Handle SetText message so we can avoid this call
GetWindowTextW(hProgress, winfo, ARRAYSIZE(winfo)); GetWindowTextW(hProgress, winfo, ARRAYSIZE(winfo));
SetBkMode(hDC, TRANSPARENT); full_right = rc.right;
rc.right = (pos > min) ? MulDiv(pos - min, rc.right, max - min) : rc.left;
SelectObject(hDC, hInfoFont); SelectObject(hDC, hInfoFont);
GetTextExtentPoint32(hDC, winfo, wcslen(winfo), &size);
// First half
SetTextColor(hDC, RGB(0xFF, 0xFF, 0xFF)); SetTextColor(hDC, RGB(0xFF, 0xFF, 0xFF));
SetTextAlign(hDC, TA_CENTER | TA_BASELINE); SetBkColor(hDC, color);
GetClientRect(hCtrl, &rect); ExtTextOut(hDC, (full_right - size.cx) / 2, (rc.bottom - size.cy) / 2,
ExtTextOutW(hDC, rect.right / 2, rect.bottom / 2 + (int)(4.0f * fScale), ETO_CLIPPED | ETO_OPAQUE | ETO_NUMERICSLOCAL | (right_to_left_mode ? ETO_RTLREADING : 0),
ETO_CLIPPED | ETO_NUMERICSLOCAL | (right_to_left_mode ? ETO_RTLREADING : 0), &rc, winfo, wcslen(winfo), NULL);
&rect, winfo, (int)wcslen(winfo), NULL); // Second half
EndPaint(hCtrl, &paint_struct); SetTextColor(hDC, RGB(0x00, 0x00, 0x00));
SetBkColor(hDC, RGB(0xE6, 0xE6, 0xE6));
rc.left = rc.right;
rc.right = full_right;
ExtTextOut(hDC, (full_right - size.cx) / 2, (rc.bottom - size.cy) / 2,
ETO_CLIPPED | ETO_OPAQUE | ETO_NUMERICSLOCAL | (right_to_left_mode ? ETO_RTLREADING : 0),
&rc, winfo, wcslen(winfo), NULL);
EndPaint(hCtrl, &ps);
return (INT_PTR)TRUE; return (INT_PTR)TRUE;
} }
@ -2804,7 +2848,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
RECT rc, DialogRect, DesktopRect; RECT rc, DialogRect, DesktopRect;
LONG progress_style; LONG progress_style;
HDC hDC; HDC hDC;
PAINTSTRUCT paint_struct; PAINTSTRUCT ps;
int nDeviceIndex, i, nWidth, nHeight, nb_devices, selected_language, offset; int nDeviceIndex, i, nWidth, nHeight, nb_devices, selected_language, offset;
char tmp[128]; char tmp[128];
wchar_t* wbuffer = NULL; wchar_t* wbuffer = NULL;
@ -2976,7 +3020,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
case IDC_PARTITION_TYPE: case IDC_PARTITION_TYPE:
if (HIWORD(wParam) != CBN_SELCHANGE) if (HIWORD(wParam) != CBN_SELCHANGE)
break; break;
ps = (int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme)); pt = (int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme));
SetPartitionSchemeAndTargetSystem(TRUE); SetPartitionSchemeAndTargetSystem(TRUE);
SetFileSystemAndClusterSize(NULL); SetFileSystemAndClusterSize(NULL);
EnableMBRBootOptions(TRUE, FALSE); EnableMBRBootOptions(TRUE, FALSE);
@ -3026,7 +3070,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
SetProposedLabel(ComboBox_GetCurSel(hDeviceList)); SetProposedLabel(ComboBox_GetCurSel(hDeviceList));
EnableControls(TRUE); EnableControls(TRUE);
tt = (int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme)); tt = (int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme));
ps = (int)ComboBox_GetItemData(hTargetSystem, ComboBox_GetCurSel(hTargetSystem)); pt = (int)ComboBox_GetItemData(hTargetSystem, ComboBox_GetCurSel(hTargetSystem));
return (INT_PTR)TRUE; return (INT_PTR)TRUE;
case IDC_SELECT: case IDC_SELECT:
if (iso_provided) { if (iso_provided) {
@ -3075,7 +3119,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
// Just in case // Just in case
bt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType)); bt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType));
tt = (int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme)); tt = (int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme));
ps = (int)ComboBox_GetItemData(hTargetSystem, ComboBox_GetCurSel(hTargetSystem)); pt = (int)ComboBox_GetItemData(hTargetSystem, ComboBox_GetCurSel(hTargetSystem));
fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem)); fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem));
write_as_image = FALSE; write_as_image = FALSE;
// Disable all controls except Cancel // Disable all controls except Cancel
@ -3334,9 +3378,9 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
break; break;
case WM_PAINT: case WM_PAINT:
hDC = BeginPaint(hDlg, &paint_struct); hDC = BeginPaint(hDlg, &ps);
OnPaint(hDC); OnPaint(hDC);
EndPaint(hDlg, &paint_struct); EndPaint(hDlg, &ps);
break; break;
case WM_CTLCOLORSTATIC: case WM_CTLCOLORSTATIC:

View file

@ -398,7 +398,7 @@ extern int64_t iso_blocking_status;
extern uint16_t rufus_version[3], embedded_sl_version[2]; extern uint16_t rufus_version[3], embedded_sl_version[2];
extern int nWindowsVersion; extern int nWindowsVersion;
extern int nWindowsBuildNumber; extern int nWindowsBuildNumber;
extern int fs, bt, ps, tt; extern int fs, bt, pt, tt;
extern char WindowsVersionStr[128]; extern char WindowsVersionStr[128];
extern size_t ubuffer_pos; extern size_t ubuffer_pos;
extern char ubuffer[UBUFFER_SIZE]; extern char ubuffer[UBUFFER_SIZE];

View file

@ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_DIALOG DIALOGEX 12, 12, 232, 326 IDD_DIALOG DIALOGEX 12, 12, 232, 326
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_ACCEPTFILES EXSTYLE WS_EX_ACCEPTFILES
CAPTION "Rufus 3.0.1247" CAPTION "Rufus 3.0.1248"
FONT 9, "Segoe UI Symbol", 400, 0, 0x0 FONT 9, "Segoe UI Symbol", 400, 0, 0x0
BEGIN BEGIN
LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP
@ -371,8 +371,8 @@ END
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 2,18,1247,0 FILEVERSION 3,0,1248,0
PRODUCTVERSION 2,18,1247,0 PRODUCTVERSION 3,0,1248,0
FILEFLAGSMASK 0x3fL FILEFLAGSMASK 0x3fL
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@ -389,13 +389,13 @@ BEGIN
BEGIN BEGIN
VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)"
VALUE "FileDescription", "Rufus" VALUE "FileDescription", "Rufus"
VALUE "FileVersion", "2.18.1247" VALUE "FileVersion", "3.0.1248"
VALUE "InternalName", "Rufus" VALUE "InternalName", "Rufus"
VALUE "LegalCopyright", "© 2011-2018 Pete Batard (GPL v3)" VALUE "LegalCopyright", "© 2011-2018 Pete Batard (GPL v3)"
VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html"
VALUE "OriginalFilename", "rufus.exe" VALUE "OriginalFilename", "rufus.exe"
VALUE "ProductName", "Rufus" VALUE "ProductName", "Rufus"
VALUE "ProductVersion", "2.18.1247" VALUE "ProductVersion", "3.0.1248"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"