Browse Source

Merge pull request #7775 from trympet/fix-dwm-opaque-backdrop

Fix dwm opaque backdrop
pull/7930/head
Dan Walmsley 5 years ago
parent
commit
160a56091d
  1. 11
      src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs
  2. 60
      src/Windows/Avalonia.Win32/WinRT/Composition/WinUICompositorConnection.cs
  3. 6
      src/Windows/Avalonia.Win32/WinRT/winrt.idl
  4. 83
      src/Windows/Avalonia.Win32/WindowImpl.cs

11
src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs

@ -765,6 +765,14 @@ namespace Avalonia.Win32.Interop
DWMWA_CLOAK, DWMWA_CLOAK,
DWMWA_CLOAKED, DWMWA_CLOAKED,
DWMWA_FREEZE_REPRESENTATION, DWMWA_FREEZE_REPRESENTATION,
DWMWA_PASSIVE_UPDATE_MODE,
DWMWA_USE_HOSTBACKDROPBRUSH,
DWMWA_USE_IMMERSIVE_DARK_MODE = 20,
DWMWA_WINDOW_CORNER_PREFERENCE = 33,
DWMWA_BORDER_COLOR,
DWMWA_CAPTION_COLOR,
DWMWA_TEXT_COLOR,
DWMWA_VISIBLE_FRAME_BORDER_THICKNESS,
DWMWA_LAST DWMWA_LAST
}; };
@ -1456,6 +1464,9 @@ namespace Avalonia.Win32.Interop
[DllImport("dwmapi.dll")] [DllImport("dwmapi.dll")]
public static extern int DwmGetWindowAttribute(IntPtr hwnd, int dwAttribute, out RECT pvAttribute, int cbAttribute); public static extern int DwmGetWindowAttribute(IntPtr hwnd, int dwAttribute, out RECT pvAttribute, int cbAttribute);
[DllImport("dwmapi.dll")]
public static extern int DwmSetWindowAttribute(IntPtr hwnd, int dwAttribute, void* pvAttribute, int cbAttribute);
[DllImport("dwmapi.dll")] [DllImport("dwmapi.dll")]
public static extern int DwmIsCompositionEnabled(out bool enabled); public static extern int DwmIsCompositionEnabled(out bool enabled);

60
src/Windows/Avalonia.Win32/WinRT/Composition/WinUICompositorConnection.cs

