From 730862b753d6eafc2e053cbd2db2840c77d9b0ba Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 22 May 2020 09:35:30 -0300 Subject: [PATCH] Add acrylic blur level with fallbacks to blur reported. --- src/Avalonia.Controls/TopLevel.cs | 16 +++++++++++++++- src/Avalonia.Controls/WindowTransparencyLevel.cs | 7 ++++++- src/Avalonia.Native/WindowImplBase.cs | 5 +++++ src/Windows/Avalonia.Win32/WindowImpl.cs | 11 +++++++++-- 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index fa5f16f891..bd41eb5f28 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -376,13 +376,27 @@ namespace Avalonia.Controls LayoutHelper.InvalidateSelfAndChildrenMeasure(this); } + private bool TransparencyLevelsMatch (WindowTransparencyLevel requested, WindowTransparencyLevel received) + { + if(requested == received) + { + return true; + } + else if(requested >= WindowTransparencyLevel.Blur && received >= WindowTransparencyLevel.Blur) + { + return true; + } + + return false; + } + protected virtual void HandleTransparencyLevelChanged(WindowTransparencyLevel transparencyLevel) { if(_transparencyFallbackBorder != null) { if(transparencyLevel == WindowTransparencyLevel.None || TransparencyLevelHint == WindowTransparencyLevel.None || - transparencyLevel != TransparencyLevelHint) + !TransparencyLevelsMatch(TransparencyLevelHint, transparencyLevel)) { _transparencyFallbackBorder.Background = TransparencyBackgroundFallback; } diff --git a/src/Avalonia.Controls/WindowTransparencyLevel.cs b/src/Avalonia.Controls/WindowTransparencyLevel.cs index f5fc0ca9dd..ce7c03efbb 100644 --- a/src/Avalonia.Controls/WindowTransparencyLevel.cs +++ b/src/Avalonia.Controls/WindowTransparencyLevel.cs @@ -15,6 +15,11 @@ /// /// The window background is a blur-behind where nothing is drawn in the window. /// - Blur + Blur, + + /// + /// The window background is a blur-behind with a high blur radius. This level may fallback to Blur. + /// + AcrylicBlur } } diff --git a/src/Avalonia.Native/WindowImplBase.cs b/src/Avalonia.Native/WindowImplBase.cs index 5072d98256..77200b0a95 100644 --- a/src/Avalonia.Native/WindowImplBase.cs +++ b/src/Avalonia.Native/WindowImplBase.cs @@ -395,6 +395,11 @@ namespace Avalonia.Native { if (TransparencyLevel != transparencyLevel) { + if (transparencyLevel >= WindowTransparencyLevel.Blur) + { + transparencyLevel = WindowTransparencyLevel.AcrylicBlur; + } + TransparencyLevel = transparencyLevel; _native.SetBlurEnabled(TransparencyLevel >= WindowTransparencyLevel.Blur); diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index b7ec6e0d5a..0cf5a73b9f 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -239,6 +239,11 @@ namespace Avalonia.Win32 var accent = new AccentPolicy(); var accentStructSize = Marshal.SizeOf(accent); + if(transparencyLevel == WindowTransparencyLevel.AcrylicBlur && !canUseAcrylic) + { + transparencyLevel = WindowTransparencyLevel.Blur; + } + switch (transparencyLevel) { default: @@ -251,11 +256,13 @@ namespace Avalonia.Win32 break; case WindowTransparencyLevel.Blur: - accent.AccentState = canUseAcrylic ? AccentState.ACCENT_ENABLE_ACRYLIC : AccentState.ACCENT_ENABLE_BLURBEHIND; + accent.AccentState = AccentState.ACCENT_ENABLE_BLURBEHIND; break; - case (WindowTransparencyLevel.Blur + 1): // hack force acrylic on windows 10. + case WindowTransparencyLevel.AcrylicBlur: + case (WindowTransparencyLevel.AcrylicBlur + 1): // hack-force acrylic. accent.AccentState = AccentState.ACCENT_ENABLE_ACRYLIC; + transparencyLevel = WindowTransparencyLevel.AcrylicBlur; break; }