diff --git a/src/3rdparty/qtwin.cpp b/src/3rdparty/qtwin.cpp index bbd1bb100..37c3f81b7 100644 --- a/src/3rdparty/qtwin.cpp +++ b/src/3rdparty/qtwin.cpp @@ -35,6 +35,40 @@ #ifdef Q_WS_WIN #include + +// Blur behind data structures +#define DWM_BB_ENABLE 0x00000001 // fEnable has been specified +#define DWM_BB_BLURREGION 0x00000002 // hRgnBlur has been specified +#define DWM_BB_TRANSITIONONMAXIMIZED 0x00000004 // fTransitionOnMaximized has been specified +#define WM_DWMCOMPOSITIONCHANGED 0x031E // Composition changed window message + +typedef struct _DWM_BLURBEHIND +{ + DWORD dwFlags; + BOOL fEnable; + HRGN hRgnBlur; + BOOL fTransitionOnMaximized; +} DWM_BLURBEHIND, *PDWM_BLURBEHIND; + +typedef struct _MARGINS +{ + int cxLeftWidth; + int cxRightWidth; + int cyTopHeight; + int cyBottomHeight; +} MARGINS, *PMARGINS; + +typedef HRESULT (WINAPI *PtrDwmIsCompositionEnabled)(BOOL* pfEnabled); +typedef HRESULT (WINAPI *PtrDwmExtendFrameIntoClientArea)(HWND hWnd, const MARGINS* pMarInset); +typedef HRESULT (WINAPI *PtrDwmEnableBlurBehindWindow)(HWND hWnd, const DWM_BLURBEHIND* pBlurBehind); +typedef HRESULT (WINAPI *PtrDwmGetColorizationColor)(DWORD *pcrColorization, BOOL *pfOpaqueBlend); + +static PtrDwmIsCompositionEnabled pDwmIsCompositionEnabled= 0; +static PtrDwmEnableBlurBehindWindow pDwmEnableBlurBehindWindow = 0; +static PtrDwmExtendFrameIntoClientArea pDwmExtendFrameIntoClientArea = 0; +static PtrDwmGetColorizationColor pDwmGetColorizationColor = 0; + + /* * Internal helper class that notifies windows if the * DWM compositing state changes and updates the widget @@ -52,10 +86,22 @@ private: QWidgetList widgets; }; +static bool resolveLibs() +{ + if (!pDwmIsCompositionEnabled) { + QLibrary dwmLib(QString::fromAscii("dwmapi")); + pDwmIsCompositionEnabled =(PtrDwmIsCompositionEnabled)dwmLib.resolve("DwmIsCompositionEnabled"); + pDwmExtendFrameIntoClientArea = (PtrDwmExtendFrameIntoClientArea)dwmLib.resolve("DwmExtendFrameIntoClientArea"); + pDwmEnableBlurBehindWindow = (PtrDwmEnableBlurBehindWindow)dwmLib.resolve("DwmEnableBlurBehindWindow"); + pDwmGetColorizationColor = (PtrDwmGetColorizationColor)dwmLib.resolve("DwmGetColorizationColor"); + } + return pDwmIsCompositionEnabled != 0; +} + #endif /*! - * Checks and returns true if Windows version + * Chekcs and returns true if Windows version * currently running is Windows 7 * * This function is useful when you are using @@ -83,11 +129,13 @@ bool QtWin::isRunningWindows7() bool QtWin::isCompositionEnabled() { #ifdef Q_WS_WIN - HRESULT hr = S_OK; - BOOL isEnabled = false; - hr = DwmIsCompositionEnabled(&isEnabled); - if (SUCCEEDED(hr)) - return isEnabled; + if (resolveLibs()) { + HRESULT hr = S_OK; + BOOL isEnabled = false; + hr = pDwmIsCompositionEnabled(&isEnabled); + if (SUCCEEDED(hr)) + return isEnabled; + } #endif return false; } @@ -104,17 +152,19 @@ bool QtWin::enableBlurBehindWindow(QWidget *widget, bool enable) Q_ASSERT(widget); bool result = false; #ifdef Q_WS_WIN - DWM_BLURBEHIND bb = {0}; - HRESULT hr = S_OK; - bb.fEnable = enable; - bb.dwFlags = DWM_BB_ENABLE; - bb.hRgnBlur = NULL; - widget->setAttribute(Qt::WA_TranslucentBackground, enable); - widget->setAttribute(Qt::WA_NoSystemBackground, enable); - hr = DwmEnableBlurBehindWindow(widget->winId(), &bb); - if (SUCCEEDED(hr)) { - result = true; - windowNotifier()->addWidget(widget); + if (resolveLibs()) { + DWM_BLURBEHIND bb = {0}; + HRESULT hr = S_OK; + bb.fEnable = enable; + bb.dwFlags = DWM_BB_ENABLE; + bb.hRgnBlur = NULL; + widget->setAttribute(Qt::WA_TranslucentBackground, enable); + widget->setAttribute(Qt::WA_NoSystemBackground, enable); + hr = pDwmEnableBlurBehindWindow(widget->winId(), &bb); + if (SUCCEEDED(hr)) { + result = true; + windowNotifier()->addWidget(widget); + } } #endif return result; @@ -134,6 +184,7 @@ bool QtWin::enableBlurBehindWindow(QWidget *widget, bool enable) */ bool QtWin::extendFrameIntoClientArea(QWidget *widget, int left, int top, int right, int bottom) { + Q_ASSERT(widget); Q_UNUSED(left); Q_UNUSED(top); @@ -143,14 +194,17 @@ bool QtWin::extendFrameIntoClientArea(QWidget *widget, int left, int top, int ri bool result = false; #ifdef Q_WS_WIN - HRESULT hr = S_OK; - MARGINS m = {left, top, right, bottom}; - hr = DwmExtendFrameIntoClientArea(widget->winId(), &m); - if (SUCCEEDED(hr)) { - result = true; - windowNotifier()->addWidget(widget); + if (resolveLibs()) { + QLibrary dwmLib(QString::fromAscii("dwmapi")); + HRESULT hr = S_OK; + MARGINS m = {left, top, right, bottom}; + hr = pDwmExtendFrameIntoClientArea(widget->winId(), &m); + if (SUCCEEDED(hr)) { + result = true; + windowNotifier()->addWidget(widget); + } + widget->setAttribute(Qt::WA_TranslucentBackground, result); } - widget->setAttribute(Qt::WA_TranslucentBackground, result); #endif return result; } @@ -163,18 +217,22 @@ bool QtWin::extendFrameIntoClientArea(QWidget *widget, int left, int top, int ri QColor QtWin::colorizationColor() { QColor resultColor = QApplication::palette().window().color(); + #ifdef Q_WS_WIN - DWORD color = 0; - BOOL opaque = FALSE; - HRESULT hr = S_OK; - hr = DwmGetColorizationColor(&color, &opaque); - if (SUCCEEDED(hr)) - resultColor = QColor(color); + if (resolveLibs()) { + DWORD color = 0; + BOOL opaque = FALSE; + QLibrary dwmLib(QString::fromAscii("dwmapi")); + HRESULT hr = S_OK; + hr = pDwmGetColorizationColor(&color, &opaque); + if (SUCCEEDED(hr)) + resultColor = QColor(color); + } #endif return resultColor; } -#ifdef W7API +#ifdef Q_WS_WIN WindowNotifier *QtWin::windowNotifier() { static WindowNotifier *windowNotifierInstance = 0; diff --git a/src/3rdparty/qtwin.h b/src/3rdparty/qtwin.h index 052be7420..e80a9ca91 100644 --- a/src/3rdparty/qtwin.h +++ b/src/3rdparty/qtwin.h @@ -39,7 +39,6 @@ #include #include #include -#include DEFINE_PROPERTYKEY(PKEY_Title, 0xF29F85E0, 0x4FF9, 0x1068, 0xAB, 0x91, 0x08, 0x00, 0x2B, 0x27, 0xB3, 0xD9, 2); DEFINE_PROPERTYKEY(PKEY_AppUserModel_IsDestListSeparator, 0x9F4C2855, 0x9F79, 0x4B39, 0xA8, 0xD0, 0xE1, 0xD4, 0x2D, 0xE1, 0xD5, 0xF3, 6); diff --git a/src/QupZilla.pro b/src/QupZilla.pro index 7309d56d6..c7b4ea9a3 100644 --- a/src/QupZilla.pro +++ b/src/QupZilla.pro @@ -79,6 +79,7 @@ SOURCES += main.cpp\ plugins/plugins.cpp \ preferences/pluginslist.cpp \ plugins/pluginproxy.cpp \ + app/appui.cpp \ tools/clickablelabel.cpp \ downloads/downloadoptionsdialog.cpp \ tools/treewidget.cpp \ @@ -116,8 +117,7 @@ SOURCES += main.cpp\ desktopnotifications/desktopnotificationsfactory.cpp \ tools/progressbar.cpp \ tools/iconprovider.cpp \ - network/networkproxyfactory.cpp \ - tools/closedtabsmanager.cpp + network/networkproxyfactory.cpp HEADERS += 3rdparty/squeezelabel.h \ 3rdparty/qtwin.h \ @@ -193,8 +193,7 @@ HEADERS += 3rdparty/squeezelabel.h \ desktopnotifications/desktopnotificationsfactory.h \ tools/progressbar.h \ tools/iconprovider.h \ - network/networkproxyfactory.h \ - tools/closedtabsmanager.h + network/networkproxyfactory.h FORMS += \ preferences/autofillmanager.ui \ @@ -236,4 +235,4 @@ include(3rdparty/qtsingleapplication.pri) unix:QT += dbus win32:DEFINES += W7API win32:RC_FILE = appicon.rc -win32:LIBS += User32.lib Ole32.lib Shell32.lib ShlWapi.lib Gdi32.lib ComCtl32.lib DwmApi.lib +win32:LIBS += User32.lib Ole32.lib Shell32.lib ShlWapi.lib Gdi32.lib ComCtl32.lib