mirror of
				https://github.com/pbatard/rufus.git
				synced 2024-08-14 23:57:05 +00:00 
			
		
		
		
	[ui] Display progress on the Windows 7 taskbar icon
* Also updates dialog progress handling * Closes #72
This commit is contained in:
		
							parent
							
								
									98ff7a931a
								
							
						
					
					
						commit
						8d2fd913b0
					
				
					 4 changed files with 169 additions and 21 deletions
				
			
		
							
								
								
									
										50
									
								
								src/rufus.c
									
										
									
									
									
								
							
							
						
						
									
										50
									
								
								src/rufus.c
									
										
									
									
									
								
							|  | @ -39,6 +39,20 @@ | |||
| #include "rufus.h" | ||||
| #include "sys_types.h" | ||||
| 
 | ||||
| /* Redefinitions for the WDK */ | ||||
| #ifndef PBM_SETSTATE | ||||
| #define PBM_SETSTATE (WM_USER+16) | ||||
| #endif | ||||
| #ifndef PBST_NORMAL | ||||
| #define PBST_NORMAL 1 | ||||
| #endif | ||||
| #ifndef PBST_ERROR | ||||
| #define PBST_ERROR 2 | ||||
| #endif | ||||
| #ifndef PBST_PAUSED | ||||
| #define PBST_PAUSED 3 | ||||
| #endif | ||||
| 
 | ||||
| static const char* FileSystemLabel[FS_MAX] = { "FAT", "FAT32", "NTFS", "exFAT" }; | ||||
| // Don't ask me - just following the MS standard here
 | ||||
| static const char* ClusterSizeLabel[] = { "512 bytes", "1024 bytes","2048 bytes","4096 bytes","8192 bytes", | ||||
|  | @ -783,6 +797,7 @@ void UpdateProgress(int op, float percent) | |||
| 	} | ||||
| 
 | ||||
| 	SendMessage(hProgress, PBM_SETPOS, (WPARAM)pos, 0); | ||||
| 	SetTaskbarProgressValue(pos, MAX_PROGRESS); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  | @ -1165,9 +1180,11 @@ void InitDialog(HWND hDlg) | |||
| 
 | ||||
| 	// Prefer FreeDOS to MS-DOS
 | ||||
| 	selection_default = DT_FREEDOS; | ||||
| 
 | ||||
| 	// Create the status line
 | ||||
| 	// Create the status line and initialize the taskbar icon for progress overlay
 | ||||
| 	CreateStatusBar(); | ||||
| 	CreateTaskbarList(); | ||||
| 	SetTaskbarProgressState(TASKBAR_NORMAL); | ||||
| 
 | ||||
| 	// Use maximum granularity for the progress bar
 | ||||
| 	SendMessage(hProgress, PBM_SETRANGE, 0, MAX_PROGRESS<<16); | ||||
| 	// Fill up the passes
 | ||||