@ -17,11 +17,11 @@ namespace Avalonia.Win32.WinRT.Composition
{ {
class WinUICompositorConnection : IRenderTimer class WinUICompositorConnection : IRenderTimer
{ {
public static readonly Version MinHostBackdropVersion = new Version(10, 0, 22000);
private readonly float? _backdropCornerRadius; private readonly float? _backdropCornerRadius;
private readonly EglContext _syncContext; private readonly EglContext _syncContext;
private readonly ICompositionBrush _micaBrush; private readonly ICompositionBrush _micaBrush;
private ICompositor _compositor; private ICompositor _compositor;
private ICompositor2 _compositor2;
private ICompositor5 _compositor5; private ICompositor5 _compositor5;
private ICompositorInterop _compositorInterop; private ICompositorInterop _compositorInterop;
private AngleWin32EglDisplay _angle; private AngleWin32EglDisplay _angle;
@ -39,12 +39,11 @@ namespace Avalonia.Win32.WinRT.Composition
_syncContext = _gl.PrimaryEglContext; _syncContext = _gl.PrimaryEglContext;
_angle = (AngleWin32EglDisplay)_gl.Display; _angle = (AngleWin32EglDisplay)_gl.Display;
_compositor = NativeWinRTMethods.CreateInstance<ICompositor>("Windows.UI.Composition.Compositor"); _compositor = NativeWinRTMethods.CreateInstance<ICompositor>("Windows.UI.Composition.Compositor");
_compositor2 = _compositor.QueryInterface<ICompositor2>();
_compositor5 = _compositor.QueryInterface<ICompositor5>(); _compositor5 = _compositor.QueryInterface<ICompositor5>();
_compositorInterop = _compositor.QueryInterface<ICompositorInterop>(); _compositorInterop = _compositor.QueryInterface<ICompositorInterop>();
_compositorDesktopInterop = _compositor.QueryInterface<ICompositorDesktopInterop>(); _compositorDesktopInterop = _compositor.QueryInterface<ICompositorDesktopInterop>();
using var device = MicroComRuntime.CreateProxyFor<IUnknown>(_angle.GetDirect3DDevice(), true); using var device = MicroComRuntime.CreateProxyFor<IUnknown>(_angle.GetDirect3DDevice(), true);
_device = _compositorInterop.CreateGraphicsDevice(device); _device = _compositorInterop.CreateGraphicsDevice(device);
_blurBrush = CreateAcrylicBlurBackdropBrush(); _blurBrush = CreateAcrylicBlurBackdropBrush();
_micaBrush = CreateMicaBackdropBrush(); _micaBrush = CreateMicaBackdropBrush();
@ -71,7 +70,7 @@ namespace Avalonia.Win32.WinRT.Composition
AvaloniaLocator.CurrentMutable.BindToSelf(connect); AvaloniaLocator.CurrentMutable.BindToSelf(connect);
AvaloniaLocator.CurrentMutable.Bind<IRenderTimer>().ToConstant(connect); AvaloniaLocator.CurrentMutable.Bind<IRenderTimer>().ToConstant(connect);
tcs.SetResult(true); tcs.SetResult(true);
} }
catch (Exception e) catch (Exception e)
{ {
@ -99,7 +98,7 @@ namespace Avalonia.Win32.WinRT.Composition
} }
public void Dispose() public void Dispose()
{ {
} }
public void Invoke(IAsyncAction asyncInfo, AsyncStatus asyncStatus) public void Invoke(IAsyncAction asyncInfo, AsyncStatus asyncStatus)
@ -118,12 +117,12 @@ namespace Avalonia.Win32.WinRT.Composition
{ {
} }
} }
private void RunLoop() private void RunLoop()
{ {
{ {
var st = Stopwatch.StartNew(); var st = Stopwatch.StartNew();
using (var act = _compositor5.RequestCommitAsync()) using (var act = _compositor5.RequestCommitAsync())
act.SetCompleted(new RunLoopHandler(this)); act.SetCompleted(new RunLoopHandler(this));
while (true) while (true)
{ {
@ -172,12 +171,12 @@ namespace Avalonia.Win32.WinRT.Composition
using var sc = _syncContext.EnsureLocked(); using var sc = _syncContext.EnsureLocked();
using var desktopTarget = _compositorDesktopInterop.CreateDesktopWindowTarget(hWnd, 0); using var desktopTarget = _compositorDesktopInterop.CreateDesktopWindowTarget(hWnd, 0);
using var target = desktopTarget.QueryInterface<ICompositionTarget>(); using var target = desktopTarget.QueryInterface<ICompositionTarget>();
using var drawingSurface = _device.CreateDrawingSurface(new UnmanagedMethods.SIZE(), DirectXPixelFormat.B8G8R8A8UIntNormalized, using var drawingSurface = _device.CreateDrawingSurface(new UnmanagedMethods.SIZE(), DirectXPixelFormat.B8G8R8A8UIntNormalized,
DirectXAlphaMode.Premultiplied); DirectXAlphaMode.Premultiplied);
using var surface = drawingSurface.QueryInterface<ICompositionSurface>(); using var surface = drawingSurface.QueryInterface<ICompositionSurface>();
using var surfaceInterop = drawingSurface.QueryInterface<ICompositionDrawingSurfaceInterop>(); using var surfaceInterop = drawingSurface.QueryInterface<ICompositionDrawingSurfaceInterop>();
using var surfaceBrush = _compositor.CreateSurfaceBrushWithSurface(surface); using var surfaceBrush = _compositor.CreateSurfaceBrushWithSurface(surface);
using var brush = surfaceBrush.QueryInterface<ICompositionBrush>(); using var brush = surfaceBrush.QueryInterface<ICompositionBrush>();
@ -190,7 +189,7 @@ namespace Avalonia.Win32.WinRT.Composition
using var containerVisual2 = container.QueryInterface<IVisual2>(); using var containerVisual2 = container.QueryInterface<IVisual2>();
containerVisual2.SetRelativeSizeAdjustment(new Vector2(1, 1)); containerVisual2.SetRelativeSizeAdjustment(new Vector2(1, 1));
using var containerChildren = container.Children; using var containerChildren = container.Children;
target.SetRoot(containerVisual); target.SetRoot(containerVisual);
using var blur = CreateBlurVisual(_blurBrush); using var blur = CreateBlurVisual(_blurBrush);
@ -202,10 +201,10 @@ namespace Avalonia.Win32.WinRT.Composition
} }
var compositionRoundedRectangleGeometry = ClipVisual(blur, mica); var compositionRoundedRectangleGeometry = ClipVisual(blur, mica);
containerChildren.InsertAtTop(blur); containerChildren.InsertAtTop(blur);
containerChildren.InsertAtTop(visual); containerChildren.InsertAtTop(visual);
return new WinUICompositedWindow(_syncContext, _compositor, _pumpLock, target, surfaceInterop, visual, return new WinUICompositedWindow(_syncContext, _compositor, _pumpLock, target, surfaceInterop, visual,
blur, mica, compositionRoundedRectangleGeometry); blur, mica, compositionRoundedRectangleGeometry);
} }
@ -234,10 +233,8 @@ namespace Avalonia.Win32.WinRT.Composition
var blurEffect = new WinUIGaussianBlurEffect(backDropParameterAsSource); var blurEffect = new WinUIGaussianBlurEffect(backDropParameterAsSource);
using var blurEffectFactory = _compositor.CreateEffectFactory(blurEffect); using var blurEffectFactory = _compositor.CreateEffectFactory(blurEffect);
using var compositionEffectBrush = blurEffectFactory.CreateBrush(); using var compositionEffectBrush = blurEffectFactory.CreateBrush();
using var backdrop = _compositor2.CreateBackdropBrush(); using var backdropBrush = CreateBackdropBrush();
using var backdropBrush = backdrop.QueryInterface<ICompositionBrush>();
var saturateEffect = new SaturationEffect(blurEffect); var saturateEffect = new SaturationEffect(blurEffect);
using var satEffectFactory = _compositor.CreateEffectFactory(saturateEffect); using var satEffectFactory = _compositor.CreateEffectFactory(saturateEffect);
using var sat = satEffectFactory.CreateBrush(); using var sat = satEffectFactory.CreateBrush();
@ -261,8 +258,8 @@ namespace Avalonia.Win32.WinRT.Composition
foreach (var visual in containerVisuals) foreach (var visual in containerVisuals)
{ {
visual?.SetClip(geometricClipWithGeometry.QueryInterface<ICompositionClip>()); visual?.SetClip(geometricClipWithGeometry.QueryInterface<ICompositionClip>());
} }
return roundedRectangleGeometry.CloneReference(); return roundedRectangleGeometry.CloneReference();
} }
@ -271,8 +268,8 @@ namespace Avalonia.Win32.WinRT.Composition
using var spriteVisual = _compositor.CreateSpriteVisual(); using var spriteVisual = _compositor.CreateSpriteVisual();
using var visual = spriteVisual.QueryInterface<IVisual>(); using var visual = spriteVisual.QueryInterface<IVisual>();
using var visual2 = spriteVisual.QueryInterface<IVisual2>(); using var visual2 = spriteVisual.QueryInterface<IVisual2>();
spriteVisual.SetBrush(compositionBrush); spriteVisual.SetBrush(compositionBrush);
visual.SetIsVisible(0); visual.SetIsVisible(0);
visual2.SetRelativeSizeAdjustment(new Vector2(1.0f, 1.0f)); visual2.SetRelativeSizeAdjustment(new Vector2(1.0f, 1.0f));
@ -280,6 +277,29 @@ namespace Avalonia.Win32.WinRT.Composition
return visual.CloneReference(); return visual.CloneReference();
} }
private ICompositionBrush CreateBackdropBrush()
{
ICompositionBackdropBrush brush = null;
try
{
if (Win32Platform.WindowsVersion >= MinHostBackdropVersion)
{
using var compositor3 = _compositor.QueryInterface<ICompositor3>();
brush = compositor3.CreateHostBackdropBrush();
}
else
{
using var compositor2 = _compositor.QueryInterface<ICompositor2>();
brush = compositor2.CreateBackdropBrush();
}
return brush.QueryInterface<ICompositionBrush>();
}
finally
{
brush?.Dispose();
}
}
public event Action<TimeSpan> Tick; public event Action<TimeSpan> Tick;
} }

