| Index: ui/base/cocoa/fullscreen_window_manager.mm
|
| ===================================================================
|
| --- ui/base/cocoa/fullscreen_window_manager.mm (revision 0)
|
| +++ ui/base/cocoa/fullscreen_window_manager.mm (revision 0)
|
| @@ -0,0 +1,113 @@
|
| +// Copyright (c) 2012 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.
|
| +
|
| +#import "ui/base/cocoa/fullscreen_window_manager.h"
|
| +
|
| +namespace {
|
| +
|
| +// Get the screen with the menu bar.
|
| +NSScreen* GetMenuBarScreen() {
|
| + // Documentation in NSScreen says that the first object in
|
| + // +[NSScreen screens] is the menu bar screen.
|
| + NSArray *screens = [NSScreen screens];
|
| + if ([screens count])
|
| + return [screens objectAtIndex:0];
|
| + return nil;
|
| +}
|
| +
|
| +// Get the screen with the dock.
|
| +NSScreen* GetDockScreen() {
|
| + NSArray *screens = [NSScreen screens];
|
| + NSUInteger count = [screens count];
|
| + if (count == 0)
|
| + return NULL;
|
| + if (count == 1)
|
| + return [screens objectAtIndex:0];
|
| +
|
| + for (NSUInteger i = 1; i < count; ++i) {
|
| + NSScreen* screen = [screens objectAtIndex:i];
|
| + // This screen is not the menu bar screen since it's not index 0. Therefore,
|
| + // the only reason that the frame would not match the visible frame is if
|
| + // the dock is on the screen.
|
| + if (!NSEqualRects([screen frame], [screen visibleFrame]))
|
| + return screen;
|
| + }
|
| + return [screens objectAtIndex:0];
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +@interface FullscreenWindowManager()
|
| +- (void)onScreenChanged:(NSNotification*)note;
|
| +- (void)update;
|
| +@end
|
| +
|
| +@implementation FullscreenWindowManager
|
| +
|
| +- (id)initWithWindow:(NSWindow*)window
|
| + desiredScreen:(NSScreen*)desiredScreen {
|
| + if ((self = [super init])) {
|
| + window_.reset([window retain]);
|
| + desiredScreen_.reset([desiredScreen retain]);
|
| + fullscreenMode_ = base::mac::kFullScreenModeNormal;
|
| + [[NSNotificationCenter defaultCenter]
|
| + addObserver:self
|
| + selector:@selector(onScreenChanged:)
|
| + name:NSApplicationDidChangeScreenParametersNotification
|
| + object:NSApp];
|
| + }
|
| + return self;
|
| +}
|
| +
|
| +- (void)dealloc {
|
| + [[NSNotificationCenter defaultCenter] removeObserver:self];
|
| + [self exitFullscreenMode];
|
| + [super dealloc];
|
| +}
|
| +
|
| +- (void)enterFullscreenMode {
|
| + if (fullscreenActive_)
|
| + return;
|
| + fullscreenActive_ = true;
|
| + [self update];
|
| +}
|
| +
|
| +- (void)exitFullscreenMode {
|
| + if (!fullscreenActive_)
|
| + return;
|
| + fullscreenActive_ = false;
|
| + [self update];
|
| +}
|
| +
|
| +- (void)onScreenChanged:(NSNotification*)note {
|
| + [self update];
|
| +}
|
| +
|
| +- (void)update {
|
| + if (![[NSScreen screens] containsObject:desiredScreen_])
|
| + desiredScreen_.reset([[window_ screen] retain]);
|
| +
|
| + base::mac::FullScreenMode newMode;
|
| + if (!fullscreenActive_)
|
| + newMode = base::mac::kFullScreenModeNormal;
|
| + else if (desiredScreen_ == GetMenuBarScreen())
|
| + newMode = base::mac::kFullScreenModeHideAll;
|
| + else if (desiredScreen_ == GetDockScreen())
|
| + newMode = base::mac::kFullScreenModeHideDock;
|
| + else
|
| + newMode = base::mac::kFullScreenModeNormal;
|
| +
|
| + if (fullscreenMode_ != newMode) {
|
| + if (fullscreenMode_ != base::mac::kFullScreenModeNormal)
|
| + base::mac::ReleaseFullScreen(fullscreenMode_);
|
| + if (newMode != base::mac::kFullScreenModeNormal)
|
| + base::mac::RequestFullScreen(newMode);
|
| + fullscreenMode_ = newMode;
|
| + }
|
| +
|
| + if (fullscreenActive_)
|
| + [window_ setFrame:[desiredScreen_ frame] display:YES];
|
| +}
|
| +
|
| +@end
|
|
|