Browse Source

adds mask image for smooth vibrant view corners

gellert 8 years ago
parent
commit
456ea04683
1 changed files with 30 additions and 0 deletions
  1. 30 0
      atom/browser/native_window_mac.mm

+ 30 - 0
atom/browser/native_window_mac.mm

@@ -347,10 +347,12 @@ bool ScopedDisableResize::disable_resize_ = false;
 @property NSPoint windowButtonsOffset;
 @property (nonatomic, retain) AtomPreviewItem* quickLookItem;
 @property (nonatomic, retain) NSView* vibrantView;
+@property (nonatomic, retain) NSImage* cornerMask;
 
 - (void)setShell:(atom::NativeWindowMac*)shell;
 - (void)setEnableLargerThanScreen:(bool)enable;
 - (void)enableWindowButtonsOffset;
+- (NSImage*)_cornerMask;
 @end
 
 @implementation AtomNSWindow
@@ -504,6 +506,12 @@ bool ScopedDisableResize::disable_resize_ = false;
   return [[self contentView] superview];
 }
 
+// By overriding this built-in method the corners of the vibrant view (if set)
+// will be smooth.
+- (NSImage*)_cornerMask {
+  return [self cornerMask];
+}
+
 // Quicklook methods
 
 - (BOOL)acceptsPreviewPanelControl:(QLPreviewPanel*)panel {
@@ -1283,6 +1291,28 @@ void NativeWindowMac::SetVibrancy(const std::string& type) {
     [effect_view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
     [effect_view setBlendingMode:NSVisualEffectBlendingModeBehindWindow];
     [effect_view setState:NSVisualEffectStateActive];
+
+    // The default corner radius of a macOS window.
+    CGFloat radius = 5.0f;
+    CGFloat dimension = 2 * radius + 1;
+    NSSize size = NSMakeSize(dimension, dimension);
+    NSImage* maskImage = [NSImage imageWithSize:size
+                                        flipped:NO
+                                 drawingHandler:^BOOL(NSRect rect) {
+      NSBezierPath* bezierPath = [NSBezierPath
+                                  bezierPathWithRoundedRect:rect
+                                                    xRadius:radius
+                                                    yRadius:radius];
+      [[NSColor blackColor] set];
+      [bezierPath fill];
+      return YES;
+    }];
+    [maskImage setCapInsets:NSEdgeInsetsMake(radius, radius, radius, radius)];
+    [maskImage setResizingMode:NSImageResizingModeStretch];
+
+    [effect_view setMaskImage:maskImage];
+    [window_ setCornerMask:maskImage];
+
     [[window_ contentView] addSubview:effect_view
                            positioned:NSWindowBelow
                            relativeTo:nil];