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 #import "chrome/browser/ui/cocoa/presentation_mode_controller.h" | 5 #import "chrome/browser/ui/cocoa/presentation_mode_controller.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #import "base/mac/mac_util.h" | 10 #import "base/mac/mac_util.h" |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 // the window gains or loses main status as well as in |-cleanup|. | 159 // the window gains or loses main status as well as in |-cleanup|. |
160 - (void)showActiveWindowUI; | 160 - (void)showActiveWindowUI; |
161 - (void)hideActiveWindowUI; | 161 - (void)hideActiveWindowUI; |
162 | 162 |
163 @end | 163 @end |
164 | 164 |
165 | 165 |
166 @implementation PresentationModeController | 166 @implementation PresentationModeController |
167 | 167 |
168 @synthesize inPresentationMode = inPresentationMode_; | 168 @synthesize inPresentationMode = inPresentationMode_; |
| 169 @synthesize alwaysShowDropdown = alwaysShowDropdown_; |
169 | 170 |
170 - (id)initWithBrowserController:(BrowserWindowController*)controller { | 171 - (id)initWithBrowserController:(BrowserWindowController*)controller { |
171 if ((self = [super init])) { | 172 if ((self = [super init])) { |
172 browserController_ = controller; | 173 browserController_ = controller; |
173 systemFullscreenMode_ = base::mac::kFullScreenModeNormal; | 174 systemFullscreenMode_ = base::mac::kFullScreenModeNormal; |
174 } | 175 } |
175 | 176 |
176 // Let the world know what we're up to. | 177 // Let the world know what we're up to. |
177 [[NSNotificationCenter defaultCenter] | 178 [[NSNotificationCenter defaultCenter] |
178 postNotificationName:kWillEnterFullscreenNotification | 179 postNotificationName:kWillEnterFullscreenNotification |
179 object:nil]; | 180 object:nil]; |
180 | 181 |
181 return self; | 182 return self; |
182 } | 183 } |
183 | 184 |
184 - (void)dealloc { | 185 - (void)dealloc { |
185 DCHECK(!inPresentationMode_); | 186 DCHECK(!inPresentationMode_); |
186 DCHECK(!trackingArea_); | 187 DCHECK(!trackingArea_); |
187 [super dealloc]; | 188 [super dealloc]; |
188 } | 189 } |
189 | 190 |
190 - (void)enterPresentationModeForContentView:(NSView*)contentView | 191 - (void)enterPresentationModeForContentView:(NSView*)contentView |
191 showDropdown:(BOOL)showDropdown { | 192 showDropdown:(BOOL)showDropdown { |
192 DCHECK(!inPresentationMode_); | 193 DCHECK(!inPresentationMode_); |
193 enteringPresentationMode_ = YES; | 194 enteringPresentationMode_ = YES; |
194 inPresentationMode_ = YES; | 195 inPresentationMode_ = YES; |
195 contentView_ = contentView; | 196 contentView_ = contentView; |
| 197 if (alwaysShowDropdown_) |
| 198 showDropdown = YES; |
196 [self changeFloatingBarShownFraction:(showDropdown ? 1 : 0)]; | 199 [self changeFloatingBarShownFraction:(showDropdown ? 1 : 0)]; |
197 | 200 |
198 // Register for notifications. Self is removed as an observer in |-cleanup|. | 201 // Register for notifications. Self is removed as an observer in |-cleanup|. |
199 NSNotificationCenter* nc = [NSNotificationCenter defaultCenter]; | 202 NSNotificationCenter* nc = [NSNotificationCenter defaultCenter]; |
200 NSWindow* window = [browserController_ window]; | 203 NSWindow* window = [browserController_ window]; |
201 | 204 |
202 // Disable these notifications on Lion as they cause crashes. | 205 // Disable these notifications on Lion as they cause crashes. |
203 // TODO(rohitrao): Figure out what happens if a fullscreen window changes | 206 // TODO(rohitrao): Figure out what happens if a fullscreen window changes |
204 // monitors on Lion. | 207 // monitors on Lion. |
205 if (base::mac::IsOSSnowLeopard()) { | 208 if (base::mac::IsOSSnowLeopard()) { |
(...skipping 24 matching lines...) Expand all Loading... |
230 - (void)exitPresentationMode { | 233 - (void)exitPresentationMode { |
231 [[NSNotificationCenter defaultCenter] | 234 [[NSNotificationCenter defaultCenter] |
232 postNotificationName:kWillLeaveFullscreenNotification | 235 postNotificationName:kWillLeaveFullscreenNotification |
233 object:nil]; | 236 object:nil]; |
234 DCHECK(inPresentationMode_); | 237 DCHECK(inPresentationMode_); |
235 inPresentationMode_ = NO; | 238 inPresentationMode_ = NO; |
236 | 239 |
237 [self cleanup]; | 240 [self cleanup]; |
238 } | 241 } |
239 | 242 |
| 243 - (void)setAlwaysShowDropdown:(BOOL)alwaysShowDropdown { |
| 244 alwaysShowDropdown_ = alwaysShowDropdown; |
| 245 if (alwaysShowDropdown) |
| 246 [self ensureOverlayShownWithAnimation:YES delay:YES]; |
| 247 else |
| 248 [self ensureOverlayHiddenWithAnimation:YES delay:YES]; |
| 249 } |
| 250 |
240 - (void)windowDidChangeScreen:(NSNotification*)notification { | 251 - (void)windowDidChangeScreen:(NSNotification*)notification { |
241 [browserController_ resizeFullscreenWindow]; | 252 [browserController_ resizeFullscreenWindow]; |
242 } | 253 } |
243 | 254 |
244 - (void)windowDidMove:(NSNotification*)notification { | 255 - (void)windowDidMove:(NSNotification*)notification { |
245 [browserController_ resizeFullscreenWindow]; | 256 [browserController_ resizeFullscreenWindow]; |
246 } | 257 } |
247 | 258 |
248 - (void)windowDidBecomeMain:(NSNotification*)notification { | 259 - (void)windowDidBecomeMain:(NSNotification*)notification { |
249 [self showActiveWindowUI]; | 260 [self showActiveWindowUI]; |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 } else { | 320 } else { |
310 DCHECK(!delay); | 321 DCHECK(!delay); |
311 [self cancelAllTimers]; | 322 [self cancelAllTimers]; |
312 [self changeOverlayToFraction:1 withAnimation:NO]; | 323 [self changeOverlayToFraction:1 withAnimation:NO]; |
313 } | 324 } |
314 } | 325 } |
315 | 326 |
316 - (void)ensureOverlayHiddenWithAnimation:(BOOL)animate delay:(BOOL)delay { | 327 - (void)ensureOverlayHiddenWithAnimation:(BOOL)animate delay:(BOOL)delay { |
317 if (!inPresentationMode_) | 328 if (!inPresentationMode_) |
318 return; | 329 return; |
| 330 if (alwaysShowDropdown_) |
| 331 return; |
319 | 332 |
320 if (animate) { | 333 if (animate) { |
321 if (delay) { | 334 if (delay) { |
322 [self startHideTimer]; | 335 [self startHideTimer]; |
323 } else { | 336 } else { |
324 [self cancelAllTimers]; | 337 [self cancelAllTimers]; |
325 [self changeOverlayToFraction:0 withAnimation:YES]; | 338 [self changeOverlayToFraction:0 withAnimation:YES]; |
326 } | 339 } |
327 } else { | 340 } else { |
328 DCHECK(!delay); | 341 DCHECK(!delay); |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
493 delay:YES]; | 506 delay:YES]; |
494 } | 507 } |
495 | 508 |
496 - (void)scheduleHideForMouse { | 509 - (void)scheduleHideForMouse { |
497 [browserController_ releaseBarVisibilityForOwner:self | 510 [browserController_ releaseBarVisibilityForOwner:self |
498 withAnimation:YES | 511 withAnimation:YES |
499 delay:YES]; | 512 delay:YES]; |
500 } | 513 } |
501 | 514 |
502 - (void)setupTrackingArea { | 515 - (void)setupTrackingArea { |
| 516 if (alwaysShowDropdown_) |
| 517 return; |
503 if (trackingArea_) { | 518 if (trackingArea_) { |
504 // If the tracking rectangle is already |trackingAreaBounds_|, quit early. | 519 // If the tracking rectangle is already |trackingAreaBounds_|, quit early. |
505 NSRect oldRect = [trackingArea_ rect]; | 520 NSRect oldRect = [trackingArea_ rect]; |
506 if (NSEqualRects(trackingAreaBounds_, oldRect)) | 521 if (NSEqualRects(trackingAreaBounds_, oldRect)) |
507 return; | 522 return; |
508 | 523 |
509 // Otherwise, remove it. | 524 // Otherwise, remove it. |
510 [self removeTrackingAreaIfNecessary]; | 525 [self removeTrackingAreaIfNecessary]; |
511 } | 526 } |
512 | 527 |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
608 } | 623 } |
609 | 624 |
610 - (void)showTimerFire:(NSTimer*)timer { | 625 - (void)showTimerFire:(NSTimer*)timer { |
611 DCHECK_EQ(showTimer_, timer); // This better be our show timer. | 626 DCHECK_EQ(showTimer_, timer); // This better be our show timer. |
612 [showTimer_ invalidate]; // Make sure it doesn't repeat. | 627 [showTimer_ invalidate]; // Make sure it doesn't repeat. |
613 showTimer_.reset(); // And get rid of it. | 628 showTimer_.reset(); // And get rid of it. |
614 [self changeOverlayToFraction:1 withAnimation:YES]; | 629 [self changeOverlayToFraction:1 withAnimation:YES]; |
615 } | 630 } |
616 | 631 |
617 - (void)hideTimerFire:(NSTimer*)timer { | 632 - (void)hideTimerFire:(NSTimer*)timer { |
| 633 DCHECK(!alwaysShowDropdown_); |
618 DCHECK_EQ(hideTimer_, timer); // This better be our hide timer. | 634 DCHECK_EQ(hideTimer_, timer); // This better be our hide timer. |
619 [hideTimer_ invalidate]; // Make sure it doesn't repeat. | 635 [hideTimer_ invalidate]; // Make sure it doesn't repeat. |
620 hideTimer_.reset(); // And get rid of it. | 636 hideTimer_.reset(); // And get rid of it. |
621 [self changeOverlayToFraction:0 withAnimation:YES]; | 637 [self changeOverlayToFraction:0 withAnimation:YES]; |
622 } | 638 } |
623 | 639 |
624 - (void)cleanup { | 640 - (void)cleanup { |
625 [self cancelMouseExitCheck]; | 641 [self cancelMouseExitCheck]; |
626 [self cancelAnimationAndTimers]; | 642 [self cancelAnimationAndTimers]; |
627 [[NSNotificationCenter defaultCenter] removeObserver:self]; | 643 [[NSNotificationCenter defaultCenter] removeObserver:self]; |
(...skipping 27 matching lines...) Expand all Loading... |
655 } | 671 } |
656 | 672 |
657 - (void)hideActiveWindowUI { | 673 - (void)hideActiveWindowUI { |
658 if ([self shouldToggleMenuBar]) | 674 if ([self shouldToggleMenuBar]) |
659 [self setSystemFullscreenModeTo:base::mac::kFullScreenModeNormal]; | 675 [self setSystemFullscreenModeTo:base::mac::kFullScreenModeNormal]; |
660 | 676 |
661 // TODO(rohitrao): Remove the Exit Fullscreen button. http://crbug.com/35956 | 677 // TODO(rohitrao): Remove the Exit Fullscreen button. http://crbug.com/35956 |
662 } | 678 } |
663 | 679 |
664 @end | 680 @end |
OLD | NEW |