Skip to content
This repository has been archived by the owner on Dec 19, 2023. It is now read-only.

Commit

Permalink
win: improve blur mode
Browse files Browse the repository at this point in the history
  • Loading branch information
wangwenx190 committed Sep 29, 2023
1 parent 786926e commit ba7aab0
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 18 deletions.
12 changes: 3 additions & 9 deletions include/FramelessHelper/Core/framelesshelper_windows.h
Original file line number Diff line number Diff line change
Expand Up @@ -780,19 +780,13 @@ using ACCENT_FLAG = enum ACCENT_FLAG
{
ACCENT_NONE = 0,
ACCENT_ENABLE_ACRYLIC = 1,
ACCENT_ENABLE_MICA = 1 << 1,
ACCENT_ENABLE_BORDER_LEFT = 1 << 5,
ACCENT_ENABLE_BORDER_TOP = 1 << 6,
ACCENT_ENABLE_BORDER_RIGHT = 1 << 7,
ACCENT_ENABLE_BORDER_BOTTOM = 1 << 8,
ACCENT_ENABLE_BORDER = ACCENT_ENABLE_BORDER_LEFT | ACCENT_ENABLE_BORDER_TOP | ACCENT_ENABLE_BORDER_RIGHT | ACCENT_ENABLE_BORDER_BOTTOM,
ACCENT_ENABLE_ALL = ACCENT_ENABLE_BORDER
ACCENT_ENABLE_ACRYLIC_WITH_LUMINOSITY = 482
};

using ACCENT_POLICY = struct ACCENT_POLICY
{
DWORD AccentState;
DWORD AccentFlags;
DWORD dwAccentState;
DWORD dwAccentFlags;
DWORD dwGradientColor; // #AABBGGRR
DWORD dwAnimationId;
};
Expand Down
54 changes: 45 additions & 9 deletions src/core/utils_win.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2334,8 +2334,40 @@ bool Utils::setBlurBehindWindowEnabled(const WId windowId, const BlurMode mode,
g_win32UtilsData()->micaWindowIds.removeAll(windowId);
std::ignore = updateWindowFrameMargins(windowId, false);
};
static const auto userPreferredBlurMode = []() -> std::optional<BlurMode> {
const QString option = qEnvironmentVariable("FRAMELESSHELPER_BLUR_MODE");
if (option.isEmpty()) {
return std::nullopt;
}
if (option.contains(FRAMELESSHELPER_STRING_LITERAL("MICAALT"), Qt::CaseInsensitive)) {
return BlurMode::Windows_MicaAlt;
}
if (option.contains(FRAMELESSHELPER_STRING_LITERAL("MICA"), Qt::CaseInsensitive)) {
return BlurMode::Windows_Mica;
}
if (option.contains(FRAMELESSHELPER_STRING_LITERAL("ACRYLIC"), Qt::CaseInsensitive)) {
return BlurMode::Windows_Acrylic;
}
if (option.contains(FRAMELESSHELPER_STRING_LITERAL("AERO"), Qt::CaseInsensitive)) {
return BlurMode::Windows_Aero;
}
return std::nullopt;
}();
static constexpr const auto kDefaultAcrylicOpacity = 0.8f;
static const auto acrylicOpacity = []() -> float {
const QString option = qEnvironmentVariable("FRAMELESSHELPER_ACRYLIC_OPACITY");
if (option.isEmpty()) {
return kDefaultAcrylicOpacity;
}
bool ok = false;
const float num = option.toFloat(&ok);
if (ok && !qIsNaN(num) && (num > float(0)) && (num < float(1))) {
return num;
}
return kDefaultAcrylicOpacity;
}();
static const bool preferMicaAlt = (qEnvironmentVariableIntValue("FRAMELESSHELPER_PREFER_MICA_ALT") != 0);
const auto blurMode = [mode]() -> BlurMode {
const auto recommendedBlurMode = [mode]() -> BlurMode {
if ((mode == BlurMode::Disable) || (mode == BlurMode::Windows_Aero)) {
return mode;
}
Expand Down Expand Up @@ -2366,6 +2398,7 @@ bool Utils::setBlurBehindWindowEnabled(const WId windowId, const BlurMode mode,
Q_UNREACHABLE_RETURN(BlurMode::Default);
QT_WARNING_POP
}();
const BlurMode blurMode = ((recommendedBlurMode == BlurMode::Disable) ? BlurMode::Disable : userPreferredBlurMode.value_or(recommendedBlurMode));
if (blurMode == BlurMode::Disable) {
bool result = true;
if (WindowsVersionHelper::isWin1122H2OrGreater()) {
Expand All @@ -2387,8 +2420,8 @@ bool Utils::setBlurBehindWindowEnabled(const WId windowId, const BlurMode mode,
} else {
ACCENT_POLICY policy;
SecureZeroMemory(&policy, sizeof(policy));
policy.AccentState = ACCENT_DISABLED;
policy.AccentFlags = ACCENT_NONE;
policy.dwAccentState = ACCENT_DISABLED;
policy.dwAccentFlags = ACCENT_NONE;
WINDOWCOMPOSITIONATTRIBDATA wcad;
SecureZeroMemory(&wcad, sizeof(wcad));
wcad.Attrib = WCA_ACCENT_POLICY;
Expand Down Expand Up @@ -2453,22 +2486,22 @@ bool Utils::setBlurBehindWindowEnabled(const WId windowId, const BlurMode mode,
ACCENT_POLICY policy;
SecureZeroMemory(&policy, sizeof(policy));
if (blurMode == BlurMode::Windows_Acrylic) {
policy.AccentState = ACCENT_ENABLE_ACRYLICBLURBEHIND;
policy.AccentFlags = ACCENT_ENABLE_ACRYLIC; // Mica: ACCENT_ENABLE_MICA | ACCENT_ENABLE_BORDER
policy.dwAccentState = ACCENT_ENABLE_ACRYLICBLURBEHIND;
policy.dwAccentFlags = ACCENT_ENABLE_ACRYLIC_WITH_LUMINOSITY;
const auto gradientColor = [&color]() -> QColor {
if (color.isValid()) {
return color;
}
QColor clr = ((FramelessManager::instance()->systemTheme() == SystemTheme::Dark) ? kDefaultSystemDarkColor : kDefaultSystemLightColor);
clr.setAlphaF(0.5f);
clr.setAlphaF(acrylicOpacity);
return clr;
}();
// This API expects the #AABBGGRR format.
policy.dwGradientColor = DWORD(qRgba(gradientColor.blue(),
gradientColor.green(), gradientColor.red(), gradientColor.alpha()));
} else if (blurMode == BlurMode::Windows_Aero) {
policy.AccentState = ACCENT_ENABLE_BLURBEHIND;
policy.AccentFlags = ACCENT_NONE;
policy.dwAccentState = ACCENT_ENABLE_BLURBEHIND;
policy.dwAccentFlags = ACCENT_NONE;
} else {
QT_WARNING_PUSH
QT_WARNING_DISABLE_MSVC(4702)
Expand Down Expand Up @@ -2597,7 +2630,10 @@ bool Utils::isBlurBehindWindowSupported()
if (FramelessConfig::instance()->isSet(Option::ForceNonNativeBackgroundBlur)) {
return false;
}
return WindowsVersionHelper::isWin11OrGreater();
// Enabling Mica on Win11 make it very hard to hide the original three caption buttons,
// and enabling Acrylic on Win10 makes the window very laggy during moving and resizing.
//return WindowsVersionHelper::isWin10OrGreater();
return false;
}();
return result;
}
Expand Down

0 comments on commit ba7aab0

Please sign in to comment.