From 757220107b7725d2b40e792488f8f3ab4bad689e Mon Sep 17 00:00:00 2001 From: danwalmsley Date: Fri, 27 Mar 2020 19:10:09 -0300 Subject: [PATCH] Merge pull request #3699 from AvaloniaUI/fixes/osx-dont-zoom-when-normal-state-selected OSX backend calls OnResized to keep WindowState inSync. # Conflicts: # native/Avalonia.Native/src/OSX/window.mm --- native/Avalonia.Native/src/OSX/window.mm | 95 ++++++++++++++---------- 1 file changed, 56 insertions(+), 39 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/window.mm b/native/Avalonia.Native/src/OSX/window.mm index 9664bf13e4..cd42ea0437 100644 --- a/native/Avalonia.Native/src/OSX/window.mm +++ b/native/Avalonia.Native/src/OSX/window.mm @@ -31,9 +31,11 @@ public: AvnPoint lastPositionSet; NSString* _lastTitle; IAvnAppMenu* _mainMenu; + bool _shown; WindowBaseImpl(IAvnWindowBaseEvents* events, IAvnGlContext* gl) { + _shown = false; _mainMenu = nullptr; BaseEvents = events; _glContext = gl; @@ -116,6 +118,8 @@ public: [Window setTitle:_lastTitle]; [Window setTitleVisibility:NSWindowTitleVisible]; + + _shown = true; return S_OK; } @@ -401,6 +405,7 @@ protected: [Window setStyleMask:GetStyle()]; } +public: virtual void OnResized () { @@ -592,57 +597,63 @@ private: { _lastWindowState = state; - switch (state) { - case Maximized: - lastPositionSet.X = 0; - lastPositionSet.Y = 0; - - if([Window isMiniaturized]) - { - [Window deminiaturize:Window]; - } - - if(!IsZoomed()) - { - DoZoom(); - } - break; - - case Minimized: - [Window miniaturize:Window]; - break; - - default: - if([Window isMiniaturized]) - { - [Window deminiaturize:Window]; - } - - if(IsZoomed()) - { - DoZoom(); - } - break; + if(_shown) + { + switch (state) { + case Maximized: + lastPositionSet.X = 0; + lastPositionSet.Y = 0; + + if([Window isMiniaturized]) + { + [Window deminiaturize:Window]; + } + + if(!IsZoomed()) + { + DoZoom(); + } + break; + + case Minimized: + [Window miniaturize:Window]; + break; + + default: + if([Window isMiniaturized]) + { + [Window deminiaturize:Window]; + } + + if(IsZoomed()) + { + DoZoom(); + } + break; + } } return S_OK; } } - -protected: + virtual void OnResized () override { - auto windowState = [Window isMiniaturized] ? Minimized - : (IsZoomed() ? Maximized : Normal); - - if (windowState != _lastWindowState) + if(_shown) { - _lastWindowState = windowState; + auto windowState = [Window isMiniaturized] ? Minimized + : (IsZoomed() ? Maximized : Normal); - WindowEvents->WindowStateChanged(windowState); + if (windowState != _lastWindowState) + { + _lastWindowState = windowState; + + WindowEvents->WindowStateChanged(windowState); + } } } +protected: virtual NSWindowStyleMask GetStyle() override { unsigned long s = NSWindowStyleMaskBorderless; @@ -1290,6 +1301,11 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent } } +- (void)windowDidResize:(NSNotification *)notification +{ + _parent->OnResized(); +} + - (BOOL)windowShouldZoom:(NSWindow *)window toFrame:(NSRect)newFrame { return true; @@ -1360,6 +1376,7 @@ protected: [Window setContentSize:NSSize{x, y}]; [Window setFrameTopLeftPoint:ToNSPoint(ConvertPointY(lastPositionSet))]; + return S_OK; } }