From 62ef6e9eee169eb00263471754f84d9b1a4ddae9 Mon Sep 17 00:00:00 2001 From: Splitwirez Date: Fri, 24 Jul 2020 18:48:46 -0400 Subject: [PATCH 1/4] E --- src/Windows/Avalonia.Win32/WindowImpl.cs | 98 +++++++++++++++++++++--- 1 file changed, 87 insertions(+), 11 deletions(-) diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index 6f22f94056..30c4bf85a9 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel; +using System.Diagnostics; using System.Runtime.InteropServices; using Avalonia.Controls; using Avalonia.Controls.Platform; @@ -230,28 +231,103 @@ namespace Avalonia.Win32 private WindowTransparencyLevel EnableBlur(WindowTransparencyLevel transparencyLevel) { - bool canUseTransparency = false; - bool canUseAcrylic = false; - - if (Win32Platform.WindowsVersion.Major >= 10) + if (Win32Platform.WindowsVersion.Major >= 6) //On Windows Vista or newer { - canUseTransparency = true; - - if (Win32Platform.WindowsVersion.Major > 10 || Win32Platform.WindowsVersion.Build >= 19628) + if (DwmIsCompositionEnabled(out var compositionEnabled) != 0 || !compositionEnabled) //DWM is Disabled + { + return WindowTransparencyLevel.None; + } + else if (Win32Platform.WindowsVersion.Major >= 10) //On Windows 10 or Server 2016 + { + return Win10EnableBlur(transparencyLevel); + } + else if (Win32Platform.WindowsVersion.Minor >= 2) //On Windows 8.x { - canUseAcrylic = true; + return Win8xEnableBlur(transparencyLevel); + } + else + { + return Win7EnableBlur(transparencyLevel); //On Windows Vista or 7 } } + else //Impossible case or maybe Shorthorn/OneCore idk + { + return WindowTransparencyLevel.None; + } + } - if (!canUseTransparency || DwmIsCompositionEnabled(out var compositionEnabled) != 0 || !compositionEnabled) + private WindowTransparencyLevel Win7EnableBlur(WindowTransparencyLevel transparencyLevel) + { + if (transparencyLevel == WindowTransparencyLevel.AcrylicBlur) + transparencyLevel = WindowTransparencyLevel.Blur; + + DWM_BLURBEHIND blurInfo = new DWM_BLURBEHIND(false); + + if (transparencyLevel == WindowTransparencyLevel.Blur) { + blurInfo = new DWM_BLURBEHIND(true); + } + + DwmEnableBlurBehindWindow(_hwnd, ref blurInfo); + + if (transparencyLevel == WindowTransparencyLevel.Transparent) return WindowTransparencyLevel.None; + else + return transparencyLevel; + } + + private WindowTransparencyLevel Win8xEnableBlur(WindowTransparencyLevel transparencyLevel) + { + var accent = new AccentPolicy(); + var accentStructSize = Marshal.SizeOf(accent); + + if (transparencyLevel == WindowTransparencyLevel.AcrylicBlur) + { + transparencyLevel = WindowTransparencyLevel.Blur; + } + + + if (transparencyLevel == WindowTransparencyLevel.Transparent) + { + accent.AccentState = AccentState.ACCENT_ENABLE_BLURBEHIND; //Some of the AccentState Enum's values have different meanings on Windows 8.x than on Windows 10 + } + else + { + accent.AccentState = AccentState.ACCENT_DISABLED; + } + + + var accentPtr = Marshal.AllocHGlobal(accentStructSize); + Marshal.StructureToPtr(accent, accentPtr, false); + + var data = new WindowCompositionAttributeData(); + data.Attribute = WindowCompositionAttribute.WCA_ACCENT_POLICY; + data.SizeOfData = accentStructSize; + data.Data = accentPtr; + + SetWindowCompositionAttribute(_hwnd, ref data); + + Marshal.FreeHGlobal(accentPtr); + + if ((transparencyLevel >= WindowTransparencyLevel.Blur) && (Process.GetProcessesByName("aerohost").Length > 0)) //Use Windows 7 blur if the Aero glass mod is installed, since that's exactly what the mod does + Win7EnableBlur(transparencyLevel); + + return transparencyLevel; + } + + private WindowTransparencyLevel Win10EnableBlur(WindowTransparencyLevel transparencyLevel) + { + bool canUseAcrylic = false; + + if (Win32Platform.WindowsVersion.Major > 10 || Win32Platform.WindowsVersion.Build >= 19628) + { + canUseAcrylic = true; } var accent = new AccentPolicy(); var accentStructSize = Marshal.SizeOf(accent); - if(transparencyLevel == WindowTransparencyLevel.AcrylicBlur && !canUseAcrylic) + if (transparencyLevel == WindowTransparencyLevel.AcrylicBlur && !canUseAcrylic) { transparencyLevel = WindowTransparencyLevel.Blur; } @@ -291,7 +367,7 @@ namespace Avalonia.Win32 SetWindowCompositionAttribute(_hwnd, ref data); - Marshal.FreeHGlobal(accentPtr); + Marshal.FreeHGlobal(accentPtr); return transparencyLevel; } From 63fd7471ec4d58caab6a840515fadbbe41386e7c Mon Sep 17 00:00:00 2001 From: Splitwirez Date: Mon, 27 Jul 2020 10:07:39 -0400 Subject: [PATCH 2/4] Yeeted aerohost check --- src/Windows/Avalonia.Win32/WindowImpl.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index 30c4bf85a9..cae4b5307e 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -309,7 +309,7 @@ namespace Avalonia.Win32 Marshal.FreeHGlobal(accentPtr); - if ((transparencyLevel >= WindowTransparencyLevel.Blur) && (Process.GetProcessesByName("aerohost").Length > 0)) //Use Windows 7 blur if the Aero glass mod is installed, since that's exactly what the mod does + if (transparencyLevel >= WindowTransparencyLevel.Blur) //Use Windows 7 blur logic, which will produce blur if the Aero glass mod is installed and will merely look kinda stupid if not Win7EnableBlur(transparencyLevel); return transparencyLevel; From 54eb6d0343d618c147f771101d362c57bb02f19a Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 12 Aug 2020 16:56:28 +0100 Subject: [PATCH 3/4] remove comments, add missing braces (style), tidy. --- src/Windows/Avalonia.Win32/WindowImpl.cs | 37 ++++++++++++------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index cae4b5307e..8f93f778e1 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -231,26 +231,26 @@ namespace Avalonia.Win32 private WindowTransparencyLevel EnableBlur(WindowTransparencyLevel transparencyLevel) { - if (Win32Platform.WindowsVersion.Major >= 6) //On Windows Vista or newer + if (Win32Platform.WindowsVersion.Major >= 6) { - if (DwmIsCompositionEnabled(out var compositionEnabled) != 0 || !compositionEnabled) //DWM is Disabled + if (DwmIsCompositionEnabled(out var compositionEnabled) != 0 || !compositionEnabled) { return WindowTransparencyLevel.None; } - else if (Win32Platform.WindowsVersion.Major >= 10) //On Windows 10 or Server 2016 + else if (Win32Platform.WindowsVersion.Major >= 10) { return Win10EnableBlur(transparencyLevel); } - else if (Win32Platform.WindowsVersion.Minor >= 2) //On Windows 8.x + else if (Win32Platform.WindowsVersion.Minor >= 2) { return Win8xEnableBlur(transparencyLevel); } else { - return Win7EnableBlur(transparencyLevel); //On Windows Vista or 7 + return Win7EnableBlur(transparencyLevel); } } - else //Impossible case or maybe Shorthorn/OneCore idk + else { return WindowTransparencyLevel.None; } @@ -259,9 +259,11 @@ namespace Avalonia.Win32 private WindowTransparencyLevel Win7EnableBlur(WindowTransparencyLevel transparencyLevel) { if (transparencyLevel == WindowTransparencyLevel.AcrylicBlur) + { transparencyLevel = WindowTransparencyLevel.Blur; - - DWM_BLURBEHIND blurInfo = new DWM_BLURBEHIND(false); + } + + var blurInfo = new DWM_BLURBEHIND(false); if (transparencyLevel == WindowTransparencyLevel.Blur) { @@ -271,9 +273,13 @@ namespace Avalonia.Win32 DwmEnableBlurBehindWindow(_hwnd, ref blurInfo); if (transparencyLevel == WindowTransparencyLevel.Transparent) + { return WindowTransparencyLevel.None; + } else + { return transparencyLevel; + } } private WindowTransparencyLevel Win8xEnableBlur(WindowTransparencyLevel transparencyLevel) @@ -286,17 +292,15 @@ namespace Avalonia.Win32 transparencyLevel = WindowTransparencyLevel.Blur; } - if (transparencyLevel == WindowTransparencyLevel.Transparent) { - accent.AccentState = AccentState.ACCENT_ENABLE_BLURBEHIND; //Some of the AccentState Enum's values have different meanings on Windows 8.x than on Windows 10 + accent.AccentState = AccentState.ACCENT_ENABLE_BLURBEHIND; } else { accent.AccentState = AccentState.ACCENT_DISABLED; } - var accentPtr = Marshal.AllocHGlobal(accentStructSize); Marshal.StructureToPtr(accent, accentPtr, false); @@ -309,20 +313,17 @@ namespace Avalonia.Win32 Marshal.FreeHGlobal(accentPtr); - if (transparencyLevel >= WindowTransparencyLevel.Blur) //Use Windows 7 blur logic, which will produce blur if the Aero glass mod is installed and will merely look kinda stupid if not + if (transparencyLevel >= WindowTransparencyLevel.Blur) + { Win7EnableBlur(transparencyLevel); + } return transparencyLevel; } private WindowTransparencyLevel Win10EnableBlur(WindowTransparencyLevel transparencyLevel) { - bool canUseAcrylic = false; - - if (Win32Platform.WindowsVersion.Major > 10 || Win32Platform.WindowsVersion.Build >= 19628) - { - canUseAcrylic = true; - } + bool canUseAcrylic = Win32Platform.WindowsVersion.Major > 10 || Win32Platform.WindowsVersion.Build >= 19628; var accent = new AccentPolicy(); var accentStructSize = Marshal.SizeOf(accent); From c46df2b0a9369f6162d6682c718d7a6586af8472 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 12 Aug 2020 16:57:42 +0100 Subject: [PATCH 4/4] usings. --- src/Windows/Avalonia.Win32/WindowImpl.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index 8f93f778e1..ddc0cc4e42 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -1,13 +1,11 @@ using System; using System.Collections.Generic; using System.ComponentModel; -using System.Diagnostics; using System.Runtime.InteropServices; using Avalonia.Controls; using Avalonia.Controls.Platform; using Avalonia.Input; using Avalonia.Input.Raw; -using Avalonia.Media; using Avalonia.OpenGL; using Avalonia.Platform; using Avalonia.Rendering;