summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/cocoa/fullscreen_controller.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/ui/cocoa/fullscreen_controller.h')
-rw-r--r--chrome/browser/ui/cocoa/fullscreen_controller.h122
1 files changed, 122 insertions, 0 deletions
diff --git a/chrome/browser/ui/cocoa/fullscreen_controller.h b/chrome/browser/ui/cocoa/fullscreen_controller.h
new file mode 100644
index 0000000..2e96b61
--- /dev/null
+++ b/chrome/browser/ui/cocoa/fullscreen_controller.h
@@ -0,0 +1,122 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_COCOA_FULLSCREEN_CONTROLLER_H_
+#define CHROME_BROWSER_UI_COCOA_FULLSCREEN_CONTROLLER_H_
+#pragma once
+
+#import <Cocoa/Cocoa.h>
+
+#import "base/cocoa_protocols_mac.h"
+#include "base/mac_util.h"
+#include "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h"
+
+@class BrowserWindowController;
+@class DropdownAnimation;
+
+// Provides a controller to manage fullscreen mode for a single browser window.
+// This class handles running animations, showing and hiding the floating
+// dropdown bar, and managing the tracking area associated with the dropdown.
+// This class does not directly manage any views -- the BrowserWindowController
+// is responsible for positioning and z-ordering views.
+//
+// Tracking areas are disabled while animations are running. If
+// |overlayFrameChanged:| is called while an animation is running, the
+// controller saves the new frame and installs the appropriate tracking area
+// when the animation finishes. This is largely done for ease of
+// implementation; it is easier to check the mouse location at each animation
+// step than it is to manage a constantly-changing tracking area.
+@interface FullscreenController : NSObject<NSAnimationDelegate> {
+ @private
+ // Our parent controller.
+ BrowserWindowController* browserController_; // weak
+
+ // The content view for the fullscreen window. This is nil when not in
+ // fullscreen mode.
+ NSView* contentView_; // weak
+
+ // Whether or not we are in fullscreen mode.
+ BOOL isFullscreen_;
+
+ // The tracking area associated with the floating dropdown bar. This tracking
+ // area is attached to |contentView_|, because when the dropdown is completely
+ // hidden, we still need to keep a 1px tall tracking area visible. Attaching
+ // to the content view allows us to do this. |trackingArea_| can be nil if
+ // not in fullscreen mode or during animations.
+ scoped_nsobject<NSTrackingArea> trackingArea_;
+
+ // Pointer to the currently running animation. Is nil if no animation is
+ // running.
+ scoped_nsobject<DropdownAnimation> currentAnimation_;
+
+ // Timers for scheduled showing/hiding of the bar (which are always done with
+ // animation).
+ scoped_nsobject<NSTimer> showTimer_;
+ scoped_nsobject<NSTimer> hideTimer_;
+
+ // Holds the current bounds of |trackingArea_|, even if |trackingArea_| is
+ // currently nil. Used to restore the tracking area when an animation
+ // completes.
+ NSRect trackingAreaBounds_;
+
+ // Tracks the currently requested fullscreen mode. This should be
+ // |kFullScreenModeNormal| when the window is not main or not fullscreen,
+ // |kFullScreenModeHideAll| while the overlay is hidden, and
+ // |kFullScreenModeHideDock| while the overlay is shown. If the window is not
+ // on the primary screen, this should always be |kFullScreenModeNormal|. This
+ // value can get out of sync with the correct state if we miss a notification
+ // (which can happen when a fullscreen window is closed). Used to track the
+ // current state and make sure we properly restore the menu bar when this
+ // controller is destroyed.
+ mac_util::FullScreenMode currentFullscreenMode_;
+}
+
+@property(readonly, nonatomic) BOOL isFullscreen;
+
+// Designated initializer.
+- (id)initWithBrowserController:(BrowserWindowController*)controller;
+
+// Informs the controller that the browser has entered or exited fullscreen
+// mode. |-enterFullscreenForContentView:showDropdown:| should be called after
+// the fullscreen window is setup, just before it is shown. |-exitFullscreen|
+// should be called before any views are moved back to the non-fullscreen
+// window. If |-enterFullscreenForContentView:showDropdown:| is called, it must
+// be followed with a call to |-exitFullscreen| before the controller is
+// released.
+- (void)enterFullscreenForContentView:(NSView*)contentView
+ showDropdown:(BOOL)showDropdown;
+- (void)exitFullscreen;
+
+// Returns the amount by which the floating bar should be offset downwards (to
+// avoid the menu) and by which the overlay view should be enlarged vertically.
+// Generally, this is > 0 when the fullscreen window is on the primary screen
+// and 0 otherwise.
+- (CGFloat)floatingBarVerticalOffset;
+
+// Informs the controller that the overlay's frame has changed. The controller
+// uses this information to update its tracking areas.
+- (void)overlayFrameChanged:(NSRect)frame;
+
+// Informs the controller that the overlay should be shown/hidden, possibly with
+// animation, possibly after a delay (only applicable for the animated case).
+- (void)ensureOverlayShownWithAnimation:(BOOL)animate delay:(BOOL)delay;
+- (void)ensureOverlayHiddenWithAnimation:(BOOL)animate delay:(BOOL)delay;
+
+// Cancels any running animation and timers.
+- (void)cancelAnimationAndTimers;
+
+// Gets the current floating bar shown fraction.
+- (CGFloat)floatingBarShownFraction;
+
+// Sets a new current floating bar shown fraction. NOTE: This function has side
+// effects, such as modifying the fullscreen mode (menu bar shown state).
+- (void)changeFloatingBarShownFraction:(CGFloat)fraction;
+
+@end
+
+// Notification posted when we're about to enter or leave fullscreen.
+extern NSString* const kWillEnterFullscreenNotification;
+extern NSString* const kWillLeaveFullscreenNotification;
+
+#endif // CHROME_BROWSER_UI_COCOA_FULLSCREEN_CONTROLLER_H_