WIP: rounded corner of frameless window.

This commit is contained in:
Cheng Zhao 2013-09-11 18:10:28 +08:00
parent f38eb1b66f
commit 5d49fc4bee
2 changed files with 55 additions and 33 deletions

View file

@ -63,6 +63,9 @@ class NativeWindowMac : public NativeWindow {
// Called to handle a mouse event. // Called to handle a mouse event.
void HandleMouseEvent(NSEvent* event); void HandleMouseEvent(NSEvent* event);
// Clip web view to rounded corner.
void ClipWebView();
NSWindow*& window() { return window_; } NSWindow*& window() { return window_; }
SkRegion* draggable_region() const { return draggable_region_.get(); } SkRegion* draggable_region() const { return draggable_region_.get(); }

View file

@ -28,10 +28,6 @@
- (void)setBottomCornerRounded:(BOOL)rounded; - (void)setBottomCornerRounded:(BOOL)rounded;
@end @end
@interface NSView (WebContentsView)
- (void)setMouseDownCanMoveWindow:(BOOL)can_move;
@end
@interface NSView (PrivateMethods) @interface NSView (PrivateMethods)
- (CGFloat)roundedCornerRadius; - (CGFloat)roundedCornerRadius;
@end @end
@ -55,6 +51,11 @@
shell_->NotifyWindowBlur(); shell_->NotifyWindowBlur();
} }
- (void)windowDidResize:(NSNotification*)otification {
if (!shell_->has_frame())
shell_->ClipWebView();
}
- (void)windowWillClose:(NSNotification*)notification { - (void)windowWillClose:(NSNotification*)notification {
shell_->window() = nil; shell_->window() = nil;
[self autorelease]; [self autorelease];
@ -78,7 +79,7 @@
@end @end
@interface AtomNSWindow : AtomEventProcessingWindow { @interface AtomNSWindow : AtomEventProcessingWindow {
@private @protected
atom::NativeWindowMac* shell_; atom::NativeWindowMac* shell_;
} }
- (void)setShell:(atom::NativeWindowMac*)shell; - (void)setShell:(atom::NativeWindowMac*)shell;
@ -113,32 +114,30 @@
NSRectFill(rect); NSRectFill(rect);
// Set up our clip. // Set up our clip.
CGFloat cornerRadius = 4.0; CGFloat cornerRadius = 40.0;
if ([view respondsToSelector:@selector(roundedCornerRadius)]) // if ([view respondsToSelector:@selector(roundedCornerRadius)])
cornerRadius = [view roundedCornerRadius]; // cornerRadius = [view roundedCornerRadius];
[[NSBezierPath bezierPathWithRoundedRect:[view bounds] [[NSBezierPath bezierPathWithRoundedRect:[view bounds]
xRadius:cornerRadius xRadius:cornerRadius
yRadius:cornerRadius] addClip]; yRadius:cornerRadius] addClip];
[[NSColor whiteColor] set]; [[NSColor clearColor] set];
NSRectFill(rect); NSRectFill(rect);
} }
+ (NSRect)frameRectForContentRect:(NSRect)contentRect - (BOOL)canBecomeKeyWindow {
styleMask:(NSUInteger)mask { return YES;
return contentRect;
} }
+ (NSRect)contentRectForFrameRect:(NSRect)frameRect - (BOOL)hasShadow {
styleMask:(NSUInteger)mask { return YES;
return frameRect;
} }
- (NSRect)frameRectForContentRect:(NSRect)contentRect { - (void)keyDown:(NSEvent*)event {
return contentRect; [self redispatchKeyEvent:event];
} }
- (NSRect)contentRectForFrameRect:(NSRect)frameRect { - (void)keyUp:(NSEvent *)event {
return frameRect; [self redispatchKeyEvent:event];
} }
@end @end
@ -195,23 +194,29 @@ NativeWindowMac::NativeWindowMac(content::WebContents* web_contents,
(NSHeight(main_screen_rect) - height) / 2, (NSHeight(main_screen_rect) - height) / 2,
width, width,
height); height);
AtomNSWindow* atomWindow;
NSUInteger style_mask = NSTitledWindowMask | NSClosableWindowMask | NSUInteger style_mask = NSTitledWindowMask | NSClosableWindowMask |
NSMiniaturizableWindowMask | NSResizableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask |
NSTexturedBackgroundWindowMask; NSTexturedBackgroundWindowMask;
AtomNSWindow* atom_window = has_frame_ ? if (has_frame_) {
[[AtomNSWindow alloc] atomWindow = [[AtomNSWindow alloc]
initWithContentRect:cocoa_bounds initWithContentRect:cocoa_bounds
styleMask:style_mask styleMask:style_mask
backing:NSBackingStoreBuffered backing:NSBackingStoreBuffered
defer:YES] : defer:YES];
[[AtomFramelessNSWindow alloc] } else {
initWithContentRect:cocoa_bounds atomWindow = [[AtomFramelessNSWindow alloc]
styleMask:style_mask initWithContentRect:cocoa_bounds
backing:NSBackingStoreBuffered styleMask:style_mask
defer:YES]; backing:NSBackingStoreBuffered
[atom_window setShell:this]; defer:YES];
[atomWindow setBottomCornerRounded:YES];
}
[atomWindow setShell:this];
window_ = atomWindow;
window_ = atom_window;
[window() setDelegate:[[AtomNSWindowDelegate alloc] initWithShell:this]]; [window() setDelegate:[[AtomNSWindowDelegate alloc] initWithShell:this]];
// Disable fullscreen button when 'fullscreen' is specified to false. // Disable fullscreen button when 'fullscreen' is specified to false.
@ -434,7 +439,7 @@ gfx::NativeWindow NativeWindowMac::GetNativeWindow() {
bool NativeWindowMac::IsWithinDraggableRegion(NSPoint point) const { bool NativeWindowMac::IsWithinDraggableRegion(NSPoint point) const {
if (!draggable_region_) if (!draggable_region_)
return false; return false;
NSView* webView = web_contents()->GetView()->GetNativeView(); NSView* webView = GetWebContents()->GetView()->GetNativeView();
NSInteger webViewHeight = NSHeight([webView bounds]); NSInteger webViewHeight = NSHeight([webView bounds]);
// |draggable_region_| is stored in local platform-indepdent coordiate system // |draggable_region_| is stored in local platform-indepdent coordiate system
// while |point| is in local Cocoa coordinate system. Do the conversion // while |point| is in local Cocoa coordinate system. Do the conversion
@ -491,6 +496,8 @@ void NativeWindowMac::InstallView() {
[view setFrame:[frameView bounds]]; [view setFrame:[frameView bounds]];
[frameView addSubview:view]; [frameView addSubview:view];
ClipWebView();
[[window() standardWindowButton:NSWindowZoomButton] setHidden:YES]; [[window() standardWindowButton:NSWindowZoomButton] setHidden:YES];
[[window() standardWindowButton:NSWindowMiniaturizeButton] setHidden:YES]; [[window() standardWindowButton:NSWindowMiniaturizeButton] setHidden:YES];
[[window() standardWindowButton:NSWindowCloseButton] setHidden:YES]; [[window() standardWindowButton:NSWindowCloseButton] setHidden:YES];
@ -503,6 +510,18 @@ void NativeWindowMac::UninstallView() {
[view removeFromSuperview]; [view removeFromSuperview];
} }
void NativeWindowMac::ClipWebView() {
NSView* view = GetWebContents()->GetView()->GetNativeView();
CGFloat cornerRadius = 40.0;
// if ([view respondsToSelector:@selector(roundedCornerRadius)])
// cornerRadius = [view roundedCornerRadius];
view.wantsLayer = YES;
view.layer.masksToBounds = YES;
view.layer.cornerRadius = cornerRadius;
}
void NativeWindowMac::InstallDraggableRegionViews() { void NativeWindowMac::InstallDraggableRegionViews() {
DCHECK(!has_frame_); DCHECK(!has_frame_);