|  | @ -1445,6 +1462,10 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA | |||
| 				_snwprintf(wstr, ARRAYSIZE(wstr), L"WARNING: ALL DATA ON DEVICE %s\r\nWILL BE DESTROYED.\r\n" | ||||
| 					L"To continue with this operation, click OK. To quit click CANCEL.", wtmp); | ||||
| 				if (MessageBoxW(hMainDialog, wstr, L"Rufus", MB_OKCANCEL|MB_ICONWARNING) == IDOK) { | ||||
| 					// Reset all progress bars
 | ||||
| 					SendMessage(hProgress, PBM_SETSTATE, (WPARAM)PBST_NORMAL, 0); | ||||
| 					SetTaskbarProgressState(TASKBAR_NORMAL); | ||||
| 					SetTaskbarProgressValue(0, MAX_PROGRESS); | ||||
| 					// Disable all controls except cancel
 | ||||
| 					EnableControls(FALSE); | ||||
| 					DeviceNum = (DWORD)ComboBox_GetItemData(hDeviceList, nDeviceIndex); | ||||
|  | @ -1494,21 +1515,22 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA | |||
| 		EnableControls(TRUE); | ||||
| 		GetUSBDevices(DeviceNum); | ||||
| 		if (!IS_ERROR(FormatStatus)) { | ||||
| 			PrintStatus(0, FALSE, "DONE"); | ||||
| 		} else if (SCODE_CODE(FormatStatus) == ERROR_CANCELLED) { | ||||
| 			PrintStatus(0, FALSE, "Cancelled"); | ||||
| 			Notification(MSG_INFO, "Cancelled", "Operation cancelled by the user."); | ||||
| 		} else { | ||||
| 			PrintStatus(0, FALSE, "FAILED"); | ||||
| 			Notification(MSG_ERROR, "Error", "Error: %s", StrError(FormatStatus)); | ||||
| 		} | ||||
| 		if (FormatStatus) { | ||||
| 			SendMessage(hProgress, PBM_SETPOS, 0, 0); | ||||
| 		} else { | ||||
| 			// This is the only way to achieve instantenous progress transition
 | ||||
| 			// This is the only way to achieve instantenous progress transition to 100%
 | ||||
| 			SendMessage(hProgress, PBM_SETRANGE, 0, (MAX_PROGRESS+1)<<16); | ||||
| 			SendMessage(hProgress, PBM_SETPOS, (MAX_PROGRESS+1), 0); | ||||
| 			SendMessage(hProgress, PBM_SETRANGE, 0, MAX_PROGRESS<<16); | ||||
| 			SetTaskbarProgressState(TASKBAR_NOPROGRESS); | ||||
| 			PrintStatus(0, FALSE, "DONE"); | ||||
| 		} else if (SCODE_CODE(FormatStatus) == ERROR_CANCELLED) { | ||||
| 			SendMessage(hProgress, PBM_SETSTATE, (WPARAM)PBST_PAUSED, 0); | ||||
| 			SetTaskbarProgressState(TASKBAR_PAUSED); | ||||
| 			PrintStatus(0, FALSE, "Cancelled"); | ||||
| 			Notification(MSG_INFO, "Cancelled", "Operation cancelled by the user."); | ||||
| 		} else { | ||||
| 			SendMessage(hProgress, PBM_SETSTATE, (WPARAM)PBST_ERROR, 0); | ||||
| 			SetTaskbarProgressState(TASKBAR_ERROR); | ||||
| 			PrintStatus(0, FALSE, "FAILED"); | ||||
| 			Notification(MSG_ERROR, "Error", "Error: %s", StrError(FormatStatus)); | ||||
| 		} | ||||
| 		return (INT_PTR)TRUE; | ||||
| 	} | ||||
|  |  | |||
							
								
								
									
										13
									
								
								src/rufus.h
									
										
									
									
									
								
							
							
						
						
									
										13
									
								
								src/rufus.h
									
										
									
									
									
								
							|  | @ -159,6 +159,16 @@ typedef struct { | |||
| 	BOOL uses_minint; | ||||
| } RUFUS_ISO_REPORT; | ||||
| 
 | ||||
| /* Duplication of the TBPFLAG enum for Windows 7 taskbar progress */ | ||||
| typedef enum TASKBAR_PROGRESS_FLAGS | ||||
| { | ||||
| 	TASKBAR_NOPROGRESS = 0, | ||||
| 	TASKBAR_INDETERMINATE = 0x1, | ||||
| 	TASKBAR_NORMAL = 0x2, | ||||
| 	TASKBAR_ERROR = 0x4, | ||||
| 	TASKBAR_PAUSED = 0x8 | ||||
| } TASKBAR_PROGRESS_FLAGS; | ||||
| 
 | ||||
