OSDN Git Service

Added support for Visual Studio 2017.9 (v15.9.4).
[mutilities/MUtilities.git] / src / Taskbar7_Win32.cpp
index d95abab..2e63f11 100644 (file)
@@ -1,6 +1,6 @@
 ///////////////////////////////////////////////////////////////////////////////
-// LameXP - Audio Encoder Front-End
-// Copyright (C) 2004-2014 LoRd_MuldeR <MuldeR2@GMX.de>
+// MuldeR's Utilities for Qt
+// Copyright (C) 2004-2018 LoRd_MuldeR <MuldeR2@GMX.de>
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
 // http://www.gnu.org/licenses/gpl-2.0.txt
 ///////////////////////////////////////////////////////////////////////////////
 
-//Internal
+//MUtils
 #include <MUtils/Taskbar7.h>
+#include <MUtils/OSSupport.h>
 #include <MUtils/Exception.h>
 
+//Internal
+#include "Utils_Win32.h"
+
 //Qt
 #include <QWidget>
 #include <QIcon>
+#if QT_VERSION > QT_VERSION_CHECK(5,0,0)
+#include <QtWinExtras>
+#endif
 
 //Windows includes
 #define NOMINMAX
 
 #define INITIALIZE_TASKBAR() do \
 { \
-       if(!initialize()) \
+       if(!p->supported) \
+       { \
+               return false; \
+       } \
+       if(!(MUTILS_BOOLIFY(p->initialized) || initialize())) \
        { \
                qWarning("Taskbar initialization failed!"); \
                return false; \
@@ -59,8 +70,14 @@ namespace MUtils
                friend class Taskbar7;
 
        protected:
+               Taskbar7_Private(void)
+               {
+                       taskbarList = NULL;
+               }
+
                ITaskbarList3 *taskbarList;
-               volatile bool initialized;
+               QAtomicInt supported;
+               QAtomicInt initialized;
        };
 }
 
@@ -73,13 +90,21 @@ MUtils::Taskbar7::Taskbar7(QWidget *const window)
        p(new Taskbar7_Private()),
        m_window(window)
 {
-       p->taskbarList = NULL;
-       p->initialized = false;
-
        if(!m_window)
        {
                MUTILS_THROW("Taskbar7: Window pointer must not be NULL!");
        }
+       if (!p->supported)
+       {
+               if (OS::os_version() >= OS::Version::WINDOWS_WIN70)
+               {
+                       p->supported.ref();
+               }
+               else
+               {
+                       qWarning("Taskbar7: Taskbar progress not supported on this platform.");
+               }
+       }
 }
 
 MUtils::Taskbar7::~Taskbar7(void)
@@ -136,7 +161,19 @@ bool MUtils::Taskbar7::setTaskbarProgress(const quint64 &currentValue, const qui
 bool MUtils::Taskbar7::setOverlayIcon(const QIcon *const icon, const QString &info)
 {
        INITIALIZE_TASKBAR();
-       const HRESULT result = p->taskbarList->SetOverlayIcon(m_window->winId(), (icon ? icon->pixmap(16,16).toWinHICON() : NULL), MUTILS_WCHR(info));
+       HRESULT result = HRESULT(-1);
+       if(icon)
+       {
+               if(const HICON hIcon = (HICON)MUtils::Win32Utils::qicon_to_hicon(icon, 16, 16))
+               {
+                       result = p->taskbarList->SetOverlayIcon(reinterpret_cast<HWND>(m_window->winId()), hIcon, MUTILS_WCHR(info));
+                       DestroyIcon(hIcon);
+               }
+       }
+       else
+       {
+               result = p->taskbarList->SetOverlayIcon(reinterpret_cast<HWND>(m_window->winId()), NULL, MUTILS_WCHR(info));
+       }
        return SUCCEEDED(result);
 }
 
@@ -158,7 +195,7 @@ bool MUtils::Taskbar7::initialize(void)
                p->taskbarList = ptbl;
        }
 
-       while(!p->initialized)
+       if(!p->initialized)
        {
                bool okay = false;
                for(int i = 0; i < 8; i++)
@@ -175,7 +212,7 @@ bool MUtils::Taskbar7::initialize(void)
                        qWarning("ITaskbarList3::HrInit() has failed!");
                        return false;
                }
-               p->initialized = true;
+               p->initialized.ref(); /*success*/
        }
 
        return true;