[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34501] trunk/blender/intern/ghost: Apply part of patch [#25612] Windows 7 icon progress bar

Nathan Letwory nathan at letworyinteractive.com
Wed Jan 26 13:23:03 CET 2011


Revision: 34501
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=34501
Author:   jesterking
Date:     2011-01-26 12:23:02 +0000 (Wed, 26 Jan 2011)
Log Message:
-----------
Apply part of patch [#25612] Windows 7 icon progress bar
Submitted by Alexander Kuznetsov.

This adds the progress bar to the taskbar item of Blender for Windows 7.
Small change in version retrieval, otherwise as is.

Modified Paths:
--------------
    trunk/blender/intern/ghost/CMakeLists.txt
    trunk/blender/intern/ghost/intern/GHOST_WindowWin32.cpp
    trunk/blender/intern/ghost/intern/GHOST_WindowWin32.h

Added Paths:
-----------
    trunk/blender/intern/ghost/intern/GHOST_TaskbarWin32.h

Modified: trunk/blender/intern/ghost/CMakeLists.txt
===================================================================
--- trunk/blender/intern/ghost/CMakeLists.txt	2011-01-26 12:19:19 UTC (rev 34500)
+++ trunk/blender/intern/ghost/CMakeLists.txt	2011-01-26 12:23:02 UTC (rev 34501)
@@ -153,6 +153,7 @@
 		intern/GHOST_SystemWin32.h
 		intern/GHOST_SystemPathsWin32.h
 		intern/GHOST_WindowWin32.h
+		intern/GHOST_TaskbarWin32.h
 	)
 endif()
 

Added: trunk/blender/intern/ghost/intern/GHOST_TaskbarWin32.h
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_TaskbarWin32.h	                        (rev 0)
+++ trunk/blender/intern/ghost/intern/GHOST_TaskbarWin32.h	2011-01-26 12:23:02 UTC (rev 34501)
@@ -0,0 +1,73 @@
+#ifndef GHOST_TASKBARWIN32_H_
+#define GHOST_TASKBARWIN32_H_
+#ifndef WIN32
+#error WIN32 only!
+#endif // WIN32
+
+#include <windows.h>
+#include <shlobj.h>
+
+/* MinGW needs it */
+#ifdef FREE_WINDOWS
+#ifdef WINVER
+#undef WINVER
+#endif
+#define WINVER 0x0501
+#endif /* FREE_WINDOWS */
+
+// ITaskbarList, ITaskbarList2 and ITaskbarList3 might be missing, present here in that case.
+// Note, ITaskbarList3 is supported only since Windows 7, though. Check for that is done in
+// GHOST_WindowWin32
+#ifndef __ITaskbarList_INTERFACE_DEFINED__
+#define __ITaskbarList_INTERFACE_DEFINED__
+	extern "C" {const GUID CLSID_TaskbarList = {0x56FDF344, 0xFD6D, 0x11D0, {0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90} };
+				const GUID IID_ITaskbarList  = {0x56FDF342, 0xFD6D, 0x11D0, {0x95, 0x8A, 0x00, 0x60, 0x97, 0xC9, 0xA0, 0x90} }; }
+    class ITaskbarList : public IUnknown
+    {
+    public:
+        virtual HRESULT STDMETHODCALLTYPE HrInit		(void) = 0;
+        virtual HRESULT STDMETHODCALLTYPE AddTab		(HWND hwnd) = 0;
+        virtual HRESULT STDMETHODCALLTYPE DeleteTab		(HWND hwnd) = 0;
+        virtual HRESULT STDMETHODCALLTYPE ActivateTab	(HWND hwnd) = 0;
+        virtual HRESULT STDMETHODCALLTYPE SetActiveAlt	(HWND hwnd) = 0;   
+    };
+#endif 	/* ITaskbarList */
+
+#ifndef __ITaskbarList2_INTERFACE_DEFINED__
+#define __ITaskbarList2_INTERFACE_DEFINED__
+	extern "C" {const GUID IID_ITaskbarList2 = {0x602D4995, 0xB13A, 0x429b, {0xA6, 0x6E, 0x19, 0x35, 0xE4, 0x4F, 0x43, 0x17} }; }
+    class ITaskbarList2 : public ITaskbarList
+    {
+    public:
+        virtual HRESULT STDMETHODCALLTYPE MarkFullscreenWindow(HWND hwnd, BOOL fFullscreen) = 0;    
+    };
+#endif 	/* ITaskbarList2 */
+
+#ifndef __ITaskbarList3_INTERFACE_DEFINED__
+#define __ITaskbarList3_INTERFACE_DEFINED__
+typedef enum THUMBBUTTONFLAGS {THBF_ENABLED = 0, THBF_DISABLED = 0x1, THBF_DISMISSONCLICK = 0x2, THBF_NOBACKGROUND = 0x4, THBF_HIDDEN = 0x8, THBF_NONINTERACTIVE = 0x10} THUMBBUTTONFLAGS;
+typedef enum THUMBBUTTONMASK {THB_BITMAP = 0x1, THB_ICON = 0x2, THB_TOOLTIP = 0x4, THB_FLAGS = 0x8} THUMBBUTTONMASK;
+typedef struct THUMBBUTTON {THUMBBUTTONMASK dwMask; UINT iId; UINT iBitmap; HICON hIcon; WCHAR szTip[260]; THUMBBUTTONFLAGS dwFlags; } THUMBBUTTON;
+typedef enum TBPFLAG  {TBPF_NOPROGRESS = 0, TBPF_INDETERMINATE = 0x1, TBPF_NORMAL = 0x2, TBPF_ERROR = 0x4, TBPF_PAUSED = 0x8 } TBPFLAG;
+#define THBN_CLICKED  0x1800	
+	extern "C" {const GUID IID_ITaskList3 = { 0xEA1AFB91, 0x9E28, 0x4B86, {0x90, 0xE9, 0x9E, 0x9F, 0x8A, 0x5E, 0xEF, 0xAF} };}
+
+    class ITaskbarList3 : public ITaskbarList2
+    {
+    public:
+		virtual HRESULT STDMETHODCALLTYPE SetProgressValue		(HWND hwnd, ULONGLONG ullCompleted, ULONGLONG ullTotal) = 0;
+		virtual HRESULT STDMETHODCALLTYPE SetProgressState		(HWND hwnd, TBPFLAG tbpFlags) = 0;
+		virtual HRESULT STDMETHODCALLTYPE RegisterTab			(HWND hwndTab, HWND hwndMDI) = 0;
+		virtual HRESULT STDMETHODCALLTYPE UnregisterTab			(HWND hwndTab) = 0;
+		virtual HRESULT STDMETHODCALLTYPE SetTabOrder			(HWND hwndTab,  HWND hwndInsertBefore) = 0;
+		virtual HRESULT STDMETHODCALLTYPE SetTabActive			(HWND hwndTab,  HWND hwndMDI, DWORD dwReserved) = 0;
+		virtual HRESULT STDMETHODCALLTYPE ThumbBarAddButtons	(HWND hwnd, UINT cButtons, THUMBBUTTON * pButton) = 0;
+		virtual HRESULT STDMETHODCALLTYPE ThumbBarUpdateButtons	(HWND hwnd, UINT cButtons, THUMBBUTTON * pButton) = 0;
+		virtual HRESULT STDMETHODCALLTYPE ThumbBarSetImageList	(HWND hwnd, HIMAGELIST himl) = 0; 
+		virtual HRESULT STDMETHODCALLTYPE SetOverlayIcon		(HWND hwnd, HICON hIcon, LPCWSTR pszDescription) = 0;
+		virtual HRESULT STDMETHODCALLTYPE SetThumbnailTooltip	(HWND hwnd, LPCWSTR pszTip) = 0;
+		virtual HRESULT STDMETHODCALLTYPE SetThumbnailClip		(HWND hwnd, RECT *prcClip) = 0;
+    };
+#endif 	/* ITaskbarList3 */
+
+#endif /*GHOST_TASKBARWIN32_H_*/

Modified: trunk/blender/intern/ghost/intern/GHOST_WindowWin32.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_WindowWin32.cpp	2011-01-26 12:19:19 UTC (rev 34500)
+++ trunk/blender/intern/ghost/intern/GHOST_WindowWin32.cpp	2011-01-26 12:23:02 UTC (rev 34501)
@@ -139,6 +139,26 @@
 	m_stereo(stereoVisual),
 	m_nextWindow(NULL)
 {
+	OSVERSIONINFOEX versionInfo;
+	bool hasMinVersionForTaskbar = false;
+	
+	ZeroMemory(&versionInfo, sizeof(OSVERSIONINFOEX));
+	
+	versionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
+	
+	if(!GetVersionEx((OSVERSIONINFO *)&versionInfo)) {
+		versionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+		if(GetVersionEx((OSVERSIONINFO*)&versionInfo)) {
+			if(versionInfo.dwMajorVersion>=6 && versionInfo.dwMinorVersion>=1) {
+				hasMinVersionForTaskbar = true;
+			}
+		}
+	} else {
+		if(versionInfo.dwMajorVersion>=6 && versionInfo.dwMinorVersion>=1) {
+			hasMinVersionForTaskbar = true;
+		}
+	}
+
 	if (state != GHOST_kWindowStateFullScreen) {
 		RECT rect;
 		MONITORINFO monitor;
@@ -308,11 +328,22 @@
 			}
 		}
 	}
