Somewhat proper fast acrylic blur on win10 or above

pull/130/head
Peter Repukat 3 years ago
parent c19b1e4087
commit 46993b0dcb

@ -63,12 +63,20 @@
<LanguageStandard>stdcpp20</LanguageStandard>
<AdditionalOptions>/Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Manifest>
<EnableDpiAwareness>PerMonitorHighDPIAware</EnableDpiAwareness>
<AdditionalManifestFiles>$(ProjectDir)manifest.xml %(AdditionalManifestFiles)</AdditionalManifestFiles>
</Manifest>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<LanguageStandard>stdcpp20</LanguageStandard>
<AdditionalOptions>/Zc:__cplusplus %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<Manifest>
<EnableDpiAwareness>PerMonitorHighDPIAware</EnableDpiAwareness>
<AdditionalManifestFiles>$(ProjectDir)manifest.xml %(AdditionalManifestFiles)</AdditionalManifestFiles>
</Manifest>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'" Label="Configuration">
<ClCompile>
@ -109,6 +117,9 @@
<ItemGroup>
<ClInclude Include="qml\WinEventFilter.h" />
</ItemGroup>
<ItemGroup>
<Xml Include="manifest.xml" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Condition="Exists('$(QtMsBuild)\qt.targets')">
<Import Project="$(QtMsBuild)\qt.targets" />

@ -20,6 +20,9 @@
<Filter Include="qml">
<UniqueIdentifier>{4abd6243-b275-40c0-8927-27cebe0e7b5a}</UniqueIdentifier>
</Filter>
<Filter Include="manifest">
<UniqueIdentifier>{ace69ddb-7744-4e80-a55b-7beb33f0cc81}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="main.cpp">
@ -50,4 +53,9 @@
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Xml Include="manifest.xml">
<Filter>manifest</Filter>
</Xml>
</ItemGroup>
</Project>

@ -38,3 +38,14 @@ bool UIModel::getIsWindows() const
{
return is_windows_;
}
bool UIModel::hasAcrylicEffect() const
{
return has_acrylic_affect_;
}
void UIModel::setAcrylicEffect(bool has_acrylic_affect)
{
has_acrylic_affect_ = has_acrylic_affect;
emit acrylicChanged();
}

@ -21,7 +21,8 @@ class UIModel : public QObject
{
Q_OBJECT
Q_PROPERTY(bool isWindows READ getIsWindows CONSTANT)
Q_PROPERTY(bool isWindows READ getIsWindows CONSTANT)
Q_PROPERTY(bool hasAcrlyicEffect READ hasAcrylicEffect NOTIFY acrylicChanged)
public:
UIModel();
@ -29,6 +30,11 @@ public:
Q_INVOKABLE QStringList getTargetList() const;
bool getIsWindows() const;
[[nodiscard]] bool hasAcrylicEffect() const;
void setAcrylicEffect(bool has_acrylic_affect);
signals:
void acrylicChanged();
private:
std::filesystem::path config_path_;
@ -38,5 +44,6 @@ private:
#else
bool is_windows_ = false;
#endif
bool has_acrylic_affect_ = false;
};

@ -22,6 +22,7 @@ limitations under the License.
#define NOMINMAX
#include <Windows.h>
#include <dwmapi.h>
#include <VersionHelpers.h>
#pragma comment(lib, "Dwmapi.lib")
#endif
@ -36,7 +37,9 @@ enum AccentState
ACCENT_ENABLE_GRADIENT = 1,
ACCENT_ENABLE_TRANSPARENTGRADIENT = 2,
ACCENT_ENABLE_BLURBEHIND = 3,
ACCENT_INVALID_STATE = 4
ACCENT_ENABLE_ACRYLICBLURBEHIND = 4,
ACCENT_ENABLE_HOSTBACKDROP = 5, // RS5 1809
ACCENT_INVALID_STATE = 6
};
struct AccentPolicy
{
@ -98,25 +101,31 @@ int main(int argc, char* argv[])
DWM_BLURBEHIND bb{ .dwFlags = DWM_BB_ENABLE, .fEnable = true, .hRgnBlur = nullptr };
DwmEnableBlurBehindWindow(hwnd, &bb);
//// undoc stuff for aero >= Win10
//// leave for now... performance is crap!
//// for now we have to live with unblurred transparency. lol
//AccentPolicy accPol = { .AccentState = ACCENT_ENABLE_BLURBEHIND };
//WindowCompositionAttributeData data = {
// .Attribute = WindowCompositionAttribute::WCA_ACCENT_POLICY,
// .Data = &accPol,
// .SizeOfData = sizeof(accPol)
//};
//auto user32dll = GetModuleHandle(L"user32.dll");
//if (user32dll) {
// PSetWindowCompositionAttribute SetWindowCompositionAttribute = (
// reinterpret_cast<PSetWindowCompositionAttribute>(GetProcAddress(user32dll, "SetWindowCompositionAttribute"))
// );
// if (SetWindowCompositionAttribute)
// {
// SetWindowCompositionAttribute(hwnd, &data);
// }
//}
if (IsWindows10OrGreater())
{
// undoc stuff for aero >= Win10
int color = (0 << 24) + (0x21 << 16) + (0x11 << 8) + (0x11);
AccentPolicy accPol = { .AccentState = ACCENT_ENABLE_ACRYLICBLURBEHIND, .AccentFlags = 2, .GradientColor = color, .AnimationId = 0 };
WindowCompositionAttributeData data = {
.Attribute = WindowCompositionAttribute::WCA_ACCENT_POLICY,
.Data = &accPol,
.SizeOfData = sizeof(accPol)
};
auto user32dll = GetModuleHandle(L"user32.dll");
if (user32dll) {
PSetWindowCompositionAttribute SetWindowCompositionAttribute = (
reinterpret_cast<PSetWindowCompositionAttribute>(GetProcAddress(user32dll, "SetWindowCompositionAttribute"))
);
if (SetWindowCompositionAttribute)
{
auto res = SetWindowCompositionAttribute(hwnd, &data);
if (SUCCEEDED(res))
{
uimodel.setAcrylicEffect(true);
}
}
}
}
// extend the frame fully into the client area => draw all outside the window frame.
MARGINS margins = { -1 };

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<description>GlosSI - Config</description>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 10/11 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
</application>
</compatibility>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<!--<security>
<requestedPrivileges>
--><!--
UAC settings:
- app should run at same integrity level as calling process
- app does not need to manipulate windows belonging to
higher-integrity-level processes
--><!--
<requestedExecutionLevel
level="asInvoker"
uiAccess="false"
/>
</requestedPrivileges>
</security>-->
</trustInfo>
</assembly>

@ -30,7 +30,7 @@ Window {
title: qsTr("GlosSI - Config")
color: colorAlpha(Material.background, 0.98)
color: uiModel.hasAcrlyicEffect ? "transparent" : colorAlpha(Material.background, 0.9)
function toggleMaximized() {
if (window.visibility === Window.Maximized || window.visibility === Window.FullScreen) {
@ -120,7 +120,7 @@ Window {
anchors.leftMargin: -16
radius: 16
color: Qt.lighter(Material.background, 1.6)
bgOpacity: 0.8
bgOpacity: 0.3
Item {
anchors.top: parent.top

Loading…
Cancel
Save