1// Copyright 2013 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/app_list/cocoa/app_list_window_controller.h" 6 7#include "ui/app_list/app_list_view_delegate.h" 8#import "ui/app_list/cocoa/app_list_view_controller.h" 9#import "ui/app_list/cocoa/apps_grid_controller.h" 10#import "ui/app_list/cocoa/apps_search_box_controller.h" 11#include "ui/base/cocoa/window_size_constants.h" 12 13@interface AppListWindow : NSWindow; 14@end 15 16@implementation AppListWindow 17 18// If we initialize a window with NSBorderlessWindowMask, it will not accept key 19// events (among other things) unless canBecomeKeyWindow is overridden. 20- (BOOL)canBecomeKeyWindow { 21 return YES; 22} 23 24- (BOOL)canBecomeMainWindow { 25 return YES; 26} 27 28// On Mavericks with the "Displays have separate Spaces" option, OSX has stopped 29// switching out of the fullscreen space when activating a window in the non- 30// active application, other than by clicking its Dock icon. Since the app 31// launcher Dock icon is not Chrome, this can leave a user in fullscreen with 32// the app launcher window obscured. Overriding this private method allows the 33// app launcher to appear on top of other applications in fullscreen. Then, 34// since clicking that window will make Chrome active, subsequent window 35// activations will successfully switch the user out of the fullscreen space. 36- (BOOL)_allowedInOtherAppsFullScreenSpaceWithCollectionBehavior: 37 (NSUInteger)collectionBehavior { 38 return YES; 39} 40 41@end 42 43@implementation AppListWindowController; 44 45- (id)init { 46 base::scoped_nsobject<NSWindow> controlledWindow( 47 [[AppListWindow alloc] initWithContentRect:ui::kWindowSizeDeterminedLater 48 styleMask:NSBorderlessWindowMask 49 backing:NSBackingStoreBuffered 50 defer:NO]); 51 [controlledWindow setReleasedWhenClosed:NO]; 52 [controlledWindow setBackgroundColor:[NSColor clearColor]]; 53 [controlledWindow setOpaque:NO]; 54 [controlledWindow setHasShadow:YES]; 55 [controlledWindow setLevel:NSDockWindowLevel]; 56 [controlledWindow 57 setCollectionBehavior:NSWindowCollectionBehaviorMoveToActiveSpace]; 58 59 if ((self = [super initWithWindow:controlledWindow])) { 60 appListViewController_.reset([[AppListViewController alloc] init]); 61 [[self window] setFrame:[[appListViewController_ view] bounds] 62 display:NO]; 63 [[self window] setContentView:[appListViewController_ view]]; 64 [[self window] setDelegate:self]; 65 } 66 return self; 67} 68 69- (AppListViewController*)appListViewController { 70 return appListViewController_; 71} 72 73- (void)windowDidResignMain:(NSNotification*)notification { 74 if ([appListViewController_ delegate]) 75 [appListViewController_ delegate]->Dismiss(); 76} 77 78- (void)windowWillClose:(NSNotification*)notification { 79 [[appListViewController_ searchBoxController] clearSearch]; 80} 81 82@end 83