| // 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 |