| /*
 | ||||
|  * Globals | ||||
|  */ | ||||
|  | @ -187,6 +197,9 @@ extern void UpdateProgress(int op, float percent); | |||
| extern const char* StrError(DWORD error_code); | ||||
| extern void CenterDialog(HWND hDlg); | ||||
| extern void CreateStatusBar(void); | ||||
| extern BOOL CreateTaskbarList(void); | ||||
| extern BOOL SetTaskbarProgressState(TASKBAR_PROGRESS_FLAGS tbpFlags); | ||||
| extern BOOL SetTaskbarProgressValue(ULONGLONG ullCompleted, ULONGLONG ullTotal); | ||||
| extern INT_PTR CreateAboutBox(void); | ||||
| extern HWND CreateTooltip(HWND hControl, const char* message, int duration); | ||||
| extern void DestroyTooltip(HWND hWnd); | ||||
|  |  | |||
							
								
								
									
										12
									
								
								src/rufus.rc
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								src/rufus.rc
									
										
									
									
									
								
							|  | @ -30,7 +30,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL | |||
| IDD_DIALOG DIALOGEX 12, 12, 206, 289 | ||||
| STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU | ||||
| EXSTYLE WS_EX_APPWINDOW | ||||
| CAPTION "Rufus v1.2.0.163" | ||||
| CAPTION "Rufus v1.2.0.164" | ||||
| FONT 8, "MS Shell Dlg", 400, 0, 0x1 | ||||
| BEGIN | ||||
|     DEFPUSHBUTTON   "Start",IDC_START,94,248,50,14 | ||||
|  | @ -71,7 +71,7 @@ BEGIN | |||
|     DEFPUSHBUTTON   "OK",IDOK,231,175,50,14,WS_GROUP | ||||
|     CONTROL         "<a href=""http://rufus.akeo.ie"">http://rufus.akeo.ie</a>",IDC_ABOUT_RUFUS_URL, | ||||
|                     "SysLink",WS_TABSTOP,46,47,114,9 | ||||
|     LTEXT           "Version 1.2.0 (Build 163)",IDC_STATIC,46,19,78,8 | ||||
|     LTEXT           "Version 1.2.0 (Build 164)",IDC_STATIC,46,19,78,8 | ||||
|     PUSHBUTTON      "License...",IDC_ABOUT_LICENSE,46,175,50,14,WS_GROUP | ||||
|     EDITTEXT        IDC_ABOUT_COPYRIGHTS,46,107,235,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL | ||||
|     LTEXT           "Report bugs or request enhancements at:",IDC_STATIC,46,66,187,8 | ||||
|  | @ -216,8 +216,8 @@ END | |||
| // | ||||
| 
 | ||||
| VS_VERSION_INFO VERSIONINFO | ||||
|  FILEVERSION 1,2,0,163 | ||||
|  PRODUCTVERSION 1,2,0,163 | ||||
|  FILEVERSION 1,2,0,164 | ||||
|  PRODUCTVERSION 1,2,0,164 | ||||
|  FILEFLAGSMASK 0x3fL | ||||
| #ifdef _DEBUG | ||||
|  FILEFLAGS 0x1L | ||||
|  | @ -234,13 +234,13 @@ BEGIN | |||
|         BEGIN | ||||
|             VALUE "CompanyName", "akeo.ie" | ||||
|             VALUE "FileDescription", "Rufus" | ||||
|             VALUE "FileVersion", "1.2.0.163" | ||||
|             VALUE "FileVersion", "1.2.0.164" | ||||
|             VALUE "InternalName", "Rufus" | ||||
|             VALUE "LegalCopyright", "© 2011 Pete Batard (GPL v3)" | ||||
|             VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" | ||||
|             VALUE "OriginalFilename", "rufus.exe" | ||||
|             VALUE "ProductName", "Rufus" | ||||
|             VALUE "ProductVersion", "1.2.0.163" | ||||
|             VALUE "ProductVersion", "1.2.0.164" | ||||
|         END | ||||
|     END | ||||
|     BLOCK "VarFileInfo" | ||||
|  |  | |||
							
								
								
									
										113
									
								
								src/stdlg.c
									
										
									
									
									
								
							
							
						
						
									
										113
									
								
								src/stdlg.c
									
										
									
									
									
								
							|  | @ -831,3 +831,116 @@ LONG GetEntryWidth(HWND hDropDown, const char *entry) | |||
