diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/winextras/qwinfunctions.cpp | 63 | ||||
-rw-r--r-- | src/winextras/qwinfunctions_p.cpp | 28 | ||||
-rw-r--r-- | src/winextras/qwinfunctions_p.h | 94 | ||||
-rw-r--r-- | src/winextras/qwinjumplist.cpp | 20 | ||||
-rw-r--r-- | src/winextras/qwinthumbnailtoolbar.cpp | 9 | ||||
-rw-r--r-- | src/winextras/winextras.pro | 2 |
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 ®ion) { 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 += \ |