// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #import "ui/app_list/cocoa/app_list_window_controller.h" #include "ui/app_list/app_list_view_delegate.h" #import "ui/app_list/cocoa/app_list_view_controller.h" #import "ui/app_list/cocoa/apps_grid_controller.h" #import "ui/app_list/cocoa/apps_search_box_controller.h" #include "ui/base/cocoa/window_size_constants.h" @interface AppListWindow : NSWindow; @end @implementation AppListWindow // If we initialize a window with NSBorderlessWindowMask, it will not accept key // events (among other things) unless canBecomeKeyWindow is overridden. - (BOOL)canBecomeKeyWindow { return YES; } - (BOOL)canBecomeMainWindow { return YES; } // On Mavericks with the "Displays have separate Spaces" option, OSX has stopped // switching out of the fullscreen space when activating a window in the non- // active application, other than by clicking its Dock icon. Since the app // launcher Dock icon is not Chrome, this can leave a user in fullscreen with // the app launcher window obscured. Overriding this private method allows the // app launcher to appear on top of other applications in fullscreen. Then, // since clicking that window will make Chrome active, subsequent window // activations will successfully switch the user out of the fullscreen space. - (BOOL)_allowedInOtherAppsFullScreenSpaceWithCollectionBehavior: (NSUInteger)collectionBehavior { return YES; } @end @implementation AppListWindowController; - (id)init { base::scoped_nsobject controlledWindow( [[AppListWindow alloc] initWithContentRect:ui::kWindowSizeDeterminedLater styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO]); [controlledWindow setReleasedWhenClosed:NO]; [controlledWindow setBackgroundColor:[NSColor clearColor]]; [controlledWindow setOpaque:NO]; [controlledWindow setHasShadow:YES]; [controlledWindow setLevel:NSDockWindowLevel]; [controlledWindow setCollectionBehavior:NSWindowCollectionBehaviorMoveToActiveSpace]; if ((self = [super initWithWindow:controlledWindow])) { appListViewController_.reset([[AppListViewController alloc] init]); [[self window] setFrame:[[appListViewController_ view] bounds] display:NO]; [[self window] setContentView:[appListViewController_ view]]; [[self window] setDelegate:self]; } return self; } - (AppListViewController*)appListViewController { return appListViewController_; } - (void)windowDidResignMain:(NSNotification*)notification { if ([appListViewController_ delegate]) [appListViewController_ delegate]->Dismiss(); } - (void)windowWillClose:(NSNotification*)notification { [[appListViewController_ searchBoxController] clearSearch]; } @end