15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#import "ui/base/cocoa/fullscreen_window_manager.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get the screen with the menu bar.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NSScreen* GetMenuBarScreen() {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Documentation in NSScreen says that the first object in
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // +[NSScreen screens] is the menu bar screen.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NSArray *screens = [NSScreen screens];
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ([screens count])
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return [screens objectAtIndex:0];
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return nil;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get the screen with the dock.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NSScreen* GetDockScreen() {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NSArray *screens = [NSScreen screens];
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NSUInteger count = [screens count];
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (count == 0)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (count == 1)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return [screens objectAtIndex:0];
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (NSUInteger i = 1; i < count; ++i) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NSScreen* screen = [screens objectAtIndex:i];
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This screen is not the menu bar screen since it's not index 0. Therefore,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the only reason that the frame would not match the visible frame is if
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the dock is on the screen.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!NSEqualRects([screen frame], [screen visibleFrame]))
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return screen;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return [screens objectAtIndex:0];
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@interface FullscreenWindowManager()
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)onScreenChanged:(NSNotification*)note;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)update;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@end
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@implementation FullscreenWindowManager
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (id)initWithWindow:(NSWindow*)window
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       desiredScreen:(NSScreen*)desiredScreen {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((self = [super init])) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_.reset([window retain]);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    desiredScreen_.reset([desiredScreen retain]);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fullscreenMode_ = base::mac::kFullScreenModeNormal;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    [[NSNotificationCenter defaultCenter]
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        addObserver:self
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           selector:@selector(onScreenChanged:)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               name:NSApplicationDidChangeScreenParametersNotification
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             object:NSApp];
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return self;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)dealloc {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  [[NSNotificationCenter defaultCenter] removeObserver:self];
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  [self exitFullscreenMode];
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  [super dealloc];
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)enterFullscreenMode {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fullscreenActive_)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fullscreenActive_ = true;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  [self update];
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)exitFullscreenMode {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!fullscreenActive_)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fullscreenActive_ = false;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  [self update];
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)onScreenChanged:(NSNotification*)note {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  [self update];
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)- (void)update {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (![[NSScreen screens] containsObject:desiredScreen_])
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    desiredScreen_.reset([[window_ screen] retain]);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::mac::FullScreenMode newMode;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!fullscreenActive_)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    newMode = base::mac::kFullScreenModeNormal;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (desiredScreen_ == GetMenuBarScreen())
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    newMode = base::mac::kFullScreenModeHideAll;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (desiredScreen_ == GetDockScreen())
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    newMode = base::mac::kFullScreenModeHideDock;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    newMode = base::mac::kFullScreenModeNormal;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fullscreenMode_ != newMode) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (fullscreenMode_ != base::mac::kFullScreenModeNormal)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::mac::ReleaseFullScreen(fullscreenMode_);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (newMode != base::mac::kFullScreenModeNormal)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::mac::RequestFullScreen(newMode);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fullscreenMode_ = newMode;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fullscreenActive_)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    [window_ setFrame:[desiredScreen_ frame] display:YES];
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@end
114