| 	free(wentry); | ||||
| 	return size.cx; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Windows 7 taskbar icon handling (progress bar overlay, etc) | ||||
|  * Some platforms don't have these, so we redefine | ||||
|  */ | ||||
| typedef enum MY_STPFLAG | ||||
| { | ||||
| 	MY_STPF_NONE = 0, | ||||
| 	MY_STPF_USEAPPTHUMBNAILALWAYS = 0x1, | ||||
| 	MY_STPF_USEAPPTHUMBNAILWHENACTIVE = 0x2, | ||||
| 	MY_STPF_USEAPPPEEKALWAYS = 0x4, | ||||
| 	MY_STPF_USEAPPPEEKWHENACTIVE = 0x8 | ||||
| } MY_STPFLAG; | ||||
| 
 | ||||
| typedef enum MY_THUMBBUTTONMASK | ||||
| { | ||||
| 	MY_THB_BITMAP = 0x1, | ||||
| 	MY_THB_ICON = 0x2, | ||||
| 	MY_THB_TOOLTIP = 0x4, | ||||
| 	MY_THB_FLAGS = 0x8 | ||||
| } MY_THUMBBUTTONMASK; | ||||
| 
 | ||||
| typedef enum MY_THUMBBUTTONFLAGS | ||||
| { | ||||
| 	MY_THBF_ENABLED = 0, | ||||
| 	MY_THBF_DISABLED = 0x1, | ||||
| 	MY_THBF_DISMISSONCLICK = 0x2, | ||||
| 	MY_THBF_NOBACKGROUND = 0x4, | ||||
| 	MY_THBF_HIDDEN = 0x8, | ||||
| 	MY_THBF_NONINTERACTIVE = 0x10 | ||||
| } MY_THUMBBUTTONFLAGS; | ||||
| 
 | ||||
| typedef struct MY_THUMBBUTTON | ||||
| { | ||||
| 	MY_THUMBBUTTONMASK dwMask; | ||||
| 	UINT iId; | ||||
| 	UINT iBitmap; | ||||
| 	HICON hIcon; | ||||
| 	WCHAR szTip[260]; | ||||
| 	MY_THUMBBUTTONFLAGS dwFlags; | ||||
| } MY_THUMBBUTTON; | ||||
| 
 | ||||
| /*
 | ||||
| typedef enum MY_TBPFLAG | ||||
| { | ||||
| 	TASKBAR_NOPROGRESS = 0, | ||||
| 	TASKBAR_INDETERMINATE = 0x1, | ||||
| 	TASKBAR_NORMAL = 0x2, | ||||
| 	TASKBAR_ERROR = 0x4, | ||||
| 	TASKBAR_PAUSED = 0x8 | ||||
| } MY_TBPFLAG; | ||||
| */ | ||||
| 
 | ||||
