Some refactor

Rename some functions to make it more clear.

Signed-off-by: Yuhang Zhao <2546789017@qq.com>
This commit is contained in:
Yuhang Zhao 2021-03-10 10:05:23 +08:00
parent bc9edaf78a
commit 0931b73671
9 changed files with 228 additions and 190 deletions

View File

@ -118,7 +118,7 @@ Window {
Component.onCompleted: { Component.onCompleted: {
framelessHelper.removeWindowFrame() framelessHelper.removeWindowFrame()
framelessHelper.setAcrylicEffectEnabled(true) framelessHelper.setBlurEffectEnabled(true)
} }
// Re-draw the window frame. // Re-draw the window frame.

View File

@ -445,7 +445,7 @@ bool FramelessHelperWin::nativeEventFilter(const QByteArray &eventType, void *me
case WM_NCPAINT: { case WM_NCPAINT: {
// 边框阴影处于非客户区的范围,因此如果直接阻止非客户区的绘制,会导致边框阴影丢失 // 边框阴影处于非客户区的范围,因此如果直接阻止非客户区的绘制,会导致边框阴影丢失
if (!Utilities::isBlurEffectSupported() && !shouldHaveWindowFrame()) { if (!Utilities::isDwmBlurAvailable() && !shouldHaveWindowFrame()) {
// Only block WM_NCPAINT when DWM composition is disabled. If // Only block WM_NCPAINT when DWM composition is disabled. If
// it's blocked when DWM composition is enabled, the frame // it's blocked when DWM composition is enabled, the frame
// shadow won't be drawn. // shadow won't be drawn.
@ -459,7 +459,7 @@ bool FramelessHelperWin::nativeEventFilter(const QByteArray &eventType, void *me
if (shouldHaveWindowFrame()) { if (shouldHaveWindowFrame()) {
break; break;
} else { } else {
if (Utilities::isBlurEffectSupported()) { if (Utilities::isDwmBlurAvailable()) {
// DefWindowProc won't repaint the window border if lParam // DefWindowProc won't repaint the window border if lParam
// (normally a HRGN) is -1. See the following link's "lParam" // (normally a HRGN) is -1. See the following link's "lParam"
// section: // section:

View File

@ -76,16 +76,6 @@ void FramelessQuickHelper::setResizable(const bool val)
Q_EMIT resizableChanged(val); Q_EMIT resizableChanged(val);
} }
bool FramelessQuickHelper::colorizationEnabled() const
{
return Utilities::isColorizationEnabled();
}
QColor FramelessQuickHelper::colorizationColor() const
{
return Utilities::getColorizationColor();
}
bool FramelessQuickHelper::lightThemeEnabled() const bool FramelessQuickHelper::lightThemeEnabled() const
{ {
return Utilities::isLightThemeEnabled(); return Utilities::isLightThemeEnabled();
@ -96,6 +86,17 @@ bool FramelessQuickHelper::darkThemeEnabled() const
return Utilities::isDarkThemeEnabled(); return Utilities::isDarkThemeEnabled();
} }
#ifdef Q_OS_WINDOWS
bool FramelessQuickHelper::colorizationEnabled() const
{
return Utilities::isColorizationEnabled();
}
QColor FramelessQuickHelper::colorizationColor() const
{
return Utilities::getColorizationColor();
}
bool FramelessQuickHelper::highContrastModeEnabled() const bool FramelessQuickHelper::highContrastModeEnabled() const
{ {
return Utilities::isHighContrastModeEnabled(); return Utilities::isHighContrastModeEnabled();
@ -110,6 +111,7 @@ bool FramelessQuickHelper::transparencyEffectEnabled() const
{ {
return Utilities::isTransparencyEffectEnabled(); return Utilities::isTransparencyEffectEnabled();
} }
#endif
void FramelessQuickHelper::removeWindowFrame() void FramelessQuickHelper::removeWindowFrame()
{ {
@ -128,16 +130,18 @@ void FramelessQuickHelper::addIgnoreObject(QQuickItem *val)
void FramelessQuickHelper::timerEvent(QTimerEvent *event) void FramelessQuickHelper::timerEvent(QTimerEvent *event)
{ {
QQuickItem::timerEvent(event); QQuickItem::timerEvent(event);
Q_EMIT colorizationEnabledChanged(colorizationEnabled());
Q_EMIT colorizationColorChanged(colorizationColor());
Q_EMIT lightThemeEnabledChanged(lightThemeEnabled()); Q_EMIT lightThemeEnabledChanged(lightThemeEnabled());
Q_EMIT darkThemeEnabledChanged(darkThemeEnabled()); Q_EMIT darkThemeEnabledChanged(darkThemeEnabled());
#ifdef Q_OS_WINDOWS
Q_EMIT colorizationEnabledChanged(colorizationEnabled());
Q_EMIT colorizationColorChanged(colorizationColor());
Q_EMIT highContrastModeEnabledChanged(highContrastModeEnabled()); Q_EMIT highContrastModeEnabledChanged(highContrastModeEnabled());
Q_EMIT darkFrameEnabledChanged(darkFrameEnabled()); Q_EMIT darkFrameEnabledChanged(darkFrameEnabled());
Q_EMIT transparencyEffectEnabledChanged(transparencyEffectEnabled()); Q_EMIT transparencyEffectEnabledChanged(transparencyEffectEnabled());
#endif
} }
void FramelessQuickHelper::setAcrylicEffectEnabled(const bool enabled, const QColor &gradientColor) void FramelessQuickHelper::setBlurEffectEnabled(const bool enabled, const QColor &gradientColor)
{ {
Utilities::setAcrylicEffectEnabled(window(), enabled, gradientColor); Utilities::setBlurEffectEnabled(window(), enabled, gradientColor);
} }

View File

@ -38,13 +38,15 @@ class FRAMELESSHELPER_EXPORT FramelessQuickHelper : public QQuickItem
Q_PROPERTY(int borderHeight READ borderHeight WRITE setBorderHeight NOTIFY borderHeightChanged) Q_PROPERTY(int borderHeight READ borderHeight WRITE setBorderHeight NOTIFY borderHeightChanged)
Q_PROPERTY(int titleBarHeight READ titleBarHeight WRITE setTitleBarHeight NOTIFY titleBarHeightChanged) Q_PROPERTY(int titleBarHeight READ titleBarHeight WRITE setTitleBarHeight NOTIFY titleBarHeightChanged)
Q_PROPERTY(bool resizable READ resizable WRITE setResizable NOTIFY resizableChanged) Q_PROPERTY(bool resizable READ resizable WRITE setResizable NOTIFY resizableChanged)
Q_PROPERTY(bool colorizationEnabled READ colorizationEnabled NOTIFY colorizationEnabledChanged)
Q_PROPERTY(QColor colorizationColor READ colorizationColor NOTIFY colorizationColorChanged)
Q_PROPERTY(bool lightThemeEnabled READ lightThemeEnabled NOTIFY lightThemeEnabledChanged) Q_PROPERTY(bool lightThemeEnabled READ lightThemeEnabled NOTIFY lightThemeEnabledChanged)
Q_PROPERTY(bool darkThemeEnabled READ darkThemeEnabled NOTIFY darkThemeEnabledChanged) Q_PROPERTY(bool darkThemeEnabled READ darkThemeEnabled NOTIFY darkThemeEnabledChanged)
#ifdef Q_OS_WINDOWS
Q_PROPERTY(bool colorizationEnabled READ colorizationEnabled NOTIFY colorizationEnabledChanged)
Q_PROPERTY(QColor colorizationColor READ colorizationColor NOTIFY colorizationColorChanged)
Q_PROPERTY(bool highContrastModeEnabled READ highContrastModeEnabled NOTIFY highContrastModeEnabledChanged) Q_PROPERTY(bool highContrastModeEnabled READ highContrastModeEnabled NOTIFY highContrastModeEnabledChanged)
Q_PROPERTY(bool darkFrameEnabled READ darkFrameEnabled NOTIFY darkFrameEnabledChanged) Q_PROPERTY(bool darkFrameEnabled READ darkFrameEnabled NOTIFY darkFrameEnabledChanged)
Q_PROPERTY(bool transparencyEffectEnabled READ transparencyEffectEnabled NOTIFY transparencyEffectEnabledChanged) Q_PROPERTY(bool transparencyEffectEnabled READ transparencyEffectEnabled NOTIFY transparencyEffectEnabledChanged)
#endif
public: public:
explicit FramelessQuickHelper(QQuickItem *parent = nullptr); explicit FramelessQuickHelper(QQuickItem *parent = nullptr);
@ -62,18 +64,21 @@ public:
bool resizable() const; bool resizable() const;
void setResizable(const bool val); void setResizable(const bool val);
bool colorizationEnabled() const;
QColor colorizationColor() const;
bool lightThemeEnabled() const; bool lightThemeEnabled() const;
bool darkThemeEnabled() const; bool darkThemeEnabled() const;
#ifdef Q_OS_WINDOWS
bool colorizationEnabled() const;
QColor colorizationColor() const;
bool highContrastModeEnabled() const; bool highContrastModeEnabled() const;
bool darkFrameEnabled() const; bool darkFrameEnabled() const;
bool transparencyEffectEnabled() const; bool transparencyEffectEnabled() const;
#endif
public Q_SLOTS: public Q_SLOTS:
void removeWindowFrame(); void removeWindowFrame();
void addIgnoreObject(QQuickItem *val); void addIgnoreObject(QQuickItem *val);
void setAcrylicEffectEnabled(const bool enabled = true, const QColor &gradientColor = {}); void setBlurEffectEnabled(const bool enabled = true, const QColor &gradientColor = {});
protected: protected:
void timerEvent(QTimerEvent *event) override; void timerEvent(QTimerEvent *event) override;
@ -83,11 +88,13 @@ Q_SIGNALS:
void borderHeightChanged(int); void borderHeightChanged(int);
void titleBarHeightChanged(int); void titleBarHeightChanged(int);
void resizableChanged(bool); void resizableChanged(bool);
void colorizationEnabledChanged(bool);
void colorizationColorChanged(const QColor &);
void lightThemeEnabledChanged(bool); void lightThemeEnabledChanged(bool);
void darkThemeEnabledChanged(bool); void darkThemeEnabledChanged(bool);
#ifdef Q_OS_WINDOWS
void colorizationEnabledChanged(bool);
void colorizationColorChanged(const QColor &);
void highContrastModeEnabledChanged(bool); void highContrastModeEnabledChanged(bool);
void darkFrameEnabledChanged(bool); void darkFrameEnabledChanged(bool);
void transparencyEffectEnabledChanged(bool); void transparencyEffectEnabledChanged(bool);
#endif
}; };

View File

@ -34,11 +34,15 @@ QtAcrylicEffectHelper::QtAcrylicEffectHelper()
Q_INIT_RESOURCE(qtacrylichelper); Q_INIT_RESOURCE(qtacrylichelper);
QCoreApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); QCoreApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings);
#ifdef Q_OS_MACOS #ifdef Q_OS_MACOS
if (Utilities::isAcrylicEffectSupported()) { if (Utilities::shouldUseTraditionalBlur()) {
m_tintOpacity = 0.6; m_tintOpacity = 0.6;
} }
#endif #endif
#ifdef Q_OS_WINDOWS
m_frameColor = Utilities::getNativeWindowFrameColor(true); m_frameColor = Utilities::getNativeWindowFrameColor(true);
#else
m_frameColor = Qt::black;
#endif
} }
void QtAcrylicEffectHelper::install(const QWindow *window) void QtAcrylicEffectHelper::install(const QWindow *window)
@ -189,7 +193,7 @@ void QtAcrylicEffectHelper::paintBackground(QPainter *painter, const QRect &rect
qWarning() << "m_window is null, forgot to call \"QtAcrylicEffectHelper::install()\"?"; qWarning() << "m_window is null, forgot to call \"QtAcrylicEffectHelper::install()\"?";
return; return;
} }
if (Utilities::isAcrylicEffectSupported()) { if (Utilities::shouldUseTraditionalBlur()) {
const QPainter::CompositionMode mode = painter->compositionMode(); const QPainter::CompositionMode mode = painter->compositionMode();
painter->setCompositionMode(QPainter::CompositionMode_Clear); painter->setCompositionMode(QPainter::CompositionMode_Clear);
painter->fillRect(rect, Qt::white); painter->fillRect(rect, Qt::white);
@ -254,7 +258,7 @@ void QtAcrylicEffectHelper::updateAcrylicBrush(const QColor &alternativeTintColo
QImage acrylicTexture({64, 64}, QImage::Format_ARGB32_Premultiplied); QImage acrylicTexture({64, 64}, QImage::Format_ARGB32_Premultiplied);
QColor fillColor = Qt::transparent; QColor fillColor = Qt::transparent;
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
if (!Utilities::isMSWin10AcrylicEffectAvailable()) { if (!Utilities::isOfficialMSWin10AcrylicBlurAvailable()) {
// Add a soft light layer for the background. // Add a soft light layer for the background.
fillColor = Qt::white; fillColor = Qt::white;
fillColor.setAlpha(150); fillColor.setAlpha(150);

View File

@ -145,7 +145,7 @@ void QtAcrylicWidget::showEvent(QShowEvent *event)
if (!inited) { if (!inited) {
const QWindow *win = windowHandle(); const QWindow *win = windowHandle();
FramelessWindowsManager::addWindow(win); FramelessWindowsManager::addWindow(win);
Utilities::setAcrylicEffectEnabled(win, true); Utilities::setBlurEffectEnabled(win, true);
m_acrylicHelper.install(win); m_acrylicHelper.install(win);
m_acrylicHelper.updateAcrylicBrush(tintColor()); m_acrylicHelper.updateAcrylicBrush(tintColor());
update(); update();

View File

@ -25,21 +25,8 @@
#include "utilities.h" #include "utilities.h"
#include <QtGui/private/qguiapplication_p.h> #include <QtGui/private/qguiapplication_p.h>
#include <QtGui/qscreen.h> #include <QtGui/qscreen.h>
#include <QtGui/qpa/qplatformwindow.h>
#include <QtGui/qpainter.h> #include <QtGui/qpainter.h>
#include <QtGui/private/qmemrotate_p.h> #include <QtGui/private/qmemrotate_p.h>
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
#include <QtGui/qpa/qplatformnativeinterface.h>
#else
#include <QtGui/qpa/qplatformwindow_p.h>
#endif
#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0))
#include <QtCore/qoperatingsystemversion.h>
#else
#include <QtCore/qsysinfo.h>
#endif
Q_DECLARE_METATYPE(QMargins)
/* /*
* Copied from https://code.qt.io/cgit/qt/qtbase.git/tree/src/widgets/effects/qpixmapfilter.cpp * Copied from https://code.qt.io/cgit/qt/qtbase.git/tree/src/widgets/effects/qpixmapfilter.cpp
@ -369,96 +356,6 @@ QRect Utilities::alignedRect(const Qt::LayoutDirection direction, const Qt::Alig
/////////////////////////////////////////////////// ///////////////////////////////////////////////////
bool Utilities::isWin7OrGreater()
{
#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0))
return QOperatingSystemVersion::current() >= QOperatingSystemVersion::Windows7;
#else
return QSysInfo::WindowsVersion >= QSysInfo::WV_WINDOWS7;
#endif
}
bool Utilities::isWin8OrGreater()
{
#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0))
return QOperatingSystemVersion::current() >= QOperatingSystemVersion::Windows8;
#else
return QSysInfo::WindowsVersion >= QSysInfo::WV_WINDOWS8;
#endif
}
bool Utilities::isWin8Point1OrGreater()
{
#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0))
return QOperatingSystemVersion::current() >= QOperatingSystemVersion::Windows8_1;
#else
return QSysInfo::WindowsVersion >= QSysInfo::WV_WINDOWS8_1;
#endif
}
bool Utilities::isWin10OrGreater()
{
#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0))
return QOperatingSystemVersion::current() >= QOperatingSystemVersion::Windows10;
#else
return QSysInfo::WindowsVersion >= QSysInfo::WV_WINDOWS10;
#endif
}
bool Utilities::isWin10OrGreater(const int subVer)
{
#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0))
return QOperatingSystemVersion::current() >= QOperatingSystemVersion(QOperatingSystemVersion::Windows, 10, 0, subVer);
#else
Q_UNUSED(ver);
return QSysInfo::WindowsVersion >= QSysInfo::WV_WINDOWS10;
#endif
}
static inline bool forceEnableDwmBlur()
{
return qEnvironmentVariableIsSet(_flh_global::_flh_acrylic_forceDWMBlur_flag);
}
static inline bool forceDisableWallpaperBlur()
{
return qEnvironmentVariableIsSet(_flh_global::_flh_acrylic_forceDisableWallpaperBlur_flag);
}
static inline bool forceEnableOfficialMSWin10AcrylicBlur()
{
return qEnvironmentVariableIsSet(_flh_global::_flh_acrylic_forceOfficialMSWin10Blur_flag);
}
static inline bool shouldUseOfficialMSWin10AcrylicBlur()
{
#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0))
const QOperatingSystemVersion currentVersion = QOperatingSystemVersion::current();
if (currentVersion > QOperatingSystemVersion::Windows10) {
return true;
}
return ((currentVersion.microVersion() >= 16190) && (currentVersion.microVersion() < 18362));
#else
// TODO
return false;
#endif
}
bool Utilities::isMSWin10AcrylicEffectAvailable()
{
if (!isWin10OrGreater()) {
return false;
}
if (!forceEnableDwmBlur() && !forceDisableWallpaperBlur()) {
// We can't enable the official Acrylic blur in wallpaper blur mode.
return false;
}
if (forceEnableOfficialMSWin10AcrylicBlur()) {
return true;
}
return shouldUseOfficialMSWin10AcrylicBlur();
}
QWindow *Utilities::findWindow(const WId winId) QWindow *Utilities::findWindow(const WId winId)
{ {
Q_ASSERT(winId); Q_ASSERT(winId);
@ -476,49 +373,12 @@ QWindow *Utilities::findWindow(const WId winId)
return nullptr; return nullptr;
} }
static inline bool shouldUseTraditionalDwmBlur()
{
#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0))
return Utilities::isWin10OrGreater() || (QOperatingSystemVersion::current() >= QOperatingSystemVersion::OSXYosemite);
#else
// TODO
return false;
#endif
}
bool Utilities::isAcrylicEffectSupported()
{
if ((forceEnableDwmBlur() || forceDisableWallpaperBlur()) && shouldUseTraditionalDwmBlur()) {
return true;
}
return false;
}
void Utilities::updateQtFrameMargins(QWindow *window, const bool enable)
{
Q_ASSERT(window);
if (!window) {
return;
}
const int tbh = enable ? Utilities::getSystemMetric(window, Utilities::SystemMetric::TitleBarHeight, true, true) : 0;
const QMargins margins = {0, -tbh, 0, 0};
const QVariant marginsVar = QVariant::fromValue(margins);
window->setProperty("_q_windowsCustomMargins", marginsVar);
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
QPlatformWindow *platformWindow = window->handle();
if (platformWindow) {
QGuiApplication::platformNativeInterface()->setWindowProperty(platformWindow, QStringLiteral("WindowsCustomMargins"), marginsVar);
}
#else
auto *platformWindow = dynamic_cast<QNativeInterface::Private::QWindowsWindow *>(
window->handle());
if (platformWindow) {
platformWindow->setCustomMargins(margins);
}
#endif
}
QRect Utilities::getScreenAvailableGeometry() QRect Utilities::getScreenAvailableGeometry()
{ {
return QGuiApplication::primaryScreen()->availableGeometry(); return QGuiApplication::primaryScreen()->availableGeometry();
} }
bool Utilities::shouldUseWallpaperBlur()
{
return !shouldUseTraditionalBlur();
}

View File

@ -46,35 +46,53 @@ enum class DesktopWallpaperAspectStyle
KeepRatioByExpanding KeepRatioByExpanding
}; };
// Common
FRAMELESSHELPER_EXPORT bool shouldUseWallpaperBlur();
FRAMELESSHELPER_EXPORT bool shouldUseTraditionalBlur();
FRAMELESSHELPER_EXPORT bool setBlurEffectEnabled(const QWindow *window, const bool enabled, const QColor &gradientColor = {});
FRAMELESSHELPER_EXPORT int getSystemMetric(const QWindow *window, const SystemMetric metric, const bool dpiAware, const bool forceSystemValue = false);
FRAMELESSHELPER_EXPORT bool isLightThemeEnabled();
FRAMELESSHELPER_EXPORT bool isDarkThemeEnabled();
FRAMELESSHELPER_EXPORT QWindow *findWindow(const WId winId);
FRAMELESSHELPER_EXPORT QImage getDesktopWallpaperImage(const int screen = -1);
FRAMELESSHELPER_EXPORT DesktopWallpaperAspectStyle getDesktopWallpaperAspectStyle(const int screen = -1);
FRAMELESSHELPER_EXPORT QRect getScreenAvailableGeometry();
FRAMELESSHELPER_EXPORT QRect alignedRect(const Qt::LayoutDirection direction, const Qt::Alignment alignment, const QSize &size, const QRect &rectangle);
FRAMELESSHELPER_EXPORT void blurImage(QImage &blurImage, const qreal radius, const bool quality, const int transposed = 0);
FRAMELESSHELPER_EXPORT void blurImage(QPainter *painter, QImage &blurImage, const qreal radius, const bool quality, const bool alphaOnly, const int transposed = 0);
#ifdef Q_OS_WINDOWS
// Windows specific
FRAMELESSHELPER_EXPORT bool isWin7OrGreater(); FRAMELESSHELPER_EXPORT bool isWin7OrGreater();
FRAMELESSHELPER_EXPORT bool isWin8OrGreater(); FRAMELESSHELPER_EXPORT bool isWin8OrGreater();
FRAMELESSHELPER_EXPORT bool isWin8Point1OrGreater(); FRAMELESSHELPER_EXPORT bool isWin8Point1OrGreater();
FRAMELESSHELPER_EXPORT bool isWin10OrGreater(); FRAMELESSHELPER_EXPORT bool isWin10OrGreater();
FRAMELESSHELPER_EXPORT bool isWin10OrGreater(const int subVer); FRAMELESSHELPER_EXPORT bool isWin10OrGreater(const int subVer);
FRAMELESSHELPER_EXPORT bool isMSWin10AcrylicEffectAvailable();
FRAMELESSHELPER_EXPORT bool isBlurEffectSupported(); FRAMELESSHELPER_EXPORT bool isDwmBlurAvailable();
FRAMELESSHELPER_EXPORT bool isAcrylicEffectSupported(); FRAMELESSHELPER_EXPORT bool isOfficialMSWin10AcrylicBlurAvailable();
FRAMELESSHELPER_EXPORT int getSystemMetric(const QWindow *window, const SystemMetric metric, const bool dpiAware, const bool forceSystemValue = false);
FRAMELESSHELPER_EXPORT bool setAcrylicEffectEnabled(const QWindow *window, const bool enabled, const QColor &gradientColor = {});
FRAMELESSHELPER_EXPORT bool isColorizationEnabled(); FRAMELESSHELPER_EXPORT bool isColorizationEnabled();
FRAMELESSHELPER_EXPORT QColor getColorizationColor(); FRAMELESSHELPER_EXPORT QColor getColorizationColor();
FRAMELESSHELPER_EXPORT bool isLightThemeEnabled();
FRAMELESSHELPER_EXPORT bool isDarkThemeEnabled();
FRAMELESSHELPER_EXPORT bool isHighContrastModeEnabled(); FRAMELESSHELPER_EXPORT bool isHighContrastModeEnabled();
FRAMELESSHELPER_EXPORT bool isDarkFrameEnabled(const QWindow *window); FRAMELESSHELPER_EXPORT bool isDarkFrameEnabled(const QWindow *window);
FRAMELESSHELPER_EXPORT bool isTransparencyEffectEnabled(); FRAMELESSHELPER_EXPORT bool isTransparencyEffectEnabled();
FRAMELESSHELPER_EXPORT QWindow *findWindow(const WId winId);
FRAMELESSHELPER_EXPORT void triggerFrameChange(const QWindow *window); FRAMELESSHELPER_EXPORT void triggerFrameChange(const QWindow *window);
FRAMELESSHELPER_EXPORT void updateFrameMargins(const QWindow *window, const bool reset); FRAMELESSHELPER_EXPORT void updateFrameMargins(const QWindow *window, const bool reset);
FRAMELESSHELPER_EXPORT void updateQtFrameMargins(QWindow *window, const bool enable); FRAMELESSHELPER_EXPORT void updateQtFrameMargins(QWindow *window, const bool enable);
FRAMELESSHELPER_EXPORT QImage getDesktopWallpaperImage(const int screen = -1);
FRAMELESSHELPER_EXPORT DesktopWallpaperAspectStyle getDesktopWallpaperAspectStyle(const int screen = -1);
FRAMELESSHELPER_EXPORT quint32 getWindowDpi(const QWindow *window); FRAMELESSHELPER_EXPORT quint32 getWindowDpi(const QWindow *window);
FRAMELESSHELPER_EXPORT QMargins getWindowNativeFrameMargins(const QWindow *window); FRAMELESSHELPER_EXPORT QMargins getWindowNativeFrameMargins(const QWindow *window);
FRAMELESSHELPER_EXPORT QRect getScreenAvailableGeometry();
FRAMELESSHELPER_EXPORT QRect alignedRect(const Qt::LayoutDirection direction, const Qt::Alignment alignment, const QSize &size, const QRect &rectangle);
FRAMELESSHELPER_EXPORT void blurImage(QImage &blurImage, const qreal radius, const bool quality, const int transposed = 0);
FRAMELESSHELPER_EXPORT void blurImage(QPainter *painter, QImage &blurImage, const qreal radius, const bool quality, const bool alphaOnly, const int transposed = 0);
FRAMELESSHELPER_EXPORT QColor getNativeWindowFrameColor(const bool isActive = true); FRAMELESSHELPER_EXPORT QColor getNativeWindowFrameColor(const bool isActive = true);
#endif
} }

View File

@ -37,6 +37,19 @@
#include <QtCore/qcoreapplication.h> #include <QtCore/qcoreapplication.h>
#include <QtCore/qdebug.h> #include <QtCore/qdebug.h>
#include <dwmapi.h> #include <dwmapi.h>
#include <QtGui/qpa/qplatformwindow.h>
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
#include <QtGui/qpa/qplatformnativeinterface.h>
#else
#include <QtGui/qpa/qplatformwindow_p.h>
#endif
#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0))
#include <QtCore/qoperatingsystemversion.h>
#else
#include <QtCore/qsysinfo.h>
#endif
Q_DECLARE_METATYPE(QMargins)
#ifndef USER_DEFAULT_SCREEN_DPI #ifndef USER_DEFAULT_SCREEN_DPI
// Only available since Windows Vista // Only available since Windows Vista
@ -188,7 +201,7 @@ using Win32Data = struct _FLH_UTILITIES_WIN32_DATA
Q_GLOBAL_STATIC(Win32Data, win32Data) Q_GLOBAL_STATIC(Win32Data, win32Data)
bool Utilities::isBlurEffectSupported() bool Utilities::isDwmBlurAvailable()
{ {
if (isWin8OrGreater()) { if (isWin8OrGreater()) {
return true; return true;
@ -272,7 +285,7 @@ int Utilities::getSystemMetric(const QWindow *window, const SystemMetric metric,
return ret; return ret;
} }
bool Utilities::setAcrylicEffectEnabled(const QWindow *window, const bool enabled, const QColor &gradientColor) bool Utilities::setBlurEffectEnabled(const QWindow *window, const bool enabled, const QColor &gradientColor)
{ {
Q_ASSERT(window); Q_ASSERT(window);
if (!window) { if (!window) {
@ -301,7 +314,7 @@ bool Utilities::setAcrylicEffectEnabled(const QWindow *window, const bool enable
qRound(colorizationColor.green() * (colorizationColor.alpha() / 255.0) + 255 - colorizationColor.alpha()), qRound(colorizationColor.green() * (colorizationColor.alpha() / 255.0) + 255 - colorizationColor.alpha()),
qRound(colorizationColor.blue() * (colorizationColor.alpha() / 255.0) + 255 - colorizationColor.alpha())); qRound(colorizationColor.blue() * (colorizationColor.alpha() / 255.0) + 255 - colorizationColor.alpha()));
} }
if (isMSWin10AcrylicEffectAvailable()) { if (isOfficialMSWin10AcrylicBlurAvailable()) {
accentPolicy.AccentState = ACCENT_ENABLE_ACRYLICBLURBEHIND; accentPolicy.AccentState = ACCENT_ENABLE_ACRYLICBLURBEHIND;
if (!gradientColor.isValid()) { if (!gradientColor.isValid()) {
accentPolicy.GradientColor = 0x01FFFFFF; accentPolicy.GradientColor = 0x01FFFFFF;
@ -542,3 +555,135 @@ QColor Utilities::getNativeWindowFrameColor(const bool isActive)
} }
return isColorizationEnabled() ? getColorizationColor() : (isDarkThemeEnabled() ? Qt::white : Qt::black); return isColorizationEnabled() ? getColorizationColor() : (isDarkThemeEnabled() ? Qt::white : Qt::black);
} }
void Utilities::updateQtFrameMargins(QWindow *window, const bool enable)
{
Q_ASSERT(window);
if (!window) {
return;
}
const int tbh = enable ? Utilities::getSystemMetric(window, Utilities::SystemMetric::TitleBarHeight, true, true) : 0;
const QMargins margins = {0, -tbh, 0, 0};
const QVariant marginsVar = QVariant::fromValue(margins);
window->setProperty("_q_windowsCustomMargins", marginsVar);
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
QPlatformWindow *platformWindow = window->handle();
if (platformWindow) {
QGuiApplication::platformNativeInterface()->setWindowProperty(platformWindow, QStringLiteral("WindowsCustomMargins"), marginsVar);
}
#else
auto *platformWindow = dynamic_cast<QNativeInterface::Private::QWindowsWindow *>(
window->handle());
if (platformWindow) {
platformWindow->setCustomMargins(margins);
}
#endif
}
bool Utilities::isWin7OrGreater()
{
#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0))
return QOperatingSystemVersion::current() >= QOperatingSystemVersion::Windows7;
#else
return QSysInfo::WindowsVersion >= QSysInfo::WV_WINDOWS7;
#endif
}
bool Utilities::isWin8OrGreater()
{
#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0))
return QOperatingSystemVersion::current() >= QOperatingSystemVersion::Windows8;
#else
return QSysInfo::WindowsVersion >= QSysInfo::WV_WINDOWS8;
#endif
}
bool Utilities::isWin8Point1OrGreater()
{
#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0))
return QOperatingSystemVersion::current() >= QOperatingSystemVersion::Windows8_1;
#else
return QSysInfo::WindowsVersion >= QSysInfo::WV_WINDOWS8_1;
#endif
}
bool Utilities::isWin10OrGreater()
{
#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0))
return QOperatingSystemVersion::current() >= QOperatingSystemVersion::Windows10;
#else
return QSysInfo::WindowsVersion >= QSysInfo::WV_WINDOWS10;
#endif
}
bool Utilities::isWin10OrGreater(const int subVer)
{
#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0))
return QOperatingSystemVersion::current() >= QOperatingSystemVersion(QOperatingSystemVersion::Windows, 10, 0, subVer);
#else
Q_UNUSED(ver);
return QSysInfo::WindowsVersion >= QSysInfo::WV_WINDOWS10;
#endif
}
static inline bool forceEnableDwmBlur()
{
return qEnvironmentVariableIsSet(_flh_global::_flh_acrylic_forceDWMBlur_flag);
}
static inline bool forceDisableWallpaperBlur()
{
return qEnvironmentVariableIsSet(_flh_global::_flh_acrylic_forceDisableWallpaperBlur_flag);
}
static inline bool forceEnableOfficialMSWin10AcrylicBlur()
{
return qEnvironmentVariableIsSet(_flh_global::_flh_acrylic_forceOfficialMSWin10Blur_flag);
}
static inline bool shouldUseOfficialMSWin10AcrylicBlur()
{
#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0))
const QOperatingSystemVersion currentVersion = QOperatingSystemVersion::current();
if (currentVersion > QOperatingSystemVersion::Windows10) {
return true;
}
return ((currentVersion.microVersion() >= 16190) && (currentVersion.microVersion() < 18362));
#else
// TODO
return false;
#endif
}
bool Utilities::isOfficialMSWin10AcrylicBlurAvailable()
{
if (!isWin10OrGreater()) {
return false;
}
if (!forceEnableDwmBlur() && !forceDisableWallpaperBlur()) {
// We can't enable the official Acrylic blur in wallpaper blur mode.
return false;
}
if (forceEnableOfficialMSWin10AcrylicBlur()) {
return true;
}
return shouldUseOfficialMSWin10AcrylicBlur();
}
static inline bool shouldUseOriginalDwmBlur()
{
#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0))
return Utilities::isWin10OrGreater() || (QOperatingSystemVersion::current() >= QOperatingSystemVersion::OSXYosemite);
#else
// TODO
return false;
#endif
}
bool Utilities::shouldUseTraditionalBlur()
{
if ((forceEnableDwmBlur() || forceDisableWallpaperBlur()) && shouldUseOriginalDwmBlur()) {
return true;
}
return false;
}