+
+	if(hasMinVersionForTaskbar)
+		CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList ,(LPVOID*)&m_Bar);
+	else
+		m_Bar=NULL;
 }
 
 
 GHOST_WindowWin32::~GHOST_WindowWin32()
 {
+	if(m_Bar)
+	{
+		m_Bar->SetProgressState(m_hWnd, TBPF_NOPROGRESS);
+		m_Bar->Release();
+	};
+
 	if (m_wintab) {
 		GHOST_WIN32_WTClose fpWTClose = ( GHOST_WIN32_WTClose ) ::GetProcAddress( m_wintab, "WTClose" );
 		if (fpWTClose) {
@@ -1103,6 +1134,23 @@
 }
 
 
+GHOST_TSuccess GHOST_WindowWin32::setProgressBar(float progress)
+{	
+	/*SetProgressValue sets state to TBPF_NORMAL automaticly*/
+	if(m_Bar && S_OK == m_Bar->SetProgressValue(m_hWnd,10000*progress,10000))
+		return GHOST_kSuccess;
+
+	return GHOST_kFailure;
+}
+
+GHOST_TSuccess GHOST_WindowWin32::endProgressBar()
+{
+	if(m_Bar && S_OK == m_Bar->SetProgressState(m_hWnd,TBPF_NOPROGRESS))
+		return GHOST_kSuccess;
+
+	return GHOST_kFailure;
+}
+
 /*  Ron Fosner's code for weighting pixel formats and forcing software.
 	See http://www.opengl.org/resources/faq/technical/weight.cpp */
 

Modified: trunk/blender/intern/ghost/intern/GHOST_WindowWin32.h
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_WindowWin32.h	2011-01-26 12:19:19 UTC (rev 34500)
+++ trunk/blender/intern/ghost/intern/GHOST_WindowWin32.h	2011-01-26 12:23:02 UTC (rev 34501)
@@ -39,7 +39,18 @@
 
 #include "GHOST_Window.h"
 
+/* MinGW needs it */
+#ifdef FREE_WINDOWS
+#ifdef WINVER
+#undef WINVER
+#endif
+#define WINVER 0x0501
+#endif
+
+
+
 #include <windows.h>
+#include "GHOST_TaskbarWin32.h"
 
 
 #include <wintab.h>
@@ -218,6 +229,17 @@
 	virtual GHOST_TSuccess invalidate();
 
 	/**
+     * Sets the progress bar value displayed in the window/application icon
+	 * @param progress The progress %
+	 */
+	virtual GHOST_TSuccess setProgressBar(float progress);
+	
+	/**
+	 * Hides the progress bar in the icon
+	 */
+	virtual GHOST_TSuccess endProgressBar();
+	
+	/**
 	 * Returns the name of the window class.
 	 * @return The name of the window class.
 	 */
@@ -324,6 +346,9 @@
 	/** HCURSOR structure of the custom cursor */
 	HCURSOR m_customCursor;
 
+	/** ITaskbarList3 structure for progress bar*/
+	ITaskbarList3 * m_Bar;
+
 	static LPCSTR s_windowClassName;
 	static const int s_maxTitleLength;
 




More information about the Bf-blender-cvs mailing list