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