Win32: add support for Win 7 taskbar thumbnails
authorGeoffroy Couprie <geal@videolan.org>
Mon, 7 Sep 2009 14:39:41 +0000 (16:39 +0200)
committerGeoffroy Couprie <geal@videolan.org>
Mon, 7 Sep 2009 14:43:58 +0000 (16:43 +0200)
modules/gui/qt4/components/interface_widgets.cpp
modules/video_output/msw/events.c

index 18a3701..d134256 100644 (file)
@@ -241,6 +241,34 @@ void VideoWidget::release( void )
 {
     msg_Dbg( p_intf, "Video is not needed anymore" );
     //layout->removeWidget( reparentable );
 {
     msg_Dbg( p_intf, "Video is not needed anymore" );
     //layout->removeWidget( reparentable );
+
+#ifdef WIN32
+    /* Come back to default thumbnail for Windows 7 taskbar */
+    LPTASKBARLIST3 p_taskbl;
+    OSVERSIONINFO winVer;
+    winVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+    if( GetVersionEx(&winVer) && winVer.dwMajorVersion > 5 && winVer.dwMajorVersion > 0 )
+    {
+        CoInitialize( 0 );
+
+        if( S_OK == CoCreateInstance( &clsid_ITaskbarList,
+                    NULL, CLSCTX_INPROC_SERVER,
+                    &IID_ITaskbarList3,
+                    (void **)&p_taskbl) )
+        {
+            p_taskbl->vt->HrInit(p_taskbl);
+
+            HWND hroot = GetAncestor(reparentable->winId(),GA_ROOT);
+
+            if (S_OK != p_taskbl->vt->SetThumbnailClip(p_taskbl, hroot, NULL))
+                msg_Err(p_intf, "SetThumbNailClip failed");
+            msg_Err(p_intf, "Releasing taskbar | root handle = %08x", hroot);
+            p_taskbl->vt->Release(p_taskbl);
+        }
+        CoUninitialize();
+    }
+#endif
+
     delete reparentable;
     reparentable = NULL;
     videoSize.rwidth() = 0;
     delete reparentable;
     reparentable = NULL;
     videoSize.rwidth() = 0;
index 7e263c7..365ee1a 100644 (file)
 #include <vlc_keys.h>
 #include "vout.h"
 
 #include <vlc_keys.h>
 #include "vout.h"
 
+#ifndef UNDER_CE
+#include <vlc_windows_interfaces.h>
+#endif
+
 #ifdef UNDER_CE
 #include <aygshell.h>
     //WINSHELLAPI BOOL WINAPI SHFullScreen(HWND hwndRequester, DWORD dwState);
 #ifdef UNDER_CE
 #include <aygshell.h>
     //WINSHELLAPI BOOL WINAPI SHFullScreen(HWND hwndRequester, DWORD dwState);
@@ -793,6 +797,39 @@ void UpdateRects( vout_thread_t *p_vout, bool b_force )
         DirectDrawUpdateOverlay( p_vout );
 #endif
 
         DirectDrawUpdateOverlay( p_vout );
 #endif
 
+#ifndef UNDER_CE
+    /* Windows 7 taskbar thumbnail code */
+    LPTASKBARLIST3 p_taskbl;
+    OSVERSIONINFO winVer;
+    winVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+    if( GetVersionEx(&winVer) && winVer.dwMajorVersion > 5 && winVer.dwMajorVersion > 0 )
+    {
+        CoInitialize( 0 );
+
+        if( S_OK == CoCreateInstance( &clsid_ITaskbarList,
+                    NULL, CLSCTX_INPROC_SERVER,
+                    &IID_ITaskbarList3,
+                    (void **)&p_taskbl) )
+        {
+            RECT rect_video, rect_parent, rect_relative;
+            HWND hroot = GetAncestor(p_vout->p_sys->hwnd,GA_ROOT);
+
+            p_taskbl->vt->HrInit(p_taskbl);
+            GetWindowRect(p_vout->p_sys->hvideownd, &rect_video);
+            GetWindowRect(hroot, &rect_parent);
+            rect_relative.left = rect_video.left - rect_parent.left - 8;
+            rect_relative.right = rect_video.right - rect_video.left + rect_relative.left;
+            rect_relative.top = rect_video.top - rect_parent.top - 10;
+            rect_relative.bottom = rect_video.bottom - rect_video.top + rect_relative.top - 25;
+
+            if (S_OK != p_taskbl->vt->SetThumbnailClip(p_taskbl, hroot, &rect_relative))
+                msg_Err( p_vout, "SetThumbNailClip failed");
+
+            p_taskbl->vt->Release(p_taskbl);
+        }
+        CoUninitialize();
+    }
+#endif
     /* Signal the change in size/position */
     p_vout->p_sys->i_changes |= DX_POSITION_CHANGE;
 
     /* Signal the change in size/position */
     p_vout->p_sys->i_changes |= DX_POSITION_CHANGE;