From a5fb0919503af001159ba89e6b60e5c0b35d5030 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 21 May 2021 17:28:53 +0100 Subject: [PATCH 1/8] remove shadow invalidation hacks. --- native/Avalonia.Native/src/OSX/window.h | 1 - native/Avalonia.Native/src/OSX/window.mm | 18 ------------------ 2 files changed, 19 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/window.h b/native/Avalonia.Native/src/OSX/window.h index 6a4ca2b8d8..b1f64bca88 100644 --- a/native/Avalonia.Native/src/OSX/window.h +++ b/native/Avalonia.Native/src/OSX/window.h @@ -34,7 +34,6 @@ class WindowBaseImpl; -(double) getScaling; -(double) getExtendedTitleBarHeight; -(void) setIsExtended:(bool)value; --(void) updateShadow; @end struct INSWindowHolder diff --git a/native/Avalonia.Native/src/OSX/window.mm b/native/Avalonia.Native/src/OSX/window.mm index e7c144b2d3..fb5b1c99a2 100644 --- a/native/Avalonia.Native/src/OSX/window.mm +++ b/native/Avalonia.Native/src/OSX/window.mm @@ -125,10 +125,6 @@ public: _shown = true; - dispatch_async(dispatch_get_main_queue(), ^{ - [Window updateShadow]; - }); - return S_OK; } } @@ -1842,19 +1838,6 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent double _lastScaling; } -- (void)updateShadow -{ - // Common problem in Cocoa where [invalidateShadow] does work, - // This hack forces Cocoa to invalidate the shadow. - - NSRect frame = [self frame]; - NSRect updatedFrame = NSMakeRect(frame.origin.x, frame.origin.y, frame.size.width + 1.0, frame.size.height + 1.0); - [self setFrame:updatedFrame display:YES]; - [self setFrame:frame display:YES]; - - [self invalidateShadow]; -} - -(void) setIsExtended:(bool)value; { _isExtended = value; @@ -2013,7 +1996,6 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent _lastScaling = [self backingScaleFactor]; [self setOpaque:NO]; [self setBackgroundColor: [NSColor clearColor]]; - [self invalidateShadow]; _isExtended = false; return self; } From 30035f3134901ca09ec7fcab456263161b429dfd Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 21 May 2021 17:29:17 +0100 Subject: [PATCH 2/8] set the content before Show is called, so that contentview is set after the size has been set. --- native/Avalonia.Native/src/OSX/window.mm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/native/Avalonia.Native/src/OSX/window.mm b/native/Avalonia.Native/src/OSX/window.mm index fb5b1c99a2..bdc6e4f828 100644 --- a/native/Avalonia.Native/src/OSX/window.mm +++ b/native/Avalonia.Native/src/OSX/window.mm @@ -50,7 +50,6 @@ public: [Window setBackingType:NSBackingStoreBuffered]; [Window setOpaque:false]; - [Window setContentView: StandardContainer]; } virtual HRESULT ObtainNSWindowHandle(void** ret) override @@ -112,6 +111,9 @@ public: { SetPosition(lastPositionSet); UpdateStyle(); + + [Window setContentView: StandardContainer]; + if(ShouldTakeFocusOnShow() && activate) { [Window makeKeyAndOrderFront:Window]; From ad9519102e7b8af0ff146ab7a4c94ff0af053307 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 21 May 2021 17:41:27 +0100 Subject: [PATCH 3/8] always set the window startuplocation before show. --- src/Avalonia.Controls/Window.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Avalonia.Controls/Window.cs b/src/Avalonia.Controls/Window.cs index 273ed790c3..700c3d9bad 100644 --- a/src/Avalonia.Controls/Window.cs +++ b/src/Avalonia.Controls/Window.cs @@ -668,10 +668,11 @@ namespace Avalonia.Controls Owner = parent; parent?.AddChild(this, false); - - PlatformImpl?.Show(ShowActivated); - Renderer?.Start(); + SetWindowStartupLocation(Owner?.PlatformImpl); + + PlatformImpl?.Show(ShowActivated); + Renderer?.Start(); } OnOpened(EventArgs.Empty); } @@ -739,6 +740,9 @@ namespace Avalonia.Controls PlatformImpl?.SetParent(owner.PlatformImpl); Owner = owner; owner.AddChild(this, true); + + SetWindowStartupLocation(owner.PlatformImpl); + PlatformImpl?.Show(ShowActivated); Renderer?.Start(); @@ -756,8 +760,6 @@ namespace Avalonia.Controls OnOpened(EventArgs.Empty); } - SetWindowStartupLocation(owner.PlatformImpl); - return result.Task; } From 99cdff2d7060700f94e2a769fe38a6c5fe751432 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 21 May 2021 22:07:55 +0100 Subject: [PATCH 4/8] fix screen centering on OSX before window has been shown. --- native/Avalonia.Native/src/OSX/window.mm | 21 +++++++++++++++++---- src/Avalonia.Controls/Window.cs | 6 +++++- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/window.mm b/native/Avalonia.Native/src/OSX/window.mm index bdc6e4f828..78092e12c6 100644 --- a/native/Avalonia.Native/src/OSX/window.mm +++ b/native/Avalonia.Native/src/OSX/window.mm @@ -25,6 +25,7 @@ public: ComPtr _glContext; NSObject* renderTarget; AvnPoint lastPositionSet; + CGSize _lastRequestedSize; NSString* _lastTitle; IAvnMenu* _mainMenu; @@ -193,9 +194,18 @@ public: { if(ret == nullptr) return E_POINTER; - auto frame = [View frame]; - ret->Width = frame.size.width; - ret->Height = frame.size.height; + + if(_shown) + { + auto frame = [View frame]; + ret->Width = frame.size.width; + ret->Height = frame.size.height; + } + else + { + ret->Width = _lastRequestedSize.width; + ret->Height = _lastRequestedSize.height; + } return S_OK; } } @@ -256,6 +266,9 @@ public: y = maxSize.height; } + _lastRequestedSize.width = x; + _lastRequestedSize.height = y; + [Window setContentSize:NSSize{x, y}]; return S_OK; @@ -530,7 +543,7 @@ private: _decorations = SystemDecorationsFull; _transitioningWindowState = false; _inSetWindowState = false; - _lastWindowState = Normal; + _lastWindowState = (AvnWindowState)-1; WindowEvents = events; [Window setCanBecomeKeyAndMain]; [Window disableCursorRects]; diff --git a/src/Avalonia.Controls/Window.cs b/src/Avalonia.Controls/Window.cs index 700c3d9bad..ab6e16d8dd 100644 --- a/src/Avalonia.Controls/Window.cs +++ b/src/Avalonia.Controls/Window.cs @@ -653,7 +653,11 @@ namespace Avalonia.Controls { using (BeginAutoSizing()) { - PlatformImpl?.Resize(initialSize); + if (PlatformImpl != null) + { + PlatformImpl.Resize(initialSize); + ClientSize = PlatformImpl.ClientSize; + } } } From a194fc12e2d3578b022cbeb0387f63b392ebf6df Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 21 May 2021 22:48:36 +0100 Subject: [PATCH 5/8] OSX backend initial sizing now has same behavior as windows. When window is not shown, and Resize is called, it will trigger a Resize event, that updates ClientSize. --- native/Avalonia.Native/src/OSX/window.mm | 13 +++++-------- src/Avalonia.Controls/Window.cs | 1 - 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/window.mm b/native/Avalonia.Native/src/OSX/window.mm index 78092e12c6..a4929c7c91 100644 --- a/native/Avalonia.Native/src/OSX/window.mm +++ b/native/Avalonia.Native/src/OSX/window.mm @@ -25,7 +25,6 @@ public: ComPtr _glContext; NSObject* renderTarget; AvnPoint lastPositionSet; - CGSize _lastRequestedSize; NSString* _lastTitle; IAvnMenu* _mainMenu; @@ -201,11 +200,7 @@ public: ret->Width = frame.size.width; ret->Height = frame.size.height; } - else - { - ret->Width = _lastRequestedSize.width; - ret->Height = _lastRequestedSize.height; - } + return S_OK; } } @@ -266,8 +261,10 @@ public: y = maxSize.height; } - _lastRequestedSize.width = x; - _lastRequestedSize.height = y; + if(!_shown) + { + BaseEvents->Resized(AvnSize{x,y}); + } [Window setContentSize:NSSize{x, y}]; diff --git a/src/Avalonia.Controls/Window.cs b/src/Avalonia.Controls/Window.cs index ab6e16d8dd..d2226503d2 100644 --- a/src/Avalonia.Controls/Window.cs +++ b/src/Avalonia.Controls/Window.cs @@ -656,7 +656,6 @@ namespace Avalonia.Controls if (PlatformImpl != null) { PlatformImpl.Resize(initialSize); - ClientSize = PlatformImpl.ClientSize; } } } From 92a29820b801a9b5fa6f996467cd81b942c3967a Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 21 May 2021 22:49:53 +0100 Subject: [PATCH 6/8] remove redundant if. --- native/Avalonia.Native/src/OSX/window.mm | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/window.mm b/native/Avalonia.Native/src/OSX/window.mm index a4929c7c91..63c221d64e 100644 --- a/native/Avalonia.Native/src/OSX/window.mm +++ b/native/Avalonia.Native/src/OSX/window.mm @@ -194,12 +194,9 @@ public: if(ret == nullptr) return E_POINTER; - if(_shown) - { - auto frame = [View frame]; - ret->Width = frame.size.width; - ret->Height = frame.size.height; - } + auto frame = [View frame]; + ret->Width = frame.size.width; + ret->Height = frame.size.height; return S_OK; } From c42cdebef80cc15c0cfa541004d15f5df638171c Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 21 May 2021 22:51:03 +0100 Subject: [PATCH 7/8] restore code. --- native/Avalonia.Native/src/OSX/window.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/native/Avalonia.Native/src/OSX/window.mm b/native/Avalonia.Native/src/OSX/window.mm index 63c221d64e..eb63cbd9f9 100644 --- a/native/Avalonia.Native/src/OSX/window.mm +++ b/native/Avalonia.Native/src/OSX/window.mm @@ -537,7 +537,7 @@ private: _decorations = SystemDecorationsFull; _transitioningWindowState = false; _inSetWindowState = false; - _lastWindowState = (AvnWindowState)-1; + _lastWindowState = Normal; WindowEvents = events; [Window setCanBecomeKeyAndMain]; [Window disableCursorRects]; From 75a7e365471faad4cea224e01845a5501e85c3be Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 21 May 2021 22:52:41 +0100 Subject: [PATCH 8/8] restore code --- src/Avalonia.Controls/Window.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Avalonia.Controls/Window.cs b/src/Avalonia.Controls/Window.cs index d2226503d2..700c3d9bad 100644 --- a/src/Avalonia.Controls/Window.cs +++ b/src/Avalonia.Controls/Window.cs @@ -653,10 +653,7 @@ namespace Avalonia.Controls { using (BeginAutoSizing()) { - if (PlatformImpl != null) - { - PlatformImpl.Resize(initialSize); - } + PlatformImpl?.Resize(initialSize); } }