diff --git a/src/iso.c b/src/iso.c index b7f7f3f8..6bcc0633 100644 --- a/src/iso.c +++ b/src/iso.c @@ -297,7 +297,7 @@ static void print_extracted_file(char* psz_fullpath, int64_t i_file_length) uprintf("Extracting: %s\n", psz_fullpath); safe_sprintf(&psz_fullpath[nul_pos], 24, " (%s)", SizeToHumanReadable(i_file_length, FALSE, FALSE)); // TODO: I don't think we need both of these... - SendMessageLU(GetDlgItem(hMainDialog, IDC_STATUS), SB_SETTEXTW, SBT_OWNERDRAW, psz_fullpath); + SendMessageLU(hStatus, SB_SETTEXTW, SBT_OWNERDRAW | SB_SECTION_LEFT, psz_fullpath); PrintStatus(0, MSG_000, psz_fullpath); // MSG_000 is "%s" // ISO9660 cannot handle backslashes for (i=0; i go to basic mode ToggleToGo(); + // Create the hash sign on the status bar + SendMessageLU(hStatus, SB_SETTEXTW, SBT_OWNERDRAW | SB_SECTION_MIDDLE, ""); + // Process commandline parameters if (iso_provided) { // Simulate a button click for ISO selection @@ -1953,7 +1957,7 @@ void SetBoot(int fs, int bt) */ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { - static DWORD DeviceNum = 0, LastRefresh = 0; + static DWORD DeviceNum = 0, LastRefresh = 0, MessagePos; static BOOL first_log_display = TRUE, user_changed_label = FALSE, isMarquee = FALSE; static ULONG ulRegister = 0; static LPITEMIDLIST pidlDesktop = NULL; @@ -2057,12 +2061,16 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA pDI->rcItem.left += (int)(4.0f * fScale); SetBkMode(pDI->hDC, TRANSPARENT); switch(pDI->itemID) { - case 0: // left part + case SB_SECTION_LEFT: SetTextColor(pDI->hDC, GetSysColor(COLOR_BTNTEXT)); DrawTextExU(pDI->hDC, szStatusMessage, -1, &pDI->rcItem, DT_LEFT|DT_END_ELLIPSIS|DT_PATH_ELLIPSIS, NULL); return (INT_PTR)TRUE; - case 1: // right part + case SB_SECTION_MIDDLE: + SetTextColor(pDI->hDC, (image_path==NULL)?GetSysColor(COLOR_3DSHADOW):GetSysColor(COLOR_BTNTEXT)); + DrawTextExA(pDI->hDC, "#", -1, &pDI->rcItem, DT_LEFT, NULL); + return (INT_PTR)TRUE; + case SB_SECTION_RIGHT: SetTextColor(pDI->hDC, GetSysColor(COLOR_3DSHADOW)); DrawTextExA(pDI->hDC, szTimer, -1, &pDI->rcItem, DT_LEFT, NULL); return (INT_PTR)TRUE; @@ -2070,6 +2078,45 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA } break; + // Detect a click on the "hash" sign in the status bar + case WM_PARENTNOTIFY: + if (wParam == WM_LBUTTONDOWN) { + GetClientRect(hMainDialog, &DialogRect); + MessagePos = GetMessagePos(); + Point.x = GET_X_LPARAM(MessagePos); + Point.y = GET_Y_LPARAM(MessagePos); + ScreenToClient(hDlg, &Point); + if ( (Point.x >= DialogRect.right - (int)(SB_EDGE_1*fScale)) && + (Point.x <= DialogRect.right - (int)(SB_EDGE_2*fScale)) && + ((format_thid == NULL) && (image_path != NULL)) ) { + FormatStatus = 0; + format_op_in_progress = TRUE; + no_confirmation_on_cancel = TRUE; + // Reset all progress bars + SendMessage(hProgress, PBM_SETSTATE, (WPARAM)PBST_NORMAL, 0); + SetTaskbarProgressState(TASKBAR_NORMAL); + SetTaskbarProgressValue(0, MAX_PROGRESS); + SendMessage(hProgress, PBM_SETPOS, 0, 0); + // Disable all controls except cancel + EnableControls(FALSE); + InitProgress(FALSE); + format_thid = CreateThread(NULL, 0, SumThread, NULL, 0, NULL); + if (format_thid != NULL) { + PrintInfo(0, -1); + timer = 0; + safe_sprintf(szTimer, sizeof(szTimer), "00:00:00"); + SendMessageA(hStatus, SB_SETTEXTA, SBT_OWNERDRAW | SB_SECTION_RIGHT, (LPARAM)szTimer); + SetTimer(hMainDialog, TID_APP_TIMER, 1000, ClockTimer); + } else { + uprintf("Unable to start checksum thread"); + FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_CANT_START_THREAD); + PostMessage(hMainDialog, UM_FORMAT_COMPLETED, (WPARAM)FALSE, 0); + format_op_in_progress = FALSE; + } + } + } + break; + case WM_COMMAND: if ((LOWORD(wParam) >= UM_LANGUAGE_MENU) && (LOWORD(wParam) < UM_LANGUAGE_MENU_MAX)) { selected_language = LOWORD(wParam) - UM_LANGUAGE_MENU; @@ -2391,8 +2438,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA PrintInfo(0, -1); timer = 0; safe_sprintf(szTimer, sizeof(szTimer), "00:00:00"); - SendMessageA(GetDlgItem(hMainDialog, IDC_STATUS), SB_SETTEXTA, - SBT_OWNERDRAW | 1, (LPARAM)szTimer); + SendMessageA(hStatus, SB_SETTEXTA, SBT_OWNERDRAW | SB_SECTION_RIGHT, (LPARAM)szTimer); SetTimer(hMainDialog, TID_APP_TIMER, 1000, ClockTimer); } if (format_thid == NULL) @@ -2922,37 +2968,6 @@ relaunch: GetUSBDevices(0); continue; } - // Alt-M => Compute Message Digests (MD5, SHA-1) on the current image - if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'M')) { - if ((format_thid != NULL) || (image_path == NULL)) - continue; - FormatStatus = 0; - format_op_in_progress = TRUE; - no_confirmation_on_cancel = TRUE; - // Reset all progress bars - SendMessage(hProgress, PBM_SETSTATE, (WPARAM)PBST_NORMAL, 0); - SetTaskbarProgressState(TASKBAR_NORMAL); - SetTaskbarProgressValue(0, MAX_PROGRESS); - SendMessage(hProgress, PBM_SETPOS, 0, 0); - // Disable all controls except cancel - EnableControls(FALSE); - InitProgress(FALSE); - format_thid = CreateThread(NULL, 0, SumThread, NULL, 0, NULL); - if (format_thid != NULL) { - PrintInfo(0, -1); - timer = 0; - safe_sprintf(szTimer, sizeof(szTimer), "00:00:00"); - SendMessageA(GetDlgItem(hMainDialog, IDC_STATUS), SB_SETTEXTA, - SBT_OWNERDRAW | 1, (LPARAM)szTimer); - SetTimer(hMainDialog, TID_APP_TIMER, 1000, ClockTimer); - } else { - uprintf("Unable to start checksum thread"); - FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | APPERR(ERROR_CANT_START_THREAD); - PostMessage(hMainDialog, UM_FORMAT_COMPLETED, (WPARAM)FALSE, 0); - format_op_in_progress = FALSE; - } - continue; - } // Alt N => Enable NTFS compression if ((msg.message == WM_SYSKEYDOWN) && (msg.wParam == 'N')) { enable_ntfs_compression = !enable_ntfs_compression; @@ -3020,7 +3035,7 @@ relaunch: PrintInfo(0, -1); timer = 0; safe_sprintf(szTimer, sizeof(szTimer), "00:00:00"); - SendMessageA(GetDlgItem(hMainDialog, IDC_STATUS), SB_SETTEXTA, SBT_OWNERDRAW | 1, (LPARAM)szTimer); + SendMessageA(hStatus, SB_SETTEXTA, SBT_OWNERDRAW | SB_SECTION_RIGHT, (LPARAM)szTimer); SetTimer(hMainDialog, TID_APP_TIMER, 1000, ClockTimer); } else { uprintf("Unable to start VHD save thread"); diff --git a/src/rufus.h b/src/rufus.h index 03470392..4c511f98 100644 --- a/src/rufus.h +++ b/src/rufus.h @@ -152,6 +152,15 @@ typedef struct { Callback_t callback; } notification_info; // To provide a "More info..." on notifications +/* Status Bar sections */ +#define SB_SECTION_LEFT 0 +#define SB_SECTION_MIDDLE 1 +#define SB_SECTION_RIGHT 2 + +/* Distance, from the right border, of the Status Bar separators */ +#define SB_EDGE_1 77.0f +#define SB_EDGE_2 58.0f + /* Timers used throughout the program */ enum timer_type { TID_MESSAGE_INFO = 0x1000, diff --git a/src/rufus.rc b/src/rufus.rc index 19b8453e..0f0f179b 100644 --- a/src/rufus.rc +++ b/src/rufus.rc @@ -32,7 +32,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL IDD_DIALOG DIALOGEX 12, 12, 242, 376 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Rufus 2.3.686" +CAPTION "Rufus 2.3.687" FONT 8, "Segoe UI", 400, 0, 0x1 BEGIN LTEXT "Device",IDS_DEVICE_TXT,9,6,200,8 @@ -157,7 +157,7 @@ END IDD_DIALOG_XP DIALOGEX 12, 12, 242, 376 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Rufus 2.3.686" +CAPTION "Rufus 2.3.687" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN LTEXT "Device",IDS_DEVICE_TXT,9,6,200,8 @@ -283,7 +283,7 @@ END IDD_DIALOG_RTL DIALOGEX 12, 12, 242, 376 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_RTLREADING | WS_EX_APPWINDOW | WS_EX_LAYOUTRTL -CAPTION "Rufus 2.3.686" +CAPTION "Rufus 2.3.687" FONT 8, "Segoe UI", 400, 0, 0x1 BEGIN LTEXT "Device",IDS_DEVICE_TXT,9,6,200,8 @@ -415,7 +415,7 @@ END IDD_DIALOG_RTL_XP DIALOGEX 12, 12, 242, 376 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_RTLREADING | WS_EX_APPWINDOW | WS_EX_LAYOUTRTL -CAPTION "Rufus 2.3.686" +CAPTION "Rufus 2.3.687" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN LTEXT "Device",IDS_DEVICE_TXT,9,6,200,8 @@ -671,8 +671,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 2,3,686,0 - PRODUCTVERSION 2,3,686,0 + FILEVERSION 2,3,687,0 + PRODUCTVERSION 2,3,687,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -689,13 +689,13 @@ BEGIN BEGIN VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" VALUE "FileDescription", "Rufus" - VALUE "FileVersion", "2.3.686" + VALUE "FileVersion", "2.3.687" VALUE "InternalName", "Rufus" VALUE "LegalCopyright", "© 2011-2015 Pete Batard (GPL v3)" VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" VALUE "OriginalFilename", "rufus.exe" VALUE "ProductName", "Rufus" - VALUE "ProductVersion", "2.3.686" + VALUE "ProductVersion", "2.3.687" END END BLOCK "VarFileInfo" diff --git a/src/stdlg.c b/src/stdlg.c index 0a2e19ae..e39d95e1 100644 --- a/src/stdlg.c +++ b/src/stdlg.c @@ -401,17 +401,22 @@ fallback: void CreateStatusBar(void) { RECT rect; - int edge[2]; + int edge[3]; // Create the status bar. hStatus = CreateWindowEx(0, STATUSCLASSNAME, NULL, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hMainDialog, (HMENU)IDC_STATUS, hMainInstance, NULL); - // Create 2 status areas + // Create 3 status areas GetClientRect(hMainDialog, &rect); - edge[0] = rect.right - (int)(58.0f*fScale); - edge[1] = rect.right; - SendMessage(hStatus, SB_SETPARTS, (WPARAM) 2, (LPARAM)&edge); + edge[0] = rect.right - (int)(SB_EDGE_1 * fScale); + edge[1] = rect.right - (int)(SB_EDGE_2 * fScale); + edge[2] = rect.right; + SendMessage(hStatus, SB_SETPARTS, (WPARAM) ARRAYSIZE(edge), (LPARAM)&edge); + + // NB: To add an icon on the status bar, you can use something like this: +// SendMessage(hStatus, SB_SETICON, (WPARAM) 1, (LPARAM)LoadImage(GetLibraryHandle("rasdlg"), +// MAKEINTRESOURCE(50), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR | LR_SHARED)); } /*