Home | History | Annotate | Download | only in cocoa
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #import "ui/base/cocoa/fullscreen_window_manager.h"
      6 
      7 namespace {
      8 
      9 // Get the screen with the menu bar.
     10 NSScreen* GetMenuBarScreen() {
     11   // Documentation in NSScreen says that the first object in
     12   // +[NSScreen screens] is the menu bar screen.
     13   NSArray *screens = [NSScreen screens];
     14   if ([screens count])
     15     return [screens objectAtIndex:0];
     16   return nil;
     17 }
     18 
     19 // Get the screen with the dock.
     20 NSScreen* GetDockScreen() {
     21   NSArray *screens = [NSScreen screens];
     22   NSUInteger count = [screens count];
     23   if (count == 0)
     24     return NULL;
     25   if (count == 1)
     26     return [screens objectAtIndex:0];
     27 
     28   for (NSUInteger i = 1; i < count; ++i) {
     29     NSScreen* screen = [screens objectAtIndex:i];
     30     // This screen is not the menu bar screen since it's not index 0. Therefore,
     31     // the only reason that the frame would not match the visible frame is if
     32     // the dock is on the screen.
     33     if (!NSEqualRects([screen frame], [screen visibleFrame]))
     34       return screen;
     35   }
     36   return [screens objectAtIndex:0];
     37 }
     38 
     39 }  // namespace
     40 
     41 @interface FullscreenWindowManager()
     42 - (void)onScreenChanged:(NSNotification*)note;
     43 - (void)update;
     44 @end
     45 
     46 @implementation FullscreenWindowManager
     47 
     48 - (id)initWithWindow:(NSWindow*)window
     49        desiredScreen:(NSScreen*)desiredScreen {
     50   if ((self = [super init])) {
     51     window_.reset([window retain]);
     52     desiredScreen_.reset([desiredScreen retain]);
     53     fullscreenMode_ = base::mac::kFullScreenModeNormal;
     54     [[NSNotificationCenter defaultCenter]
     55         addObserver:self
     56            selector:@selector(onScreenChanged:)
     57                name:NSApplicationDidChangeScreenParametersNotification
     58              object:NSApp];
     59   }
     60   return self;
     61 }
     62 
     63 - (void)dealloc {
     64   [[NSNotificationCenter defaultCenter] removeObserver:self];
     65   [self exitFullscreenMode];
     66   [super dealloc];
     67 }
     68 
     69 - (void)enterFullscreenMode {
     70   if (fullscreenActive_)
     71     return;
     72   fullscreenActive_ = true;
     73   [self update];
     74 }
     75 
     76 - (void)exitFullscreenMode {
     77   if (!fullscreenActive_)
     78     return;
     79   fullscreenActive_ = false;
     80   [self update];
     81 }
     82 
     83 - (void)onScreenChanged:(NSNotification*)note {
     84   [self update];
     85 }
     86 
     87 - (void)update {
     88   if (![[NSScreen screens] containsObject:desiredScreen_])
     89     desiredScreen_.reset([[window_ screen] retain]);
     90 
     91   base::mac::FullScreenMode newMode;
     92   if (!fullscreenActive_)
     93     newMode = base::mac::kFullScreenModeNormal;
     94   else if (desiredScreen_ == GetMenuBarScreen())
     95     newMode = base::mac::kFullScreenModeHideAll;
     96   else if (desiredScreen_ == GetDockScreen())
     97     newMode = base::mac::kFullScreenModeHideDock;
     98   else
     99     newMode = base::mac::kFullScreenModeNormal;
    100 
    101   if (fullscreenMode_ != newMode) {
    102     if (fullscreenMode_ != base::mac::kFullScreenModeNormal)
    103       base::mac::ReleaseFullScreen(fullscreenMode_);
    104     if (newMode != base::mac::kFullScreenModeNormal)
    105       base::mac::RequestFullScreen(newMode);
    106     fullscreenMode_ = newMode;
    107   }
    108 
    109   if (fullscreenActive_)
    110     [window_ setFrame:[desiredScreen_ frame] display:YES];
    111 }
    112 
    113 @end
    114