| #pragma push_macro("INTERFACE") | ||||
| #undef  INTERFACE | ||||
| #define INTERFACE my_ITaskbarList3 | ||||
| DECLARE_INTERFACE_(my_ITaskbarList3, IUnknown) { | ||||
| 	STDMETHOD (QueryInterface) (THIS_ REFIID riid, LPVOID *ppvObj) PURE; | ||||
| 	STDMETHOD_(ULONG, AddRef) (THIS) PURE; | ||||
| 	STDMETHOD_(ULONG, Release) (THIS) PURE; | ||||
| 	STDMETHOD (HrInit) (THIS) PURE; | ||||
| 	STDMETHOD (AddTab) (THIS_ HWND hwnd) PURE; | ||||
| 	STDMETHOD (DeleteTab) (THIS_ HWND hwnd) PURE; | ||||
| 	STDMETHOD (ActivateTab) (THIS_ HWND hwnd) PURE; | ||||
| 	STDMETHOD (SetActiveAlt) (THIS_ HWND hwnd) PURE; | ||||
| 	STDMETHOD (MarkFullscreenWindow) (THIS_ HWND hwnd, int fFullscreen) PURE; | ||||
| 	STDMETHOD (SetProgressValue) (THIS_ HWND hwnd, ULONGLONG ullCompleted, ULONGLONG ullTotal) PURE; | ||||
| 	STDMETHOD (SetProgressState) (THIS_ HWND hwnd, TASKBAR_PROGRESS_FLAGS tbpFlags) PURE; | ||||
| 	STDMETHOD (RegisterTab) (THIS_ HWND hwndTab,HWND hwndMDI) PURE; | ||||
| 	STDMETHOD (UnregisterTab) (THIS_ HWND hwndTab) PURE; | ||||
| 	STDMETHOD (SetTabOrder) (THIS_ HWND hwndTab, HWND hwndInsertBefore) PURE; | ||||
| 	STDMETHOD (SetTabActive) (THIS_ HWND hwndTab, HWND hwndMDI, DWORD dwReserved) PURE; | ||||
| 	STDMETHOD (ThumbBarAddButtons) (THIS_ HWND hwnd, UINT cButtons, MY_THUMBBUTTON* pButton) PURE; | ||||
| 	STDMETHOD (ThumbBarUpdateButtons) (THIS_ HWND hwnd, UINT cButtons, MY_THUMBBUTTON* pButton) PURE; | ||||
| 	STDMETHOD (ThumbBarSetImageList) (THIS_ HWND hwnd, HIMAGELIST himl) PURE; | ||||
| 	STDMETHOD (SetOverlayIcon) (THIS_ HWND hwnd, HICON hIcon, LPCWSTR pszDescription) PURE; | ||||
| 	STDMETHOD (SetThumbnailTooltip) (THIS_ HWND hwnd, LPCWSTR pszTip) PURE; | ||||
| 	STDMETHOD (SetThumbnailClip) (THIS_ HWND hwnd, RECT *prcClip) PURE; | ||||
| }; | ||||
| const IID my_IID_ITaskbarList3 =  | ||||
| 	{ 0xea1afb91, 0x9e28, 0x4b86, { 0x90, 0xe9, 0x9e, 0x9f, 0x8a, 0x5e, 0xef, 0xaf } }; | ||||
| const IID my_CLSID_TaskbarList =  | ||||
| 	{ 0x56fdf344, 0xfd6d, 0x11d0, { 0x95, 0x8a ,0x0, 0x60, 0x97, 0xc9, 0xa0 ,0x90 } }; | ||||
| 
 | ||||
| static my_ITaskbarList3* ptbl = NULL; | ||||
| 
 | ||||
| BOOL CreateTaskbarList(void) | ||||
| { | ||||
| 	HRESULT hr; | ||||
| 	// Create the taskbar icon progressbar
 | ||||
| 	hr = CoCreateInstance(&my_CLSID_TaskbarList, NULL, CLSCTX_ALL, &my_IID_ITaskbarList3, (LPVOID)&ptbl); | ||||
| 	if (FAILED(hr)) { | ||||
| 		uprintf("CoCreateInstance for TaskbarList failed: error %X", hr); | ||||
| 		ptbl = NULL; | ||||
| 		return FALSE; | ||||
| 	} | ||||
| 	return TRUE; | ||||
| } | ||||
| 
 | ||||
| BOOL SetTaskbarProgressState(TASKBAR_PROGRESS_FLAGS tbpFlags) | ||||
| { | ||||
| 	if (ptbl == NULL) | ||||
| 		return FALSE; | ||||
| 	return !FAILED(ptbl->lpVtbl->SetProgressState(ptbl, hMainDialog, tbpFlags)); | ||||
| } | ||||
| 
 | ||||
| BOOL SetTaskbarProgressValue(ULONGLONG ullCompleted, ULONGLONG ullTotal) | ||||
| { | ||||
| 	if (ptbl == NULL) | ||||
| 		return FALSE; | ||||
| 	return !FAILED(ptbl->lpVtbl->SetProgressValue(ptbl, hMainDialog, ullCompleted, ullTotal)); | ||||
| } | ||||
| #pragma pop_macro("INTERFACE") | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue