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 "chrome/browser/ui/cocoa/fullscreen_window.h" 6 7#import "chrome/browser/ui/cocoa/themed_window.h" 8 9@implementation FullscreenWindow 10 11// Make sure our designated initializer gets called. 12- (id)init { 13 return [self initForScreen:[NSScreen mainScreen]]; 14} 15 16- (id)initForScreen:(NSScreen*)screen { 17 NSRect contentRect; 18 contentRect.origin = NSZeroPoint; 19 contentRect.size = [screen frame].size; 20 21 if ((self = [super initWithContentRect:contentRect 22 styleMask:NSBorderlessWindowMask 23 backing:NSBackingStoreBuffered 24 defer:YES 25 screen:screen])) { 26 [self setReleasedWhenClosed:NO]; 27 // Borderless windows don't usually show up in the Windows menu so whine at 28 // Cocoa until it complies. See -dealloc and -setTitle: as well. 29 [NSApp addWindowsItem:self title:@"" filename:NO]; 30 } 31 return self; 32} 33 34- (void)dealloc { 35 // Paranoia; doesn't seem to be necessary but it doesn't hurt. 36 [NSApp removeWindowsItem:self]; 37 38 [super dealloc]; 39} 40 41- (void)setTitle:(NSString *)title { 42 [NSApp changeWindowsItem:self title:title filename:NO]; 43 [super setTitle:title]; 44} 45 46// According to 47// http://www.cocoabuilder.com/archive/message/cocoa/2006/6/19/165953 , 48// NSBorderlessWindowMask windows cannot become key or main. 49// In our case, however, we don't want that behavior, so we override 50// canBecomeKeyWindow and canBecomeMainWindow. 51 52- (BOOL)canBecomeKeyWindow { 53 return YES; 54} 55 56- (BOOL)canBecomeMainWindow { 57 return YES; 58} 59 60// When becoming/resigning main status, explicitly set the background color, 61// which is required by |TabView|. 62- (void)becomeMainWindow { 63 [super becomeMainWindow]; 64 [self setBackgroundColor:[NSColor windowFrameColor]]; 65} 66 67- (void)resignMainWindow { 68 [super resignMainWindow]; 69 [self setBackgroundColor:[NSColor windowBackgroundColor]]; 70} 71 72// We need our own version, since the default one wants to flash the close 73// button (and possibly other things), which results in nothing happening. 74- (void)performClose:(id)sender { 75 BOOL shouldClose = YES; 76 77 // If applicable, check if this window should close. 78 id delegate = [self delegate]; 79 if ([delegate respondsToSelector:@selector(windowShouldClose:)]) 80 shouldClose = [delegate windowShouldClose:self]; 81 82 if (shouldClose) { 83 [self close]; 84 } 85} 86 87- (BOOL)validateUserInterfaceItem:(id<NSValidatedUserInterfaceItem>)item { 88 SEL action = [item action]; 89 90 // Explicitly enable |-performClose:| (see above); otherwise the fact that 91 // this window does not have a close button results in it being disabled. 92 if (action == @selector(performClose:)) 93 return YES; 94 95 return [super validateUserInterfaceItem:item]; 96} 97 98@end 99