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