Chromium Code Reviews| Index: ui/base/cocoa/fullscreen_window_manager.mm |
| diff --git a/ui/base/cocoa/fullscreen_window_manager.mm b/ui/base/cocoa/fullscreen_window_manager.mm |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..32469f9dd8cc3a0f1a0d7582f10065461c29f2fd |
| --- /dev/null |
| +++ b/ui/base/cocoa/fullscreen_window_manager.mm |
| @@ -0,0 +1,111 @@ |
| +// 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 0; |
| + 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]; |
| +} |
| + |
| +} |
|
Robert Sesek
2012/03/27 19:47:50
// namespace
sail
2012/03/27 20:19:51
Done.
|
| + |
| +@interface FullscreenWindowManager() |
| +- (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; |
| + } |
| + return self; |
| +} |
| + |
| +- (void)dealloc { |
| + [self exitFullscreenMode]; |
| + [super dealloc]; |
| +} |
| + |
| +- (void)enterFullscreenMode { |
| + if (fullscreenEnabled_) |
| + return; |
| + fullscreenEnabled_ = true; |
| + [[NSNotificationCenter defaultCenter] |
|
Robert Sesek
2012/03/27 19:47:50
Why not listen to this in init and not remove/add
sail
2012/03/27 20:19:51
Done.
|
| + addObserver:self |
| + selector:@selector(onScreenChanged:) |
|
Robert Sesek
2012/03/27 19:47:50
Where is this selector implemented?
sail
2012/03/27 20:19:51
Oops, good catch. Accidentally dropped this during
|
| + name:NSApplicationDidChangeScreenParametersNotification |
| + object:NSApp]; |
| + [self update]; |
| +} |
| + |
| +- (void)exitFullscreenMode { |
| + if (!fullscreenEnabled_) |
| + return; |
| + fullscreenEnabled_ = false; |
| + [[NSNotificationCenter defaultCenter] |
| + removeObserver:self |
| + name:NSApplicationDidChangeScreenParametersNotification |
| + object:NSApp]; |
| + [self update]; |
| +} |
| + |
| +- (void)update { |
| + if (![[NSScreen screens] containsObject:desiredScreen_]) |
| + desiredScreen_.reset([[window_ screen] retain]); |
| + |
| + base::mac::FullScreenMode newMode; |
| + if (!fullscreenEnabled_) |
| + 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 (fullscreenEnabled_) |
| + [window_ setFrame:[desiredScreen_ frame] display:YES]; |
| +} |
| + |
| +@end |