Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(430)

Side by Side Diff: chrome/browser/ui/cocoa/presentation_mode_controller.mm

Issue 7566016: Fullscreen support for Lion. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 #import "chrome/browser/ui/cocoa/fullscreen_controller.h" 5 #import "chrome/browser/ui/cocoa/presentation_mode_controller.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #import "base/mac/mac_util.h" 9 #import "base/mac/mac_util.h"
10 #import "chrome/browser/ui/cocoa/browser_window_controller.h" 10 #import "chrome/browser/ui/cocoa/browser_window_controller.h"
11 #import "third_party/GTM/AppKit/GTMNSAnimation+Duration.h" 11 #import "third_party/GTM/AppKit/GTMNSAnimation+Duration.h"
12 12
13 NSString* const kWillEnterFullscreenNotification = 13 NSString* const kWillEnterFullscreenNotification =
14 @"WillEnterFullscreenNotification"; 14 @"WillEnterFullscreenNotification";
15 NSString* const kWillLeaveFullscreenNotification = 15 NSString* const kWillLeaveFullscreenNotification =
16 @"WillLeaveFullscreenNotification"; 16 @"WillLeaveFullscreenNotification";
17 17
18 namespace { 18 namespace {
19 // The activation zone for the main menu is 4 pixels high; if we make it any 19 // The activation zone for the main menu is 4 pixels high; if we make it any
20 // smaller, then the menu can be made to appear without the bar sliding down. 20 // smaller, then the menu can be made to appear without the bar sliding down.
21 const CGFloat kDropdownActivationZoneHeight = 4; 21 const CGFloat kDropdownActivationZoneHeight = 4;
22 const NSTimeInterval kDropdownAnimationDuration = 0.12; 22 const NSTimeInterval kDropdownAnimationDuration = 0.12;
23 const NSTimeInterval kMouseExitCheckDelay = 0.1; 23 const NSTimeInterval kMouseExitCheckDelay = 0.1;
24 // This show delay attempts to match the delay for the main menu. 24 // This show delay attempts to match the delay for the main menu.
25 const NSTimeInterval kDropdownShowDelay = 0.3; 25 const NSTimeInterval kDropdownShowDelay = 0.3;
26 const NSTimeInterval kDropdownHideDelay = 0.2; 26 const NSTimeInterval kDropdownHideDelay = 0.2;
27 27
28 // The amount by which the floating bar is offset downwards (to avoid the menu) 28 // The amount by which the floating bar is offset downwards (to avoid the menu)
29 // in fullscreen mode. (We can't use |-[NSMenu menuBarHeight]| since it returns 29 // in presentation mode. (We can't use |-[NSMenu menuBarHeight]| since it
30 // 0 when the menu bar is hidden.) 30 // returns 0 when the menu bar is hidden.)
31 const CGFloat kFloatingBarVerticalOffset = 22; 31 const CGFloat kFloatingBarVerticalOffset = 22;
32 32
33 } // end namespace 33 } // end namespace
34 34
35 35
36 // Helper class to manage animations for the fullscreen dropdown bar. Calls 36 // Helper class to manage animations for the dropdown bar. Calls
37 // [FullscreenController changeFloatingBarShownFraction] once per animation 37 // [PresentationModeController changeFloatingBarShownFraction] once per
38 // step. 38 // animation step.
39 @interface DropdownAnimation : NSAnimation { 39 @interface DropdownAnimation : NSAnimation {
40 @private 40 @private
41 FullscreenController* controller_; 41 PresentationModeController* controller_;
42 CGFloat startFraction_; 42 CGFloat startFraction_;
43 CGFloat endFraction_; 43 CGFloat endFraction_;
44 } 44 }
45 45
46 @property(readonly, nonatomic) CGFloat startFraction; 46 @property(readonly, nonatomic) CGFloat startFraction;
47 @property(readonly, nonatomic) CGFloat endFraction; 47 @property(readonly, nonatomic) CGFloat endFraction;
48 48
49 // Designated initializer. Asks |controller| for the current shown fraction, so 49 // Designated initializer. Asks |controller| for the current shown fraction, so
50 // if the bar is already partially shown or partially hidden, the animation 50 // if the bar is already partially shown or partially hidden, the animation
51 // duration may be less than |fullDuration|. 51 // duration may be less than |fullDuration|.
52 - (id)initWithFraction:(CGFloat)fromFraction 52 - (id)initWithFraction:(CGFloat)fromFraction
53 fullDuration:(CGFloat)fullDuration 53 fullDuration:(CGFloat)fullDuration
54 animationCurve:(NSInteger)animationCurve 54 animationCurve:(NSInteger)animationCurve
55 controller:(FullscreenController*)controller; 55 controller:(PresentationModeController*)controller;
56 56
57 @end 57 @end
58 58
59 @implementation DropdownAnimation 59 @implementation DropdownAnimation
60 60
61 @synthesize startFraction = startFraction_; 61 @synthesize startFraction = startFraction_;
62 @synthesize endFraction = endFraction_; 62 @synthesize endFraction = endFraction_;
63 63
64 - (id)initWithFraction:(CGFloat)toFraction 64 - (id)initWithFraction:(CGFloat)toFraction
65 fullDuration:(CGFloat)fullDuration 65 fullDuration:(CGFloat)fullDuration
66 animationCurve:(NSInteger)animationCurve 66 animationCurve:(NSInteger)animationCurve
67 controller:(FullscreenController*)controller { 67 controller:(PresentationModeController*)controller {
68 // Calculate the effective duration, based on the current shown fraction. 68 // Calculate the effective duration, based on the current shown fraction.
69 DCHECK(controller); 69 DCHECK(controller);
70 CGFloat fromFraction = [controller floatingBarShownFraction]; 70 CGFloat fromFraction = [controller floatingBarShownFraction];
71 CGFloat effectiveDuration = fabs(fullDuration * (fromFraction - toFraction)); 71 CGFloat effectiveDuration = fabs(fullDuration * (fromFraction - toFraction));
72 72
73 if ((self = [super gtm_initWithDuration:effectiveDuration 73 if ((self = [super gtm_initWithDuration:effectiveDuration
74 eventMask:NSLeftMouseDownMask 74 eventMask:NSLeftMouseDownMask
75 animationCurve:animationCurve])) { 75 animationCurve:animationCurve])) {
76 startFraction_ = fromFraction; 76 startFraction_ = fromFraction;
77 endFraction_ = toFraction; 77 endFraction_ = toFraction;
78 controller_ = controller; 78 controller_ = controller;
79 } 79 }
80 return self; 80 return self;
81 } 81 }
82 82
83 // Called once per animation step. Overridden to change the floating bar's 83 // Called once per animation step. Overridden to change the floating bar's
84 // position based on the animation's progress. 84 // position based on the animation's progress.
85 - (void)setCurrentProgress:(NSAnimationProgress)progress { 85 - (void)setCurrentProgress:(NSAnimationProgress)progress {
86 CGFloat fraction = 86 CGFloat fraction =
87 startFraction_ + (progress * (endFraction_ - startFraction_)); 87 startFraction_ + (progress * (endFraction_ - startFraction_));
88 [controller_ changeFloatingBarShownFraction:fraction]; 88 [controller_ changeFloatingBarShownFraction:fraction];
89 } 89 }
90 90
91 @end 91 @end
92 92
93 93
94 @interface FullscreenController (PrivateMethods) 94 @interface PresentationModeController (PrivateMethods)
95 95
96 // Returns YES if the fullscreen window is on the primary screen. 96 // Returns YES if the window is on the primary screen.
97 - (BOOL)isWindowOnPrimaryScreen; 97 - (BOOL)isWindowOnPrimaryScreen;
98 98
99 // Returns YES if it is ok to show and hide the menu bar in response to the 99 // Returns YES if it is ok to show and hide the menu bar in response to the
100 // overlay opening and closing. Will return NO if the window is not main or not 100 // overlay opening and closing. Will return NO if the window is not main or not
101 // on the primary monitor. 101 // on the primary monitor.
102 - (BOOL)shouldToggleMenuBar; 102 - (BOOL)shouldToggleMenuBar;
103 103
104 // Returns |kFullScreenModeHideAll| when the overlay is hidden and 104 // Returns |kFullScreenModeHideAll| when the overlay is hidden and
105 // |kFullScreenModeHideDock| when the overlay is shown. 105 // |kFullScreenModeHideDock| when the overlay is shown.
106 - (base::mac::FullScreenMode)desiredFullscreenMode; 106 - (base::mac::FullScreenMode)desiredSystemFullscreenMode;
107 107
108 // Change the overlay to the given fraction, with or without animation. Only 108 // Change the overlay to the given fraction, with or without animation. Only
109 // guaranteed to work properly with |fraction == 0| or |fraction == 1|. This 109 // guaranteed to work properly with |fraction == 0| or |fraction == 1|. This
110 // performs the show/hide (animation) immediately. It does not touch the timers. 110 // performs the show/hide (animation) immediately. It does not touch the timers.
111 - (void)changeOverlayToFraction:(CGFloat)fraction 111 - (void)changeOverlayToFraction:(CGFloat)fraction
112 withAnimation:(BOOL)animate; 112 withAnimation:(BOOL)animate;
113 113
114 // Schedule the floating bar to be shown/hidden because of mouse position. 114 // Schedule the floating bar to be shown/hidden because of mouse position.
115 - (void)scheduleShowForMouse; 115 - (void)scheduleShowForMouse;
116 - (void)scheduleHideForMouse; 116 - (void)scheduleHideForMouse;
(...skipping 27 matching lines...) Expand all
144 - (void)cancelAllTimers; 144 - (void)cancelAllTimers;
145 145
146 // Methods called when the show/hide timers fire. Do not call directly. 146 // Methods called when the show/hide timers fire. Do not call directly.
147 - (void)showTimerFire:(NSTimer*)timer; 147 - (void)showTimerFire:(NSTimer*)timer;
148 - (void)hideTimerFire:(NSTimer*)timer; 148 - (void)hideTimerFire:(NSTimer*)timer;
149 149
150 // Stops any running animations, removes tracking areas, etc. 150 // Stops any running animations, removes tracking areas, etc.
151 - (void)cleanup; 151 - (void)cleanup;
152 152
153 // Shows and hides the UI associated with this window being active (having main 153 // Shows and hides the UI associated with this window being active (having main
154 // status). This includes hiding the menu bar and displaying the "Exit 154 // status). This includes hiding the menu bar. These functions are called when
155 // Fullscreen" button. These functions are called when the window gains or 155 // the window gains or loses main status as well as in |-cleanup|.
156 // loses main status as well as in |-cleanup|.
157 - (void)showActiveWindowUI; 156 - (void)showActiveWindowUI;
158 - (void)hideActiveWindowUI; 157 - (void)hideActiveWindowUI;
159 158
160 @end 159 @end
161 160
162 161
163 @implementation FullscreenController 162 @implementation PresentationModeController
164 163
165 @synthesize isFullscreen = isFullscreen_; 164 @synthesize inPresentationMode = inPresentationMode_;
166 165
167 - (id)initWithBrowserController:(BrowserWindowController*)controller { 166 - (id)initWithBrowserController:(BrowserWindowController*)controller {
168 if ((self = [super init])) { 167 if ((self = [super init])) {
169 browserController_ = controller; 168 browserController_ = controller;
170 currentFullscreenMode_ = base::mac::kFullScreenModeNormal; 169 systemFullscreenMode_ = base::mac::kFullScreenModeNormal;
171 } 170 }
172 171
173 // Let the world know what we're up to. 172 // Let the world know what we're up to.
174 [[NSNotificationCenter defaultCenter] 173 [[NSNotificationCenter defaultCenter]
175 postNotificationName:kWillEnterFullscreenNotification 174 postNotificationName:kWillEnterFullscreenNotification
176 object:nil]; 175 object:nil];
177 176
178 return self; 177 return self;
179 } 178 }
180 179
181 - (void)dealloc { 180 - (void)dealloc {
182 DCHECK(!isFullscreen_); 181 DCHECK(!inPresentationMode_);
183 DCHECK(!trackingArea_); 182 DCHECK(!trackingArea_);
184 [super dealloc]; 183 [super dealloc];
185 } 184 }
186 185
187 - (void)enterFullscreenForContentView:(NSView*)contentView 186 - (void)enterPresentationModeForContentView:(NSView*)contentView
188 showDropdown:(BOOL)showDropdown { 187 showDropdown:(BOOL)showDropdown {
189 DCHECK(!isFullscreen_); 188 DCHECK(!inPresentationMode_);
190 isFullscreen_ = YES; 189 enteringPresentationMode_ = YES;
190 inPresentationMode_ = YES;
191 contentView_ = contentView; 191 contentView_ = contentView;
192 [self changeFloatingBarShownFraction:(showDropdown ? 1 : 0)]; 192 [self changeFloatingBarShownFraction:(showDropdown ? 1 : 0)];
193 193
194 // Register for notifications. Self is removed as an observer in |-cleanup|. 194 // Register for notifications. Self is removed as an observer in |-cleanup|.
195 NSNotificationCenter* nc = [NSNotificationCenter defaultCenter]; 195 NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
196 NSWindow* window = [browserController_ window]; 196 NSWindow* window = [browserController_ window];
197 [nc addObserver:self
198 selector:@selector(windowDidChangeScreen:)
199 name:NSWindowDidChangeScreenNotification
200 object:window];
201 197
202 [nc addObserver:self 198 // Disable these notifications on Lion as they cause crashes.
203 selector:@selector(windowDidMove:) 199 // TODO(rohitrao): Figure out what happens if a fullscreen window changes
204 name:NSWindowDidMoveNotification 200 // monitors on Lion.
205 object:window]; 201 if (base::mac::IsOSSnowLeopardOrEarlier()) {
202 [nc addObserver:self
203 selector:@selector(windowDidChangeScreen:)
204 name:NSWindowDidChangeScreenNotification
205 object:window];
206
207 [nc addObserver:self
208 selector:@selector(windowDidMove:)
209 name:NSWindowDidMoveNotification
210 object:window];
211 }
206 212
207 [nc addObserver:self 213 [nc addObserver:self
208 selector:@selector(windowDidBecomeMain:) 214 selector:@selector(windowDidBecomeMain:)
209 name:NSWindowDidBecomeMainNotification 215 name:NSWindowDidBecomeMainNotification
210 object:window]; 216 object:window];
211 217
212 [nc addObserver:self 218 [nc addObserver:self
213 selector:@selector(windowDidResignMain:) 219 selector:@selector(windowDidResignMain:)
214 name:NSWindowDidResignMainNotification 220 name:NSWindowDidResignMainNotification
215 object:window]; 221 object:window];
222
223 enteringPresentationMode_ = NO;
216 } 224 }
217 225
218 - (void)exitFullscreen { 226 - (void)exitPresentationMode {
219 [[NSNotificationCenter defaultCenter] 227 [[NSNotificationCenter defaultCenter]
220 postNotificationName:kWillLeaveFullscreenNotification 228 postNotificationName:kWillLeaveFullscreenNotification
221 object:nil]; 229 object:nil];
222 DCHECK(isFullscreen_); 230 DCHECK(inPresentationMode_);
231 inPresentationMode_ = NO;
223 [self cleanup]; 232 [self cleanup];
224 isFullscreen_ = NO;
225 } 233 }
226 234
227 - (void)windowDidChangeScreen:(NSNotification*)notification { 235 - (void)windowDidChangeScreen:(NSNotification*)notification {
228 [browserController_ resizeFullscreenWindow]; 236 [browserController_ resizeFullscreenWindow];
229 } 237 }
230 238
231 - (void)windowDidMove:(NSNotification*)notification { 239 - (void)windowDidMove:(NSNotification*)notification {
232 [browserController_ resizeFullscreenWindow]; 240 [browserController_ resizeFullscreenWindow];
233 } 241 }
234 242
235 - (void)windowDidBecomeMain:(NSNotification*)notification { 243 - (void)windowDidBecomeMain:(NSNotification*)notification {
236 [self showActiveWindowUI]; 244 [self showActiveWindowUI];
237 } 245 }
238 246
239 - (void)windowDidResignMain:(NSNotification*)notification { 247 - (void)windowDidResignMain:(NSNotification*)notification {
240 [self hideActiveWindowUI]; 248 [self hideActiveWindowUI];
241 } 249 }
242 250
243 - (CGFloat)floatingBarVerticalOffset { 251 - (CGFloat)floatingBarVerticalOffset {
244 return [self isWindowOnPrimaryScreen] ? kFloatingBarVerticalOffset : 0; 252 return [self isWindowOnPrimaryScreen] ? kFloatingBarVerticalOffset : 0;
245 } 253 }
246 254
247 - (void)overlayFrameChanged:(NSRect)frame { 255 - (void)overlayFrameChanged:(NSRect)frame {
248 if (!isFullscreen_) 256 if (!inPresentationMode_)
249 return; 257 return;
250 258
251 // Make sure |trackingAreaBounds_| always reflects either the tracking area or 259 // Make sure |trackingAreaBounds_| always reflects either the tracking area or
252 // the desired tracking area. 260 // the desired tracking area.
253 trackingAreaBounds_ = frame; 261 trackingAreaBounds_ = frame;
254 // The tracking area should always be at least the height of activation zone. 262 // The tracking area should always be at least the height of activation zone.
255 NSRect contentBounds = [contentView_ bounds]; 263 NSRect contentBounds = [contentView_ bounds];
256 trackingAreaBounds_.origin.y = 264 trackingAreaBounds_.origin.y =
257 std::min(trackingAreaBounds_.origin.y, 265 std::min(trackingAreaBounds_.origin.y,
258 NSMaxY(contentBounds) - kDropdownActivationZoneHeight); 266 NSMaxY(contentBounds) - kDropdownActivationZoneHeight);
259 trackingAreaBounds_.size.height = 267 trackingAreaBounds_.size.height =
260 NSMaxY(contentBounds) - trackingAreaBounds_.origin.y + 1; 268 NSMaxY(contentBounds) - trackingAreaBounds_.origin.y + 1;
261 269
262 // If an animation is currently running, do not set up a tracking area now. 270 // If an animation is currently running, do not set up a tracking area now.
263 // Instead, leave it to be created it in |-animationDidEnd:|. 271 // Instead, leave it to be created it in |-animationDidEnd:|.
264 if (currentAnimation_) 272 if (currentAnimation_)
265 return; 273 return;
266 274
275 // If this is part of the initial setup, lock bar visibility if the mouse is
276 // within the tracking area bounds.
277 if (enteringPresentationMode_ && [self mouseInsideTrackingRect])
278 [browserController_ lockBarVisibilityForOwner:self
279 withAnimation:NO
280 delay:NO];
267 [self setupTrackingArea]; 281 [self setupTrackingArea];
268 } 282 }
269 283
270 - (void)ensureOverlayShownWithAnimation:(BOOL)animate delay:(BOOL)delay { 284 - (void)ensureOverlayShownWithAnimation:(BOOL)animate delay:(BOOL)delay {
271 if (!isFullscreen_) 285 if (!inPresentationMode_)
272 return; 286 return;
273 287
274 if (animate) { 288 if (animate) {
275 if (delay) { 289 if (delay) {
276 [self startShowTimer]; 290 [self startShowTimer];
277 } else { 291 } else {
278 [self cancelAllTimers]; 292 [self cancelAllTimers];
279 [self changeOverlayToFraction:1 withAnimation:YES]; 293 [self changeOverlayToFraction:1 withAnimation:YES];
280 } 294 }
281 } else { 295 } else {
282 DCHECK(!delay); 296 DCHECK(!delay);
283 [self cancelAllTimers]; 297 [self cancelAllTimers];
284 [self changeOverlayToFraction:1 withAnimation:NO]; 298 [self changeOverlayToFraction:1 withAnimation:NO];
285 } 299 }
286 } 300 }
287 301
288 - (void)ensureOverlayHiddenWithAnimation:(BOOL)animate delay:(BOOL)delay { 302 - (void)ensureOverlayHiddenWithAnimation:(BOOL)animate delay:(BOOL)delay {
289 if (!isFullscreen_) 303 if (!inPresentationMode_)
290 return; 304 return;
291 305
292 if (animate) { 306 if (animate) {
293 if (delay) { 307 if (delay) {
294 [self startHideTimer]; 308 [self startHideTimer];
295 } else { 309 } else {
296 [self cancelAllTimers]; 310 [self cancelAllTimers];
297 [self changeOverlayToFraction:0 withAnimation:YES]; 311 [self changeOverlayToFraction:0 withAnimation:YES];
298 } 312 }
299 } else { 313 } else {
300 DCHECK(!delay); 314 DCHECK(!delay);
301 [self cancelAllTimers]; 315 [self cancelAllTimers];
302 [self changeOverlayToFraction:0 withAnimation:NO]; 316 [self changeOverlayToFraction:0 withAnimation:NO];
303 } 317 }
304 } 318 }
305 319
306 - (void)cancelAnimationAndTimers { 320 - (void)cancelAnimationAndTimers {
307 [self cancelAllTimers]; 321 [self cancelAllTimers];
308 [currentAnimation_ stopAnimation]; 322 [currentAnimation_ stopAnimation];
309 currentAnimation_.reset(); 323 currentAnimation_.reset();
310 } 324 }
311 325
312 - (CGFloat)floatingBarShownFraction { 326 - (CGFloat)floatingBarShownFraction {
313 return [browserController_ floatingBarShownFraction]; 327 return [browserController_ floatingBarShownFraction];
314 } 328 }
315 329
316 - (void)changeFloatingBarShownFraction:(CGFloat)fraction { 330 - (void)changeFloatingBarShownFraction:(CGFloat)fraction {
317 [browserController_ setFloatingBarShownFraction:fraction]; 331 [browserController_ setFloatingBarShownFraction:fraction];
318 332
319 base::mac::FullScreenMode desiredMode = [self desiredFullscreenMode]; 333 base::mac::FullScreenMode desiredMode = [self desiredSystemFullscreenMode];
320 if (desiredMode != currentFullscreenMode_ && [self shouldToggleMenuBar]) { 334 if (desiredMode != systemFullscreenMode_ && [self shouldToggleMenuBar]) {
321 if (currentFullscreenMode_ == base::mac::kFullScreenModeNormal) 335 if (systemFullscreenMode_ == base::mac::kFullScreenModeNormal)
322 base::mac::RequestFullScreen(desiredMode); 336 base::mac::RequestFullScreen(desiredMode);
323 else 337 else
324 base::mac::SwitchFullScreenModes(currentFullscreenMode_, desiredMode); 338 base::mac::SwitchFullScreenModes(systemFullscreenMode_, desiredMode);
325 currentFullscreenMode_ = desiredMode; 339 systemFullscreenMode_ = desiredMode;
326 } 340 }
327 } 341 }
328 342
329 // Used to activate the floating bar in fullscreen mode. 343 // Used to activate the floating bar in presentation mode.
330 - (void)mouseEntered:(NSEvent*)event { 344 - (void)mouseEntered:(NSEvent*)event {
331 DCHECK(isFullscreen_); 345 DCHECK(inPresentationMode_);
332 346
333 // Having gotten a mouse entered, we no longer need to do exit checks. 347 // Having gotten a mouse entered, we no longer need to do exit checks.
334 [self cancelMouseExitCheck]; 348 [self cancelMouseExitCheck];
335 349
336 NSTrackingArea* trackingArea = [event trackingArea]; 350 NSTrackingArea* trackingArea = [event trackingArea];
337 if (trackingArea == trackingArea_) { 351 if (trackingArea == trackingArea_) {
338 // The tracking area shouldn't be active during animation. 352 // The tracking area shouldn't be active during animation.
339 DCHECK(!currentAnimation_); 353 DCHECK(!currentAnimation_);
340 [self scheduleShowForMouse]; 354 [self scheduleShowForMouse];
341 } 355 }
342 } 356 }
343 357
344 // Used to deactivate the floating bar in fullscreen mode. 358 // Used to deactivate the floating bar in presentation mode.
345 - (void)mouseExited:(NSEvent*)event { 359 - (void)mouseExited:(NSEvent*)event {
346 DCHECK(isFullscreen_); 360 DCHECK(inPresentationMode_);
347 361
348 NSTrackingArea* trackingArea = [event trackingArea]; 362 NSTrackingArea* trackingArea = [event trackingArea];
349 if (trackingArea == trackingArea_) { 363 if (trackingArea == trackingArea_) {
350 // The tracking area shouldn't be active during animation. 364 // The tracking area shouldn't be active during animation.
351 DCHECK(!currentAnimation_); 365 DCHECK(!currentAnimation_);
352 366
353 // We can get a false mouse exit when the menu slides down, so if the mouse 367 // We can get a false mouse exit when the menu slides down, so if the mouse
354 // is still actually over the tracking area, we ignore the mouse exit, but 368 // is still actually over the tracking area, we ignore the mouse exit, but
355 // we set up to check the mouse position again after a delay. 369 // we set up to check the mouse position again after a delay.
356 if ([self mouseInsideTrackingRect]) { 370 if ([self mouseInsideTrackingRect]) {
(...skipping 29 matching lines...) Expand all
386 400
387 // TODO(viettrungluu): Better would be to check during the animation; doing it 401 // TODO(viettrungluu): Better would be to check during the animation; doing it
388 // here means that the timing is slightly off. 402 // here means that the timing is slightly off.
389 if (![self mouseInsideTrackingRect]) 403 if (![self mouseInsideTrackingRect])
390 [self scheduleHideForMouse]; 404 [self scheduleHideForMouse];
391 } 405 }
392 406
393 @end 407 @end
394 408
395 409
396 @implementation FullscreenController (PrivateMethods) 410 @implementation PresentationModeController (PrivateMethods)
397 411
398 - (BOOL)isWindowOnPrimaryScreen { 412 - (BOOL)isWindowOnPrimaryScreen {
399 NSScreen* screen = [[browserController_ window] screen]; 413 NSScreen* screen = [[browserController_ window] screen];
400 NSScreen* primaryScreen = [[NSScreen screens] objectAtIndex:0]; 414 NSScreen* primaryScreen = [[NSScreen screens] objectAtIndex:0];
401 return (screen == primaryScreen); 415 return (screen == primaryScreen);
402 } 416 }
403 417
404 - (BOOL)shouldToggleMenuBar { 418 - (BOOL)shouldToggleMenuBar {
405 return [self isWindowOnPrimaryScreen] && 419 return base::mac::IsOSSnowLeopardOrEarlier() &&
420 [self isWindowOnPrimaryScreen] &&
406 [[browserController_ window] isMainWindow]; 421 [[browserController_ window] isMainWindow];
407 } 422 }
408 423
409 - (base::mac::FullScreenMode)desiredFullscreenMode { 424 - (base::mac::FullScreenMode)desiredSystemFullscreenMode {
410 if ([browserController_ floatingBarShownFraction] >= 1.0) 425 if ([browserController_ floatingBarShownFraction] >= 1.0)
411 return base::mac::kFullScreenModeHideDock; 426 return base::mac::kFullScreenModeHideDock;
412 return base::mac::kFullScreenModeHideAll; 427 return base::mac::kFullScreenModeHideAll;
413 } 428 }
414 429
415 - (void)changeOverlayToFraction:(CGFloat)fraction 430 - (void)changeOverlayToFraction:(CGFloat)fraction
416 withAnimation:(BOOL)animate { 431 withAnimation:(BOOL)animate {
417 // The non-animated case is really simple, so do it and return. 432 // The non-animated case is really simple, so do it and return.
418 if (!animate) { 433 if (!animate) {
419 [currentAnimation_ stopAnimation]; 434 [currentAnimation_ stopAnimation];
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
587 } 602 }
588 603
589 - (void)cleanup { 604 - (void)cleanup {
590 [self cancelMouseExitCheck]; 605 [self cancelMouseExitCheck];
591 [self cancelAnimationAndTimers]; 606 [self cancelAnimationAndTimers];
592 [[NSNotificationCenter defaultCenter] removeObserver:self]; 607 [[NSNotificationCenter defaultCenter] removeObserver:self];
593 608
594 [self removeTrackingAreaIfNecessary]; 609 [self removeTrackingAreaIfNecessary];
595 contentView_ = nil; 610 contentView_ = nil;
596 611
597 // This isn't tracked when not in fullscreen mode. 612 // This isn't tracked when not in presentation mode.
598 [browserController_ releaseBarVisibilityForOwner:self 613 [browserController_ releaseBarVisibilityForOwner:self
599 withAnimation:NO 614 withAnimation:NO
600 delay:NO]; 615 delay:NO];
601 616
602 // Call the main status resignation code to perform the associated cleanup, 617 // Call the main status resignation code to perform the associated cleanup,
603 // since we will no longer be receiving actual status resignation 618 // since we will no longer be receiving actual status resignation
604 // notifications. 619 // notifications.
605 [self hideActiveWindowUI]; 620 [self hideActiveWindowUI];
606 621
607 // No more calls back up to the BWC. 622 // No more calls back up to the BWC.
608 browserController_ = nil; 623 browserController_ = nil;
609 } 624 }
610 625
611 - (void)showActiveWindowUI { 626 - (void)showActiveWindowUI {
612 DCHECK_EQ(currentFullscreenMode_, base::mac::kFullScreenModeNormal); 627 DCHECK_EQ(systemFullscreenMode_, base::mac::kFullScreenModeNormal);
613 if (currentFullscreenMode_ != base::mac::kFullScreenModeNormal) 628 if (systemFullscreenMode_ != base::mac::kFullScreenModeNormal)
614 return; 629 return;
615 630
616 if ([self shouldToggleMenuBar]) { 631 if ([self shouldToggleMenuBar]) {
617 base::mac::FullScreenMode desiredMode = [self desiredFullscreenMode]; 632 base::mac::FullScreenMode desiredMode = [self desiredSystemFullscreenMode];
618 base::mac::RequestFullScreen(desiredMode); 633 base::mac::RequestFullScreen(desiredMode);
619 currentFullscreenMode_ = desiredMode; 634 systemFullscreenMode_ = desiredMode;
620 } 635 }
621 636
622 // TODO(rohitrao): Insert the Exit Fullscreen button. http://crbug.com/35956 637 // TODO(rohitrao): Insert the Exit Fullscreen button. http://crbug.com/35956
623 } 638 }
624 639
625 - (void)hideActiveWindowUI { 640 - (void)hideActiveWindowUI {
626 if (currentFullscreenMode_ != base::mac::kFullScreenModeNormal) { 641 if (systemFullscreenMode_ != base::mac::kFullScreenModeNormal) {
627 base::mac::ReleaseFullScreen(currentFullscreenMode_); 642 base::mac::ReleaseFullScreen(systemFullscreenMode_);
628 currentFullscreenMode_ = base::mac::kFullScreenModeNormal; 643 systemFullscreenMode_ = base::mac::kFullScreenModeNormal;
629 } 644 }
630 645
631 // TODO(rohitrao): Remove the Exit Fullscreen button. http://crbug.com/35956 646 // TODO(rohitrao): Remove the Exit Fullscreen button. http://crbug.com/35956
632 } 647 }
633 648
634 @end 649 @end
OLDNEW
« no previous file with comments | « chrome/browser/ui/cocoa/presentation_mode_controller.h ('k') | chrome/browser/ui/cocoa/presentation_mode_prefs.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698