6
src/Windows/Avalonia.Win32/WinRT/winrt.idl

@ -358,6 +358,12 @@ interface ICompositor2 : IInspectable
[overload("CreateStepEasingFunction")] HRESULT CreateStepEasingFunctionWithStepCount([in] INT32 stepCount, [out] [retval] void** result); [overload("CreateStepEasingFunction")] HRESULT CreateStepEasingFunctionWithStepCount([in] INT32 stepCount, [out] [retval] void** result);
} }
[uuid(C9DD8EF0-6EB1-4E3C-A658-675D9C64D4AB)]
interface ICompositor3 : IInspectable
{
HRESULT CreateHostBackdropBrush([out][retval] ICompositionBackdropBrush** result);
}
[uuid(0D8FB190-F122-5B8D-9FDD-543B0D8EB7F3)] [uuid(0D8FB190-F122-5B8D-9FDD-543B0D8EB7F3)]
interface ICompositorWithBlurredWallpaperBackdropBrush : IInspectable interface ICompositorWithBlurredWallpaperBackdropBrush : IInspectable
{ {

83
src/Windows/Avalonia.Win32/WindowImpl.cs

@ -84,7 +84,7 @@ namespace Avalonia.Win32
private Size _minSize; private Size _minSize;
private Size _maxSize; private Size _maxSize;
private POINT _maxTrackSize; private POINT _maxTrackSize;
private WindowImpl _parent; private WindowImpl _parent;
private ExtendClientAreaChromeHints _extendChromeHints = ExtendClientAreaChromeHints.Default; private ExtendClientAreaChromeHints _extendChromeHints = ExtendClientAreaChromeHints.Default;
private bool _isCloseRequested; private bool _isCloseRequested;
private bool _shown; private bool _shown;
@ -172,7 +172,7 @@ namespace Avalonia.Win32
public Action<PixelPoint> PositionChanged { get; set; } public Action<PixelPoint> PositionChanged { get; set; }
public Action<WindowState> WindowStateChanged { get; set; } public Action<WindowState> WindowStateChanged { get; set; }
public Action LostFocus { get; set; } public Action LostFocus { get; set; }
public Action<WindowTransparencyLevel> TransparencyLevelChanged { get; set; } public Action<WindowTransparencyLevel> TransparencyLevelChanged { get; set; }
@ -245,7 +245,7 @@ namespace Avalonia.Win32
{ {
get get
{ {
if(_isFullScreenActive) if (_isFullScreenActive)
{ {
return WindowState.FullScreen; return WindowState.FullScreen;
} }
@ -268,7 +268,7 @@ namespace Avalonia.Win32
ShowWindow(value, value != WindowState.Minimized); // If the window is minimized, it shouldn't be activated ShowWindow(value, value != WindowState.Minimized); // If the window is minimized, it shouldn't be activated
} }
_showWindowState = value; _showWindowState = value;
} }
} }
@ -276,7 +276,7 @@ namespace Avalonia.Win32
protected IntPtr Hwnd => _hwnd; protected IntPtr Hwnd => _hwnd;
public void SetTransparencyLevelHint (WindowTransparencyLevel transparencyLevel) public void SetTransparencyLevelHint(WindowTransparencyLevel transparencyLevel)
{ {
TransparencyLevel = EnableBlur(transparencyLevel); TransparencyLevel = EnableBlur(transparencyLevel);
} }
@ -316,12 +316,12 @@ namespace Avalonia.Win32
} }
var blurInfo = new DWM_BLURBEHIND(false); var blurInfo = new DWM_BLURBEHIND(false);
if (transparencyLevel == WindowTransparencyLevel.Blur) if (transparencyLevel == WindowTransparencyLevel.Blur)
{ {
blurInfo = new DWM_BLURBEHIND(true); blurInfo = new DWM_BLURBEHIND(true);
} }
DwmEnableBlurBehindWindow(_hwnd, ref blurInfo); DwmEnableBlurBehindWindow(_hwnd, ref blurInfo);
if (transparencyLevel == WindowTransparencyLevel.Transparent) if (transparencyLevel == WindowTransparencyLevel.Transparent)
@ -377,13 +377,24 @@ namespace Avalonia.Win32
{ {
if (_isUsingComposition) if (_isUsingComposition)
{ {
_blurHost?.SetBlur(transparencyLevel switch var effect = transparencyLevel switch
{ {
WindowTransparencyLevel.Mica => BlurEffect.Mica, WindowTransparencyLevel.Mica => BlurEffect.Mica,
WindowTransparencyLevel.AcrylicBlur => BlurEffect.Acrylic, WindowTransparencyLevel.AcrylicBlur => BlurEffect.Acrylic,
WindowTransparencyLevel.Blur => BlurEffect.Acrylic, WindowTransparencyLevel.Blur => BlurEffect.Acrylic,
_ => BlurEffect.None _ => BlurEffect.None
}); };
if (Win32Platform.WindowsVersion >= WinUICompositorConnection.MinHostBackdropVersion)
{
unsafe
{
int pvUseBackdropBrush = effect == BlurEffect.Acrylic ? 1 : 0;
DwmSetWindowAttribute(_hwnd, (int)DwmWindowAttribute.DWMWA_USE_HOSTBACKDROPBRUSH, &pvUseBackdropBrush, sizeof(int));
}
}
_blurHost?.SetBlur(effect);
return transparencyLevel; return transparencyLevel;
} }
@ -481,12 +492,12 @@ namespace Avalonia.Win32
if (customRendererFactory != null) if (customRendererFactory != null)
return customRendererFactory.Create(root, loop); return customRendererFactory.Create(root, loop);
return Win32Platform.UseDeferredRendering return Win32Platform.UseDeferredRendering
? _isUsingComposition ? _isUsingComposition
? new DeferredRenderer(root, loop) ? new DeferredRenderer(root, loop)
{ {
RenderOnlyOnRenderThread = true RenderOnlyOnRenderThread = true
} }
: (IRenderer)new DeferredRenderer(root, loop, rendererLock: _rendererLock) : (IRenderer)new DeferredRenderer(root, loop, rendererLock: _rendererLock)
: new ImmediateRenderer(root); : new ImmediateRenderer(root);
} }
@ -540,7 +551,7 @@ namespace Avalonia.Win32
{ {
BeforeCloseCleanup(true); BeforeCloseCleanup(true);
} }
DestroyWindow(_hwnd); DestroyWindow(_hwnd);
_hwnd = IntPtr.Zero; _hwnd = IntPtr.Zero;
} }
@ -606,7 +617,7 @@ namespace Avalonia.Win32
public void SetParent(IWindowImpl parent) public void SetParent(IWindowImpl parent)
{ {
_parent = (WindowImpl)parent; _parent = (WindowImpl)parent;
var parentHwnd = _parent?._hwnd ?? IntPtr.Zero; var parentHwnd = _parent?._hwnd ?? IntPtr.Zero;
if (parentHwnd == IntPtr.Zero && !_windowProperties.ShowInTaskbar) if (parentHwnd == IntPtr.Zero && !_windowProperties.ShowInTaskbar)
@ -717,7 +728,7 @@ namespace Avalonia.Win32
_isUsingComposition ? (int)WindowStyles.WS_EX_NOREDIRECTIONBITMAP : 0, _isUsingComposition ? (int)WindowStyles.WS_EX_NOREDIRECTIONBITMAP : 0,
atom, atom,
null, null,
(int)WindowStyles.WS_OVERLAPPEDWINDOW | (int) WindowStyles.WS_CLIPCHILDREN, (int)WindowStyles.WS_OVERLAPPEDWINDOW | (int)WindowStyles.WS_CLIPCHILDREN,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
@ -773,7 +784,7 @@ namespace Avalonia.Win32
} }
if (ShCoreAvailable && Win32Platform.WindowsVersion > PlatformConstants.Windows8) if (ShCoreAvailable && Win32Platform.WindowsVersion > PlatformConstants.Windows8)
{ {
var monitor = MonitorFromWindow( var monitor = MonitorFromWindow(
_hwnd, _hwnd,
MONITOR.MONITOR_DEFAULTTONEAREST); MONITOR.MONITOR_DEFAULTTONEAREST);
@ -856,14 +867,14 @@ namespace Avalonia.Win32
} }
TaskBarList.MarkFullscreen(_hwnd, fullscreen); TaskBarList.MarkFullscreen(_hwnd, fullscreen);
ExtendClientArea(); ExtendClientArea();
} }
private MARGINS UpdateExtendMargins() private MARGINS UpdateExtendMargins()
{ {
RECT borderThickness = new RECT(); RECT borderThickness = new RECT();
RECT borderCaptionThickness = new RECT(); RECT borderCaptionThickness = new RECT();
AdjustWindowRectEx(ref borderCaptionThickness, (uint)(GetStyle()), false, 0); AdjustWindowRectEx(ref borderCaptionThickness, (uint)(GetStyle()), false, 0);
AdjustWindowRectEx(ref borderThickness, (uint)(GetStyle() & ~WindowStyles.WS_CAPTION), false, 0); AdjustWindowRectEx(ref borderThickness, (uint)(GetStyle() & ~WindowStyles.WS_CAPTION), false, 0);
@ -886,7 +897,7 @@ namespace Avalonia.Win32
if (_extendTitleBarHint != -1) if (_extendTitleBarHint != -1)
{ {
borderCaptionThickness.top = (int)(_extendTitleBarHint * RenderScaling); borderCaptionThickness.top = (int)(_extendTitleBarHint * RenderScaling);
} }
margins.cyTopHeight = _extendChromeHints.HasAllFlags(ExtendClientAreaChromeHints.SystemChrome) && !_extendChromeHints.HasAllFlags(ExtendClientAreaChromeHints.PreferSystemChrome) ? borderCaptionThickness.top : 1; margins.cyTopHeight = _extendChromeHints.HasAllFlags(ExtendClientAreaChromeHints.SystemChrome) && !_extendChromeHints.HasAllFlags(ExtendClientAreaChromeHints.PreferSystemChrome) ? borderCaptionThickness.top : 1;
@ -911,7 +922,7 @@ namespace Avalonia.Win32
{ {
return; return;
} }
if (DwmIsCompositionEnabled(out bool compositionEnabled) < 0 || !compositionEnabled) if (DwmIsCompositionEnabled(out bool compositionEnabled) < 0 || !compositionEnabled)
{ {
_isClientAreaExtended = false; _isClientAreaExtended = false;
@ -939,11 +950,11 @@ namespace Avalonia.Win32
_offScreenMargin = new Thickness(); _offScreenMargin = new Thickness();
_extendedMargins = new Thickness(); _extendedMargins = new Thickness();
Resize(new Size(rcWindow.Width/ RenderScaling, rcWindow.Height / RenderScaling), PlatformResizeReason.Layout); Resize(new Size(rcWindow.Width / RenderScaling, rcWindow.Height / RenderScaling), PlatformResizeReason.Layout);
} }
if(!_isClientAreaExtended || (_extendChromeHints.HasAllFlags(ExtendClientAreaChromeHints.SystemChrome) && if (!_isClientAreaExtended || (_extendChromeHints.HasAllFlags(ExtendClientAreaChromeHints.SystemChrome) &&
!_extendChromeHints.HasAllFlags(ExtendClientAreaChromeHints.PreferSystemChrome))) !_extendChromeHints.HasAllFlags(ExtendClientAreaChromeHints.PreferSystemChrome)))
{ {
EnableCloseButton(_hwnd); EnableCloseButton(_hwnd);
@ -959,12 +970,12 @@ namespace Avalonia.Win32
private void ShowWindow(WindowState state, bool activate) private void ShowWindow(WindowState state, bool activate)
{ {
_shown = true; _shown = true;
if (_isClientAreaExtended) if (_isClientAreaExtended)
{ {
ExtendClientArea(); ExtendClientArea();
} }
ShowWindowCommand? command; ShowWindowCommand? command;
var newWindowProperties = _windowProperties; var newWindowProperties = _windowProperties;
@ -982,7 +993,7 @@ namespace Avalonia.Win32
case WindowState.Normal: case WindowState.Normal:
newWindowProperties.IsFullScreen = false; newWindowProperties.IsFullScreen = false;
command = IsWindowVisible(_hwnd) ? ShowWindowCommand.Restore : command = IsWindowVisible(_hwnd) ? ShowWindowCommand.Restore :
activate ? ShowWindowCommand.Normal : ShowWindowCommand.ShowNoActivate; activate ? ShowWindowCommand.Normal : ShowWindowCommand.ShowNoActivate;
break; break;
@ -1013,7 +1024,7 @@ namespace Avalonia.Win32
SetForegroundWindow(_hwnd); SetForegroundWindow(_hwnd);
} }
} }
private void BeforeCloseCleanup(bool isDisposing) private void BeforeCloseCleanup(bool isDisposing)
{ {
// Based on https://github.com/dotnet/wpf/blob/master/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Window.cs#L4270-L4337 // Based on https://github.com/dotnet/wpf/blob/master/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Window.cs#L4270-L4337
@ -1031,7 +1042,7 @@ namespace Avalonia.Win32
// Our window closed callback will set enabled state to a correct value after child window gets destroyed. // Our window closed callback will set enabled state to a correct value after child window gets destroyed.
_parent.SetEnabled(true); _parent.SetEnabled(true);
} }
// We also need to activate our parent window since again OS might try to activate a window behind if it is not set. // We also need to activate our parent window since again OS might try to activate a window behind if it is not set.
if (wasActive) if (wasActive)
{ {
@ -1058,7 +1069,7 @@ namespace Avalonia.Win32
SetWindowPos(_hwnd, WindowPosZOrder.HWND_NOTOPMOST, x, y, cx, cy, SetWindowPosFlags.SWP_SHOWWINDOW); SetWindowPos(_hwnd, WindowPosZOrder.HWND_NOTOPMOST, x, y, cx, cy, SetWindowPosFlags.SWP_SHOWWINDOW);
} }
} }
} }
private WindowStyles GetWindowStateStyles() private WindowStyles GetWindowStateStyles()
{ {
@ -1235,7 +1246,7 @@ namespace Avalonia.Win32
SetWindowPosFlags.SWP_NOZORDER | SetWindowPosFlags.SWP_NOACTIVATE | SetWindowPosFlags.SWP_NOZORDER | SetWindowPosFlags.SWP_NOACTIVATE |
SetWindowPosFlags.SWP_FRAMECHANGED); SetWindowPosFlags.SWP_FRAMECHANGED);
} }
} }
} }
private const int MF_BYCOMMAND = 0x0; private const int MF_BYCOMMAND = 0x0;
@ -1285,9 +1296,9 @@ namespace Avalonia.Win32
public void SetExtendClientAreaToDecorationsHint(bool hint) public void SetExtendClientAreaToDecorationsHint(bool hint)
{ {
_isClientAreaExtended = hint; _isClientAreaExtended = hint;
ExtendClientArea(); ExtendClientArea();
} }
public void SetExtendClientAreaChromeHints(ExtendClientAreaChromeHints hints) public void SetExtendClientAreaChromeHints(ExtendClientAreaChromeHints hints)
{ {
@ -1295,7 +1306,7 @@ namespace Avalonia.Win32
ExtendClientArea(); ExtendClientArea();
} }
/// <inheritdoc/> /// <inheritdoc/>
public void SetExtendClientAreaTitleBarHeightHint(double titleBarHeight) public void SetExtendClientAreaTitleBarHeightHint(double titleBarHeight)
{ {
@ -1309,7 +1320,7 @@ namespace Avalonia.Win32
/// <inheritdoc/> /// <inheritdoc/>
public Action<bool> ExtendClientAreaToDecorationsChanged { get; set; } public Action<bool> ExtendClientAreaToDecorationsChanged { get; set; }
/// <inheritdoc/> /// <inheritdoc/>
public bool NeedsManagedDecorations => _isClientAreaExtended && _extendChromeHints.HasAllFlags(ExtendClientAreaChromeHints.PreferSystemChrome); public bool NeedsManagedDecorations => _isClientAreaExtended && _extendChromeHints.HasAllFlags(ExtendClientAreaChromeHints.PreferSystemChrome);
@ -1348,7 +1359,7 @@ namespace Avalonia.Win32
{ {
private readonly WindowImpl _owner; private readonly WindowImpl _owner;
private readonly PlatformResizeReason _restore; private readonly PlatformResizeReason _restore;
public ResizeReasonScope(WindowImpl owner, PlatformResizeReason restore) public ResizeReasonScope(WindowImpl owner, PlatformResizeReason restore)
{ {
_owner = owner; _owner = owner;

Loading…
Cancel
Save