aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2016-05-24 10:23:36 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2016-05-25 13:00:19 +0000
commitdecbd7c63334e97ace549ffcb7d2f6fe5eeb5640 (patch)
tree3446c47e0b6caf26cdc756f391b2707a61ce4b7a /src
parent4d28fcdb35a1412ce06f460227bf762bff8af892 (diff)
Increase API level to 0x600 (Windows Vista).
Directly link against dwmapi which should be present on Windows Vista and remove duplicated header constants. Only the functions for iconic live preview which are present on Windows 7 onwards are still dynamically resolved. Similarly, shell32 can now be directly linked, leaving SetCurrentProcessExplicitAppUserModelID() present on Windows 7 onwards. Task-number: QTBUG-51673 Change-Id: I54b6827d4582318542729fa43f73f2c4e41ec71f Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/winextras/qwinfunctions.cpp63
-rw-r--r--src/winextras/qwinfunctions_p.cpp28
-rw-r--r--src/winextras/qwinfunctions_p.h94
-rw-r--r--src/winextras/qwinjumplist.cpp20
-rw-r--r--src/winextras/qwinthumbnailtoolbar.cpp9
-rw-r--r--src/winextras/winextras.pro2
6 files changed, 66 insertions, 150 deletions
diff --git a/src/winextras/qwinfunctions.cpp b/src/winextras/qwinfunctions.cpp
index ad6430a..692bcb0 100644
--- a/src/winextras/qwinfunctions.cpp
+++ b/src/winextras/qwinfunctions.cpp
@@ -1430,9 +1430,7 @@ QColor QtWin::colorizationColor(bool *opaqueBlend)
DWORD colorization = 0;
BOOL dummy = false;
- qtDwmApiDll.init();
- if (qtDwmApiDll.dwmGetColorizationColor)
- qtDwmApiDll.dwmGetColorizationColor(&colorization, &dummy);
+ DwmGetColorizationColor(&colorization, &dummy);
if (opaqueBlend)
*opaqueBlend = dummy;
return QColor::fromRgba(colorization);
@@ -1552,8 +1550,8 @@ void QtWin::setWindowFlip3DPolicy(QWindow *window, QtWin::WindowFlip3DPolicy pol
HWND handle = reinterpret_cast<HWND>(window->winId());
// Policy should be defaulted first, bug or smth.
- DWORD value = qt_DWMFLIP3D_DEFAULT;
- QtDwmApiDll::setWindowAttribute(handle, qt_DWMWA_FLIP3D_POLICY, value);
+ DWORD value = DWMFLIP3D_DEFAULT;
+ QtDwmApiDll::setWindowAttribute(handle, DWMWA_FLIP3D_POLICY, value);
switch (policy) {
default :
@@ -1561,15 +1559,15 @@ void QtWin::setWindowFlip3DPolicy(QWindow *window, QtWin::WindowFlip3DPolicy pol
value = -1;
break;
case FlipExcludeBelow :
- value = qt_DWMFLIP3D_EXCLUDEBELOW;
+ value = DWMFLIP3D_EXCLUDEBELOW;
break;
case FlipExcludeAbove :
- value = qt_DWMFLIP3D_EXCLUDEABOVE;
+ value = DWMFLIP3D_EXCLUDEABOVE;
break;
}
- if (qt_DWMFLIP3D_DEFAULT != value)
- QtDwmApiDll::setWindowAttribute(handle, qt_DWMWA_FLIP3D_POLICY, value);
+ if (DWMFLIP3D_DEFAULT != value)
+ QtDwmApiDll::setWindowAttribute(handle, DWMWA_FLIP3D_POLICY, value);
}
/*!
@@ -1589,13 +1587,13 @@ QtWin::WindowFlip3DPolicy QtWin::windowFlip3DPolicy(QWindow *window)
const DWORD value =
QtDwmApiDll::windowAttribute<DWORD>(reinterpret_cast<HWND>(window->winId()),
- qt_DWMWA_FLIP3D_POLICY, DWORD(qt_DWMFLIP3D_DEFAULT));
+ DWMWA_FLIP3D_POLICY, DWORD(DWMFLIP3D_DEFAULT));
QtWin::WindowFlip3DPolicy policy = QtWin::FlipDefault;
switch (value) {
- case qt_DWMFLIP3D_EXCLUDEABOVE :
+ case DWMFLIP3D_EXCLUDEABOVE :
policy = QtWin::FlipExcludeAbove;
break;
- case qt_DWMFLIP3D_EXCLUDEBELOW :
+ case DWMFLIP3D_EXCLUDEBELOW :
policy = QtWin::FlipExcludeBelow;
break;
default :
@@ -1607,12 +1605,8 @@ QtWin::WindowFlip3DPolicy QtWin::windowFlip3DPolicy(QWindow *window)
void qt_ExtendFrameIntoClientArea(QWindow *window, int left, int top, int right, int bottom)
{
QWinEventFilter::setup();
-
- qtDwmApiDll.init();
- if (qtDwmApiDll.dwmExtendFrameIntoClientArea) {
- MARGINS margins = {left, right, top, bottom};
- qtDwmApiDll.dwmExtendFrameIntoClientArea(reinterpret_cast<HWND>(window->winId()), &margins);
- }
+ MARGINS margins = {left, right, top, bottom};
+ DwmExtendFrameIntoClientArea(reinterpret_cast<HWND>(window->winId()), &margins);
}
/*! \fn void QtWin::extendFrameIntoClientArea(QWidget *window, int left, int top, int right, int bottom)
@@ -1706,22 +1700,18 @@ void QtWin::enableBlurBehindWindow(QWindow *window, const QRegion &region)
{
Q_ASSERT_X(window, Q_FUNC_INFO, "window is null");
- qtDwmApiDll.init();
- if (!qtDwmApiDll.dwmEnableBlurBehindWindow)
- return;
-
- qt_DWM_BLURBEHIND dwmbb = {0, 0, 0, 0};
- dwmbb.dwFlags = qt_DWM_BB_ENABLE;
+ DWM_BLURBEHIND dwmbb = {0, 0, 0, 0};
+ dwmbb.dwFlags = DWM_BB_ENABLE;
dwmbb.fEnable = TRUE;
HRGN rgn = 0;
if (!region.isNull()) {
rgn = toHRGN(region);
if (rgn) {
dwmbb.hRgnBlur = rgn;
- dwmbb.dwFlags |= qt_DWM_BB_BLURREGION;
+ dwmbb.dwFlags |= DWM_BB_BLURREGION;
}
}
- qtDwmApiDll.dwmEnableBlurBehindWindow(reinterpret_cast<HWND>(window->winId()), &dwmbb);
+ DwmEnableBlurBehindWindow(reinterpret_cast<HWND>(window->winId()), &dwmbb);
if (rgn)
DeleteObject(rgn);
}
@@ -1760,12 +1750,9 @@ void QtWin::enableBlurBehindWindow(QWindow *window)
void QtWin::disableBlurBehindWindow(QWindow *window)
{
Q_ASSERT_X(window, Q_FUNC_INFO, "window is null");
- qt_DWM_BLURBEHIND dwmbb = {0, 0, 0, 0};
- dwmbb.dwFlags = qt_DWM_BB_ENABLE;
- dwmbb.fEnable = FALSE;
- qtDwmApiDll.init();
- if (qtDwmApiDll.dwmEnableBlurBehindWindow)
- qtDwmApiDll.dwmEnableBlurBehindWindow(reinterpret_cast<HWND>(window->winId()), &dwmbb);
+ DWM_BLURBEHIND dwmbb = {0, 0, 0, 0};
+ dwmbb.dwFlags = DWM_BB_ENABLE;
+ DwmEnableBlurBehindWindow(reinterpret_cast<HWND>(window->winId()), &dwmbb);
}
/*!
@@ -1778,9 +1765,7 @@ bool QtWin::isCompositionEnabled()
QWinEventFilter::setup();
BOOL enabled = FALSE;
- qtDwmApiDll.init();
- if (qtDwmApiDll.dwmIsCompositionEnabled)
- qtDwmApiDll.dwmIsCompositionEnabled(&enabled);
+ DwmIsCompositionEnabled(&enabled);
return enabled;
}
@@ -1792,15 +1777,17 @@ bool QtWin::isCompositionEnabled()
\note The underlying function was declared deprecated as of Windows 8 and
takes no effect.
*/
+
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_MSVC(4995)
void QtWin::setCompositionEnabled(bool enabled)
{
QWinEventFilter::setup();
UINT compositionEnabled = enabled;
- qtDwmApiDll.init();
- if (qtDwmApiDll.dwmEnableComposition)
- qtDwmApiDll.dwmEnableComposition(compositionEnabled);
+ DwmEnableComposition(compositionEnabled);
}
+QT_WARNING_POP
/*!
\since 5.2
diff --git a/src/winextras/qwinfunctions_p.cpp b/src/winextras/qwinfunctions_p.cpp
index e9e5dd9..ea9dcf9 100644
--- a/src/winextras/qwinfunctions_p.cpp
+++ b/src/winextras/qwinfunctions_p.cpp
@@ -49,22 +49,8 @@ QtShell32Dll qtShell32Dll;
void QtDwmApiDll::resolve()
{
- if (const HMODULE dwmapi = LoadLibraryW(L"dwmapi.dll")) {
- dwmExtendFrameIntoClientArea =
- (DwmExtendFrameIntoClientArea) GetProcAddress(dwmapi, "DwmExtendFrameIntoClientArea");
- dwmEnableBlurBehindWindow =
- (DwmEnableBlurBehindWindow) GetProcAddress(dwmapi, "DwmEnableBlurBehindWindow");
- dwmGetColorizationColor =
- (DwmGetColorizationColor) GetProcAddress(dwmapi, "DwmGetColorizationColor");
- dwmSetWindowAttribute =
- (DwmSetWindowAttribute) GetProcAddress(dwmapi, "DwmSetWindowAttribute");
- dwmGetWindowAttribute =
- (DwmGetWindowAttribute) GetProcAddress(dwmapi, "DwmGetWindowAttribute");
- dwmIsCompositionEnabled =
- (DwmIsCompositionEnabled) GetProcAddress(dwmapi, "DwmIsCompositionEnabled");
- dwmEnableComposition =
- (DwmEnableComposition) GetProcAddress(dwmapi, "DwmEnableComposition");
- if (QSysInfo::windowsVersion() >= QSysInfo::WV_WINDOWS7) {
+ if (QSysInfo::windowsVersion() >= QSysInfo::WV_WINDOWS7) {
+ if (const HMODULE dwmapi = LoadLibraryW(L"dwmapi.dll")) {
dwmSetIconicThumbnail =
(DwmSetIconicThumbnail) GetProcAddress(dwmapi, "DwmSetIconicThumbnail");
dwmSetIconicLivePreviewBitmap =
@@ -77,11 +63,11 @@ void QtDwmApiDll::resolve()
void QtShell32Dll::resolve()
{
- if (const HMODULE shell32 = LoadLibraryW(L"shell32.dll")) {
- sHCreateItemFromParsingName =
- (SHCreateItemFromParsingName) GetProcAddress(shell32, "SHCreateItemFromParsingName");
- setCurrentProcessExplicitAppUserModelID =
- (SetCurrentProcessExplicitAppUserModelID) GetProcAddress(shell32, "SetCurrentProcessExplicitAppUserModelID");
+ if (QSysInfo::windowsVersion() >= QSysInfo::WV_WINDOWS7) {
+ if (const HMODULE shell32 = LoadLibraryW(L"shell32.dll")) {
+ setCurrentProcessExplicitAppUserModelID =
+ (SetCurrentProcessExplicitAppUserModelID) GetProcAddress(shell32, "SetCurrentProcessExplicitAppUserModelID");
+ }
}
}
diff --git a/src/winextras/qwinfunctions_p.h b/src/winextras/qwinfunctions_p.h
index 9f00e4c..6ea1598 100644
--- a/src/winextras/qwinfunctions_p.h
+++ b/src/winextras/qwinfunctions_p.h
@@ -54,74 +54,25 @@
#include <QString>
#include <qt_windows.h>
#include <uxtheme.h>
+#include <dwmapi.h>
QT_BEGIN_NAMESPACE
-enum qt_DWMWINDOWATTRIBUTE
+enum qt_DWMWINDOWATTRIBUTE // Not present in MinGW 4.9
{
- qt_DWMWA_NCRENDERING_ENABLED = 1,
- qt_DWMWA_NCRENDERING_POLICY,
- qt_DWMWA_TRANSITIONS_FORCEDISABLED,
- qt_DWMWA_ALLOW_NCPAINT,
- qt_DWMWA_CAPTION_BUTTON_BOUNDS,
- qt_DWMWA_NONCLIENT_RTL_LAYOUT,
- qt_DWMWA_FORCE_ICONIC_REPRESENTATION,
- qt_DWMWA_FLIP3D_POLICY,
- qt_DWMWA_EXTENDED_FRAME_BOUNDS,
- qt_DWMWA_HAS_ICONIC_BITMAP,
- qt_DWMWA_DISALLOW_PEEK,
- qt_DWMWA_EXCLUDED_FROM_PEEK,
- qt_DWMWA_CLOAK,
- qt_DWMWA_CLOAKED,
- qt_DWMWA_FREEZE_REPRESENTATION,
- qt_DWMWA_LAST
+ qt_DWMWA_DISALLOW_PEEK = 11,
+ qt_DWMWA_EXCLUDED_FROM_PEEK = 12,
};
-enum qt_DWMFLIP3DWINDOWPOLICY {
- qt_DWMFLIP3D_DEFAULT,
- qt_DWMFLIP3D_EXCLUDEBELOW,
- qt_DWMFLIP3D_EXCLUDEABOVE,
- qt_DWMFLIP3D_LAST
-};
-
-#include <pshpack1.h>
-
-struct qt_DWM_BLURBEHIND {
- DWORD dwFlags;
- BOOL fEnable;
- HRGN hRgnBlur;
- BOOL fTransitionOnMaximized;
-};
-
-#include <poppack.h>
-
-const int qt_DWM_BB_ENABLE = 0x00000001;
-const int qt_DWM_BB_BLURREGION = 0x00000002;
-const int qt_DWM_BB_TRANSITIONONMAXIMIZED = 0x00000004;
-
struct QtDwmApiDll
{
- typedef HRESULT (STDAPICALLTYPE *DwmGetColorizationColor)(DWORD *, BOOL *);
- typedef HRESULT (STDAPICALLTYPE *DwmSetWindowAttribute)(HWND, DWORD, LPCVOID, DWORD);
- typedef HRESULT (STDAPICALLTYPE *DwmGetWindowAttribute)(HWND, DWORD, PVOID, DWORD);
- typedef HRESULT (STDAPICALLTYPE *DwmExtendFrameIntoClientArea)(HWND, const MARGINS *);
- typedef HRESULT (STDAPICALLTYPE *DwmEnableBlurBehindWindow)(HWND, const qt_DWM_BLURBEHIND *);
- typedef HRESULT (STDAPICALLTYPE *DwmIsCompositionEnabled)(BOOL *);
- typedef HRESULT (STDAPICALLTYPE *DwmEnableComposition)(UINT);
- typedef HRESULT (STDAPICALLTYPE *DwmSetIconicThumbnail)(HWND, HBITMAP, DWORD);
+ typedef HRESULT (STDAPICALLTYPE *DwmSetIconicThumbnail)(HWND, HBITMAP, DWORD); // Windows 7
typedef HRESULT (STDAPICALLTYPE *DwmSetIconicLivePreviewBitmap)(HWND, HBITMAP, POINT *, DWORD);
typedef HRESULT (STDAPICALLTYPE *DwmInvalidateIconicBitmaps)(HWND);
- QtDwmApiDll()
- : dwmGetColorizationColor(0), dwmSetWindowAttribute(0), dwmGetWindowAttribute(0)
- , dwmExtendFrameIntoClientArea(0), dwmEnableBlurBehindWindow(0)
- , dwmIsCompositionEnabled(0), dwmEnableComposition(0)
- , dwmSetIconicThumbnail(0), dwmSetIconicLivePreviewBitmap(0), dwmInvalidateIconicBitmaps(0)
- {}
-
void init()
{
- if (!dwmSetWindowAttribute && QSysInfo::windowsVersion() >= QSysInfo::WV_VISTA)
+ if (!dwmSetIconicThumbnail)
resolve();
}
@@ -136,36 +87,24 @@ struct QtDwmApiDll
static void setBooleanWindowAttribute(HWND hwnd, DWORD attribute, bool value)
{ setWindowAttribute<BOOL>(hwnd, attribute, BOOL(value ? TRUE : FALSE)); }
- DwmGetColorizationColor dwmGetColorizationColor;
- DwmSetWindowAttribute dwmSetWindowAttribute;
- DwmGetWindowAttribute dwmGetWindowAttribute;
- DwmExtendFrameIntoClientArea dwmExtendFrameIntoClientArea;
- DwmEnableBlurBehindWindow dwmEnableBlurBehindWindow;
- DwmIsCompositionEnabled dwmIsCompositionEnabled;
- DwmEnableComposition dwmEnableComposition;
- DwmSetIconicThumbnail dwmSetIconicThumbnail;
- DwmSetIconicLivePreviewBitmap dwmSetIconicLivePreviewBitmap;
- DwmInvalidateIconicBitmaps dwmInvalidateIconicBitmaps;
+ DwmSetIconicThumbnail dwmSetIconicThumbnail = nullptr;
+ DwmSetIconicLivePreviewBitmap dwmSetIconicLivePreviewBitmap = nullptr;
+ DwmInvalidateIconicBitmaps dwmInvalidateIconicBitmaps = nullptr;
};
struct QtShell32Dll
-
{
- typedef HRESULT (STDAPICALLTYPE *SHCreateItemFromParsingName)(PCWSTR, IBindCtx *, REFIID, void **);
typedef HRESULT (STDAPICALLTYPE *SetCurrentProcessExplicitAppUserModelID)(PCWSTR);
- QtShell32Dll() : sHCreateItemFromParsingName(0), setCurrentProcessExplicitAppUserModelID(0) {}
-
void init()
{
- if (!sHCreateItemFromParsingName && QSysInfo::windowsVersion() >= QSysInfo::WV_VISTA)
+ if (!setCurrentProcessExplicitAppUserModelID)
resolve();
}
void resolve();
- SHCreateItemFromParsingName sHCreateItemFromParsingName; // Vista
- SetCurrentProcessExplicitAppUserModelID setCurrentProcessExplicitAppUserModelID; // Windows 7
+ SetCurrentProcessExplicitAppUserModelID setCurrentProcessExplicitAppUserModelID = nullptr; // Windows 7
};
extern QtDwmApiDll qtDwmApiDll;
@@ -186,19 +125,16 @@ inline wchar_t *qt_qstringToNullTerminated(const QString &src)
template <class T>
T QtDwmApiDll::windowAttribute(HWND hwnd, DWORD attribute, T defaultValue)
{
- qtDwmApiDll.init();
- T value = defaultValue;
- if (qtDwmApiDll.dwmGetWindowAttribute)
- qtDwmApiDll.dwmGetWindowAttribute(hwnd, attribute, &value, sizeof(value));
+ T value;
+ if (FAILED(DwmGetWindowAttribute(hwnd, attribute, &value, sizeof(value))))
+ value = defaultValue;
return value;
}
template <class T>
void QtDwmApiDll::setWindowAttribute(HWND hwnd, DWORD attribute, T value)
{
- qtDwmApiDll.init();
- if (qtDwmApiDll.dwmSetWindowAttribute)
- qtDwmApiDll.dwmSetWindowAttribute(hwnd, attribute, &value, sizeof(value));
+ DwmSetWindowAttribute(hwnd, attribute, &value, sizeof(value));
}
QT_END_NAMESPACE
diff --git a/src/winextras/qwinjumplist.cpp b/src/winextras/qwinjumplist.cpp
index e3f7860..2e1b8ce 100644
--- a/src/winextras/qwinjumplist.cpp
+++ b/src/winextras/qwinjumplist.cpp
@@ -38,6 +38,17 @@
**
****************************************************************************/
+#include <QtCore/QtGlobal>
+
+#ifdef Q_CC_MINGW // MinGW: Enable SHCreateItemFromParsingName()
+# if defined(_WIN32_IE) && _WIN32_IE << 0x0700 // _WIN32_IE_IE70
+# undef _WIN32_IE
+# endif
+# ifndef _WIN32_IE
+# define _WIN32_IE 0x0700
+# endif
+#endif // Q_CC_MINGW
+
#include "qwinjumplist.h"
#include "qwinjumplist_p.h"
#include "qwinjumplistitem.h"
@@ -56,6 +67,8 @@
#include "qwinfunctions_p.h"
#include "winpropkey_p.h"
+#include <shobjidl.h>
+
QT_BEGIN_NAMESPACE
/*!
@@ -387,11 +400,8 @@ IShellLinkW *QWinJumpListPrivate::toIShellLink(const QWinJumpListItem *item)
IShellItem2 *QWinJumpListPrivate::toIShellItem(const QWinJumpListItem *item)
{
IShellItem2 *shellitem = 0;
- qtShell32Dll.init();
- if (qtShell32Dll.sHCreateItemFromParsingName) {
- QScopedArrayPointer<wchar_t> buffer(qt_qstringToNullTerminated(item->filePath()));
- qtShell32Dll.sHCreateItemFromParsingName(buffer.data(), 0, qIID_IShellItem2, reinterpret_cast<void **>(&shellitem));
- }
+ QScopedArrayPointer<wchar_t> buffer(qt_qstringToNullTerminated(item->filePath()));
+ SHCreateItemFromParsingName(buffer.data(), 0, qIID_IShellItem2, reinterpret_cast<void **>(&shellitem));
return shellitem;
}
diff --git a/src/winextras/qwinthumbnailtoolbar.cpp b/src/winextras/qwinthumbnailtoolbar.cpp
index 0d83ef6..58978f9 100644
--- a/src/winextras/qwinthumbnailtoolbar.cpp
+++ b/src/winextras/qwinthumbnailtoolbar.cpp
@@ -321,11 +321,9 @@ bool QWinThumbnailToolBar::iconicPixmapNotificationsEnabled() const
{
Q_D(const QWinThumbnailToolBar);
const HWND hwnd = d->handle();
- if (!hwnd || !qtDwmApiDll.dwmGetWindowAttribute)
+ if (!hwnd)
return false;
- qtDwmApiDll.init();
- return qtDwmApiDll.dwmGetWindowAttribute && hwnd
- && QtDwmApiDll::booleanWindowAttribute(hwnd, dWMWA_FORCE_ICONIC_REPRESENTATION);
+ return QtDwmApiDll::booleanWindowAttribute(hwnd, dWMWA_FORCE_ICONIC_REPRESENTATION);
}
void QWinThumbnailToolBar::setIconicPixmapNotificationsEnabled(bool enabled)
@@ -336,8 +334,7 @@ void QWinThumbnailToolBar::setIconicPixmapNotificationsEnabled(bool enabled)
qWarning() << Q_FUNC_INFO << "invoked with hwnd=0";
return;
}
- qtDwmApiDll.init();
- if (!qtDwmApiDll.dwmSetWindowAttribute || iconicPixmapNotificationsEnabled() == enabled)
+ if (iconicPixmapNotificationsEnabled() == enabled)
return;
QtDwmApiDll::setBooleanWindowAttribute(hwnd, dWMWA_FORCE_ICONIC_REPRESENTATION, enabled);
QtDwmApiDll::setBooleanWindowAttribute(hwnd, dWMWA_HAS_ICONIC_BITMAP, enabled);
diff --git a/src/winextras/winextras.pro b/src/winextras/winextras.pro
index 94bdb92..de4f9c8 100644
--- a/src/winextras/winextras.pro
+++ b/src/winextras/winextras.pro
@@ -43,7 +43,7 @@ HEADERS += \
QMAKE_DOCS = $$PWD/doc/qtwinextras.qdocconf
-LIBS_PRIVATE += -lole32 -lshlwapi -lshell32
+LIBS_PRIVATE += -lole32 -lshlwapi -lshell32 -ldwmapi
win32:!qtHaveModule(opengl)|contains(QT_CONFIG, dynamicgl):LIBS_PRIVATE += -lgdi32
OTHER_FILES += \