// Copyright 2014 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 "extensions/shell/browser/shell_native_app_window_mac.h" #import #include "base/logging.h" #include "base/mac/foundation_util.h" #include "base/strings/sys_string_conversions.h" #include "content/public/browser/web_contents.h" #import "ui/gfx/mac/coordinate_conversion.h" @implementation ShellNativeAppWindowController @synthesize appWindow = appWindow_; - (void)windowWillClose:(NSNotification*)notification { if (appWindow_) appWindow_->WindowWillClose(); } @end // TODO(yoz): Do we need to handle commands (keyboard shortcuts)? // Do we need need ChromeEventProcessingWindow or UnderlayOpenGLHostingWindow? @interface ShellNSWindow : NSWindow @end @implementation ShellNSWindow - (BOOL)_isTitleHidden { return YES; } @end namespace extensions { ShellNativeAppWindowMac::ShellNativeAppWindowMac( AppWindow* app_window, const AppWindow::CreateParams& params) : ShellNativeAppWindow(app_window, params) { base::scoped_nsobject shell_window; NSUInteger style_mask = NSTitledWindowMask | NSClosableWindowMask; NSRect cocoa_bounds = gfx::ScreenRectToNSRect( params.GetInitialWindowBounds(gfx::Insets())); shell_window.reset( [[ShellNSWindow alloc] initWithContentRect:cocoa_bounds styleMask:style_mask backing:NSBackingStoreBuffered defer:NO]); [shell_window setReleasedWhenClosed:NO]; window_controller_.reset([[ShellNativeAppWindowController alloc] initWithWindow:shell_window]); [[window_controller_ window] setDelegate:window_controller_]; [window_controller_ setAppWindow:this]; NSView* view = app_window->web_contents()->GetNativeView(); NSView* frameView = [window() contentView]; [view setFrame:[frameView bounds]]; [frameView addSubview:view]; } ShellNativeAppWindowMac::~ShellNativeAppWindowMac() { [window() setDelegate:nil]; [window() close]; } bool ShellNativeAppWindowMac::IsActive() const { return [window() isKeyWindow]; } gfx::NativeWindow ShellNativeAppWindowMac::GetNativeWindow() const { return window(); } gfx::Rect ShellNativeAppWindowMac::GetBounds() const { return gfx::ScreenRectFromNSRect([window() frame]); } void ShellNativeAppWindowMac::Show() { [window_controller_ showWindow:nil]; } void ShellNativeAppWindowMac::Hide() { NOTIMPLEMENTED(); } void ShellNativeAppWindowMac::Activate() { // TODO(yoz): Activate in front of other applications. [[window_controller_ window] makeKeyAndOrderFront:window_controller_]; } void ShellNativeAppWindowMac::Deactivate() { // See crbug.com/51364. NOTIMPLEMENTED(); } void ShellNativeAppWindowMac::SetBounds(const gfx::Rect& bounds) { // TODO(yoz): Windows should be fullscreen. NOTIMPLEMENTED(); } void ShellNativeAppWindowMac::WindowWillClose() { [window_controller_ setAppWindow:NULL]; app_window()->OnNativeWindowChanged(); app_window()->OnNativeClose(); } ShellNSWindow* ShellNativeAppWindowMac::window() const { return base::mac::ObjCCastStrict([window_controller_ window]); } } // namespace extensions