OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/cocoa/extensions/shell_window_cocoa.h" | 5 #include "chrome/browser/ui/cocoa/extensions/shell_window_cocoa.h" |
6 | 6 |
7 #include "base/mac/mac_util.h" | 7 #include "base/mac/mac_util.h" |
8 #include "base/sys_string_conversions.h" | 8 #include "base/sys_string_conversions.h" |
9 #include "chrome/browser/profiles/profile.h" | 9 #include "chrome/browser/profiles/profile.h" |
10 #include "chrome/browser/ui/cocoa/browser_window_utils.h" | 10 #include "chrome/browser/ui/cocoa/browser_window_utils.h" |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
75 cornerRadius = [view roundedCornerRadius]; | 75 cornerRadius = [view roundedCornerRadius]; |
76 [[NSBezierPath bezierPathWithRoundedRect:[view bounds] | 76 [[NSBezierPath bezierPathWithRoundedRect:[view bounds] |
77 xRadius:cornerRadius | 77 xRadius:cornerRadius |
78 yRadius:cornerRadius] addClip]; | 78 yRadius:cornerRadius] addClip]; |
79 [[NSColor whiteColor] set]; | 79 [[NSColor whiteColor] set]; |
80 NSRectFill(rect); | 80 NSRectFill(rect); |
81 } | 81 } |
82 | 82 |
83 @end | 83 @end |
84 | 84 |
85 @interface ControlRegionView : NSView | |
86 @end | |
87 @implementation ControlRegionView | |
88 - (BOOL)mouseDownCanMoveWindow { | |
89 return NO; | |
90 } | |
91 - (NSView*)hitTest:(NSPoint)aPoint { | |
92 return nil; | |
93 } | |
94 @end | |
95 | |
96 @interface NSView (WebContentsView) | |
97 - (void)setMouseDownCanMoveWindow:(BOOL)can_move; | |
98 @end | |
99 | |
85 ShellWindowCocoa::ShellWindowCocoa(Profile* profile, | 100 ShellWindowCocoa::ShellWindowCocoa(Profile* profile, |
86 const extensions::Extension* extension, | 101 const extensions::Extension* extension, |
87 const GURL& url, | 102 const GURL& url, |
88 const ShellWindow::CreateParams& params) | 103 const ShellWindow::CreateParams& params) |
89 : ShellWindow(profile, extension, url), | 104 : ShellWindow(profile, extension, url), |
105 has_frame_(params.frame == ShellWindow::CreateParams::FRAME_CHROME), | |
90 attention_request_id_(0) { | 106 attention_request_id_(0) { |
91 // Flip coordinates based on the primary screen. | 107 // Flip coordinates based on the primary screen. |
92 NSRect main_screen_rect = [[[NSScreen screens] objectAtIndex:0] frame]; | 108 NSRect main_screen_rect = [[[NSScreen screens] objectAtIndex:0] frame]; |
93 NSRect cocoa_bounds = NSMakeRect(params.bounds.x(), | 109 NSRect cocoa_bounds = NSMakeRect(params.bounds.x(), |
94 NSHeight(main_screen_rect) - params.bounds.y() - params.bounds.height(), | 110 NSHeight(main_screen_rect) - params.bounds.y() - params.bounds.height(), |
95 params.bounds.width(), params.bounds.height()); | 111 params.bounds.width(), params.bounds.height()); |
96 NSUInteger style_mask = NSTitledWindowMask | NSClosableWindowMask | | 112 NSUInteger style_mask = NSTitledWindowMask | NSClosableWindowMask | |
97 NSMiniaturizableWindowMask | NSResizableWindowMask | | 113 NSMiniaturizableWindowMask | NSResizableWindowMask | |
98 NSTexturedBackgroundWindowMask; | 114 NSTexturedBackgroundWindowMask; |
99 scoped_nsobject<NSWindow> window([[ShellNSWindow alloc] | 115 scoped_nsobject<NSWindow> window([[ShellNSWindow alloc] |
(...skipping 10 matching lines...) Expand all Loading... | |
110 if (max_size.width() || max_size.height()) { | 126 if (max_size.width() || max_size.height()) { |
111 CGFloat max_width = max_size.width() ? max_size.width() : CGFLOAT_MAX; | 127 CGFloat max_width = max_size.width() ? max_size.width() : CGFLOAT_MAX; |
112 CGFloat max_height = max_size.height() ? max_size.height() : CGFLOAT_MAX; | 128 CGFloat max_height = max_size.height() ? max_size.height() : CGFLOAT_MAX; |
113 [window setContentMaxSize:NSMakeSize(max_width, max_height)]; | 129 [window setContentMaxSize:NSMakeSize(max_width, max_height)]; |
114 } | 130 } |
115 | 131 |
116 if (base::mac::IsOSSnowLeopardOrEarlier() && | 132 if (base::mac::IsOSSnowLeopardOrEarlier() && |
117 [window respondsToSelector:@selector(setBottomCornerRounded:)]) | 133 [window respondsToSelector:@selector(setBottomCornerRounded:)]) |
118 [window setBottomCornerRounded:NO]; | 134 [window setBottomCornerRounded:NO]; |
119 | 135 |
120 NSView* view = web_contents()->GetView()->GetNativeView(); | |
121 [view setFrame:[[window contentView] bounds]]; | |
122 [view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; | |
123 [[window contentView] addSubview:view]; | |
124 | |
125 window_controller_.reset( | 136 window_controller_.reset( |
126 [[ShellWindowController alloc] initWithWindow:window.release()]); | 137 [[ShellWindowController alloc] initWithWindow:window.release()]); |
138 | |
139 NSView* view = web_contents()->GetView()->GetNativeView(); | |
140 [view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; | |
141 | |
142 if (!has_frame_) { | |
143 // TODO(jeremya): this is a temporary hack to allow moving the window while | |
144 // we still don't have proper draggable region support. | |
145 NSView* controlRegion = [[ControlRegionView alloc] init]; | |
sail
2012/08/07 17:40:11
this should be scoped_nsobject
| |
146 [controlRegion setFrame:NSMakeRect(0, 0, NSWidth([view bounds]), | |
147 NSHeight([view bounds]) - 20)]; | |
148 [controlRegion setAutoresizingMask: | |
149 NSViewWidthSizable | NSViewHeightSizable]; | |
150 [view addSubview:controlRegion]; | |
151 [controlRegion release]; | |
152 } | |
153 | |
154 InstallView(); | |
155 | |
127 [[window_controller_ window] setDelegate:window_controller_]; | 156 [[window_controller_ window] setDelegate:window_controller_]; |
128 [window_controller_ setShellWindow:this]; | 157 [window_controller_ setShellWindow:this]; |
129 } | 158 } |
130 | 159 |
160 void ShellWindowCocoa::InstallView() { | |
161 NSView* view = web_contents()->GetView()->GetNativeView(); | |
162 if (has_frame_) { | |
163 [view setFrame:[[window() contentView] bounds]]; | |
164 [[window() contentView] addSubview:view]; | |
165 } else { | |
166 // TODO(jeremya): find a cleaner way to send this information to the | |
167 // WebContentsViewCocoa view. | |
Avi (use Gerrit)
2012/08/03 05:19:49
Grrr. :(
jeremya
2012/08/05 22:52:42
I know :( :(
I'm thinking that maybe the setMouse
| |
168 DCHECK([view | |
169 respondsToSelector:@selector(setMouseDownCanMoveWindow:)]); | |
170 [view setMouseDownCanMoveWindow:YES]; | |
171 | |
172 NSView* frameView = [[window() contentView] superview]; | |
173 [view setFrame:[frameView bounds]]; | |
174 [frameView addSubview:view]; | |
175 | |
176 [[window() standardWindowButton:NSWindowZoomButton] setHidden:YES]; | |
177 [[window() standardWindowButton:NSWindowMiniaturizeButton] setHidden:YES]; | |
178 [[window() standardWindowButton:NSWindowCloseButton] setHidden:YES]; | |
179 } | |
180 } | |
181 | |
182 void ShellWindowCocoa::UninstallView() { | |
183 NSView* view = web_contents()->GetView()->GetNativeView(); | |
184 [view removeFromSuperview]; | |
185 } | |
186 | |
131 bool ShellWindowCocoa::IsActive() const { | 187 bool ShellWindowCocoa::IsActive() const { |
132 return [window() isKeyWindow]; | 188 return [window() isKeyWindow]; |
133 } | 189 } |
134 | 190 |
135 bool ShellWindowCocoa::IsMaximized() const { | 191 bool ShellWindowCocoa::IsMaximized() const { |
136 return [window() isZoomed]; | 192 return [window() isZoomed]; |
137 } | 193 } |
138 | 194 |
139 bool ShellWindowCocoa::IsMinimized() const { | 195 bool ShellWindowCocoa::IsMinimized() const { |
140 return [window() isMiniaturized]; | 196 return [window() isMiniaturized]; |
(...skipping 19 matching lines...) Expand all Loading... | |
160 const CGDisplayReservationInterval kFadeDurationSeconds = 0.6; | 216 const CGDisplayReservationInterval kFadeDurationSeconds = 0.6; |
161 bool did_fade_out = false; | 217 bool did_fade_out = false; |
162 CGDisplayFadeReservationToken token; | 218 CGDisplayFadeReservationToken token; |
163 if (CGAcquireDisplayFadeReservation(kFadeDurationSeconds, &token) == | 219 if (CGAcquireDisplayFadeReservation(kFadeDurationSeconds, &token) == |
164 kCGErrorSuccess) { | 220 kCGErrorSuccess) { |
165 did_fade_out = true; | 221 did_fade_out = true; |
166 CGDisplayFade(token, kFadeDurationSeconds / 2, kCGDisplayBlendNormal, | 222 CGDisplayFade(token, kFadeDurationSeconds / 2, kCGDisplayBlendNormal, |
167 kCGDisplayBlendSolidColor, 0.0, 0.0, 0.0, /*synchronous=*/true); | 223 kCGDisplayBlendSolidColor, 0.0, 0.0, 0.0, /*synchronous=*/true); |
168 } | 224 } |
169 | 225 |
226 // Since frameless windows insert the WebContentsView into the NSThemeFrame | |
227 // ([[window contentView] superview]), and since that NSThemeFrame is | |
228 // destroyed and recreated when we change the styleMask of the window, we | |
229 // need to remove the view from the window when we change the style, and | |
230 // add it back afterwards. | |
231 UninstallView(); | |
170 if (fullscreen) { | 232 if (fullscreen) { |
171 restored_bounds_ = [window() frame]; | 233 restored_bounds_ = [window() frame]; |
172 [window() setStyleMask:NSBorderlessWindowMask]; | 234 [window() setStyleMask:NSBorderlessWindowMask]; |
173 [window() setFrame:[window() | 235 [window() setFrame:[window() |
174 frameRectForContentRect:[[window() screen] frame]] | 236 frameRectForContentRect:[[window() screen] frame]] |
175 display:YES]; | 237 display:YES]; |
176 base::mac::RequestFullScreen(base::mac::kFullScreenModeAutoHideAll); | 238 base::mac::RequestFullScreen(base::mac::kFullScreenModeAutoHideAll); |
177 } else { | 239 } else { |
178 base::mac::ReleaseFullScreen(base::mac::kFullScreenModeAutoHideAll); | 240 base::mac::ReleaseFullScreen(base::mac::kFullScreenModeAutoHideAll); |
179 [window() setStyleMask:NSTitledWindowMask | NSClosableWindowMask | | 241 NSUInteger style_mask = NSTitledWindowMask | NSClosableWindowMask | |
180 NSMiniaturizableWindowMask | NSResizableWindowMask]; | 242 NSMiniaturizableWindowMask | NSResizableWindowMask | |
243 NSTexturedBackgroundWindowMask; | |
244 [window() setStyleMask:style_mask]; | |
181 [window() setFrame:restored_bounds_ display:YES]; | 245 [window() setFrame:restored_bounds_ display:YES]; |
182 } | 246 } |
247 InstallView(); | |
183 | 248 |
184 // Fade back in. | 249 // Fade back in. |
185 if (did_fade_out) { | 250 if (did_fade_out) { |
186 CGDisplayFade(token, kFadeDurationSeconds / 2, kCGDisplayBlendSolidColor, | 251 CGDisplayFade(token, kFadeDurationSeconds / 2, kCGDisplayBlendSolidColor, |
187 kCGDisplayBlendNormal, 0.0, 0.0, 0.0, /*synchronous=*/false); | 252 kCGDisplayBlendNormal, 0.0, 0.0, 0.0, /*synchronous=*/false); |
188 CGReleaseDisplayFadeReservation(token); | 253 CGReleaseDisplayFadeReservation(token); |
189 } | 254 } |
190 } | 255 } |
191 | 256 |
192 bool ShellWindowCocoa::IsFullscreenOrPending() const { | 257 bool ShellWindowCocoa::IsFullscreenOrPending() const { |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
324 return [window_controller_ window]; | 389 return [window_controller_ window]; |
325 } | 390 } |
326 | 391 |
327 // static | 392 // static |
328 ShellWindow* ShellWindow::CreateImpl(Profile* profile, | 393 ShellWindow* ShellWindow::CreateImpl(Profile* profile, |
329 const extensions::Extension* extension, | 394 const extensions::Extension* extension, |
330 const GURL& url, | 395 const GURL& url, |
331 const ShellWindow::CreateParams& params) { | 396 const ShellWindow::CreateParams& params) { |
332 return new ShellWindowCocoa(profile, extension, url, params); | 397 return new ShellWindowCocoa(profile, extension, url, params); |
333 } | 398 } |
OLD | NEW |