Browse Source

Merge pull request #5943 from AvaloniaUI/fixes/missing-osx-shadow-border

trick to make OSX invalidate the shadow.
Dan Walmsley 4 years ago
parent
commit
13c34df75f
2 changed files with 19 additions and 1 deletions
  1. 1 0
      native/Avalonia.Native/src/OSX/window.h
  2. 18 1
      native/Avalonia.Native/src/OSX/window.mm

+ 1 - 0
native/Avalonia.Native/src/OSX/window.h

@@ -34,6 +34,7 @@ class WindowBaseImpl;
 -(double) getScaling;
 -(double) getExtendedTitleBarHeight;
 -(void) setIsExtended:(bool)value;
+-(void) updateShadow;
 @end
 
 struct INSWindowHolder

+ 18 - 1
native/Avalonia.Native/src/OSX/window.mm

@@ -124,7 +124,11 @@ public:
             [Window setTitle:_lastTitle];
             
             _shown = true;
-        
+            
+            dispatch_async(dispatch_get_main_queue(), ^{
+                [Window updateShadow];
+            });
+            
             return S_OK;
         }
     }
@@ -1838,6 +1842,19 @@ 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;