From 12eb481fb73d4f8f29375770f8eecaab59542f9c Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 2 Jun 2020 16:17:37 -0300 Subject: [PATCH] Extended client area compatible with fullscreen mode. --- native/Avalonia.Native/src/OSX/window.mm | 36 ++++++++++++++++++++++-- src/Avalonia.Native/WindowImpl.cs | 20 +++++++++++-- 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/window.mm b/native/Avalonia.Native/src/OSX/window.mm index 5c64905a2f..0a57ee4c1f 100644 --- a/native/Avalonia.Native/src/OSX/window.mm +++ b/native/Avalonia.Native/src/OSX/window.mm @@ -586,6 +586,35 @@ private: if(_lastWindowState != state) { + if(_isClientAreaExtended) + { + if(_lastWindowState == FullScreen) + { + // we exited fs. + if(_extendClientHints & AvnChromeHintsOSXThickTitleBar) + { + Window.toolbar = [NSToolbar new]; + Window.toolbar.showsBaselineSeparator = false; + } + + [Window setTitlebarAppearsTransparent:true]; + + [StandardContainer setFrameSize: StandardContainer.frame.size]; + } + else if(state == FullScreen) + { + // we entered fs. + if(_extendClientHints & AvnChromeHintsOSXThickTitleBar) + { + Window.toolbar = nullptr; + } + + [Window setTitlebarAppearsTransparent:false]; + + [StandardContainer setFrameSize: StandardContainer.frame.size]; + } + } + _lastWindowState = state; WindowEvents->WindowStateChanged(state); } @@ -849,8 +878,9 @@ private: [Window setTitlebarAppearsTransparent:NO]; [Window setTitle:_lastTitle]; - [Window setStyleMask:NSWindowStyleMaskTitled | NSWindowStyleMaskResizable]; - + Window.styleMask = Window.styleMask | NSWindowStyleMaskTitled | NSWindowStyleMaskResizable; + Window.styleMask = Window.styleMask & ~NSWindowStyleMaskFullSizeContentView; + [Window toggleFullScreen:nullptr]; } @@ -999,7 +1029,7 @@ protected: s |= NSWindowStyleMaskMiniaturizable; } - if(_isClientAreaExtended) + if(_isClientAreaExtended && !_fullScreenActive) { s |= NSWindowStyleMaskFullSizeContentView | NSWindowStyleMaskTexturedBackground; } diff --git a/src/Avalonia.Native/WindowImpl.cs b/src/Avalonia.Native/WindowImpl.cs index 7e60fd1b1e..898cf2dea8 100644 --- a/src/Avalonia.Native/WindowImpl.cs +++ b/src/Avalonia.Native/WindowImpl.cs @@ -54,6 +54,8 @@ namespace Avalonia.Native void IAvnWindowEvents.WindowStateChanged(AvnWindowState state) { + _parent.InvalidateExtendedMargins(); + _parent.WindowStateChanged?.Invoke((WindowState)state); } @@ -136,15 +138,27 @@ namespace Avalonia.Native return false; } + private void InvalidateExtendedMargins () + { + if(WindowState == WindowState.FullScreen) + { + ExtendedMargins = new Thickness(); + } + else + { + ExtendedMargins = _isExtended ? new Thickness(0, _extendTitleBarHeight == -1 ? _native.GetExtendTitleBarHeight() : _extendTitleBarHeight, 0, 0) : new Thickness(); + } + + ExtendClientAreaToDecorationsChanged?.Invoke(_isExtended); + } + public void SetExtendClientAreaToDecorationsHint(bool extendIntoClientAreaHint) { _isExtended = extendIntoClientAreaHint; _native.SetExtendClientArea(extendIntoClientAreaHint); - ExtendedMargins = _isExtended ? new Thickness(0, _extendTitleBarHeight == -1 ? _native.GetExtendTitleBarHeight() : _extendTitleBarHeight, 0, 0) : new Thickness(); - - ExtendClientAreaToDecorationsChanged?.Invoke(extendIntoClientAreaHint); + InvalidateExtendedMargins(); } public void SetExtendClientAreaChromeHints(ExtendClientAreaChromeHints hints)