| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h" | 5 #include "chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/mac/foundation_util.h" | 8 #include "base/mac/foundation_util.h" |
| 9 #include "base/mac/mac_util.h" | 9 #include "base/mac/mac_util.h" |
| 10 #include "base/mac/sdk_forward_declarations.h" | 10 #include "base/mac/sdk_forward_declarations.h" |
| 11 #include "base/strings/sys_string_conversions.h" | 11 #include "base/strings/sys_string_conversions.h" |
| 12 #include "chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h" | 12 #include "chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h" |
| 13 #include "chrome/browser/profiles/profile.h" | 13 #include "chrome/browser/profiles/profile.h" |
| 14 #import "chrome/browser/ui/cocoa/apps/titlebar_background_view.h" |
| 14 #include "chrome/browser/ui/cocoa/browser_window_utils.h" | 15 #include "chrome/browser/ui/cocoa/browser_window_utils.h" |
| 15 #import "chrome/browser/ui/cocoa/chrome_event_processing_window.h" | 16 #import "chrome/browser/ui/cocoa/chrome_event_processing_window.h" |
| 16 #include "chrome/browser/ui/cocoa/extensions/extension_keybinding_registry_cocoa
.h" | 17 #include "chrome/browser/ui/cocoa/extensions/extension_keybinding_registry_cocoa
.h" |
| 17 #include "chrome/browser/ui/cocoa/extensions/extension_view_mac.h" | 18 #include "chrome/browser/ui/cocoa/extensions/extension_view_mac.h" |
| 18 #include "chrome/common/chrome_switches.h" | 19 #include "chrome/common/chrome_switches.h" |
| 19 #include "content/public/browser/native_web_keyboard_event.h" | 20 #include "content/public/browser/native_web_keyboard_event.h" |
| 20 #include "content/public/browser/render_widget_host_view.h" | 21 #include "content/public/browser/render_widget_host_view.h" |
| 21 #include "content/public/browser/web_contents.h" | 22 #include "content/public/browser/web_contents.h" |
| 22 #include "extensions/common/extension.h" | 23 #include "extensions/common/extension.h" |
| 23 #include "skia/ext/skia_utils_mac.h" | 24 #include "skia/ext/skia_utils_mac.h" |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 192 | 193 |
| 193 - (BOOL)handledByExtensionCommand:(NSEvent*)event | 194 - (BOOL)handledByExtensionCommand:(NSEvent*)event |
| 194 priority:(ui::AcceleratorManager::HandlerPriority)priority { | 195 priority:(ui::AcceleratorManager::HandlerPriority)priority { |
| 195 if (appWindow_) | 196 if (appWindow_) |
| 196 return appWindow_->HandledByExtensionCommand(event, priority); | 197 return appWindow_->HandledByExtensionCommand(event, priority); |
| 197 return NO; | 198 return NO; |
| 198 } | 199 } |
| 199 | 200 |
| 200 @end | 201 @end |
| 201 | 202 |
| 202 // A view that paints a solid color. Used to change the title bar background. | |
| 203 @interface TitlebarBackgroundView : NSView { | |
| 204 @private | |
| 205 base::scoped_nsobject<NSColor> color_; | |
| 206 base::scoped_nsobject<NSColor> inactiveColor_; | |
| 207 } | |
| 208 - (void)setColor:(NSColor*)color | |
| 209 inactiveColor:(NSColor*)inactiveColor; | |
| 210 @end | |
| 211 | |
| 212 @implementation TitlebarBackgroundView | |
| 213 | |
| 214 - (void)drawRect:(NSRect)rect { | |
| 215 // Only the top corners are rounded. For simplicity, round all 4 corners but | |
| 216 // draw the bottom corners outside of the visible bounds. | |
| 217 CGFloat cornerRadius = 4.0; | |
| 218 NSRect roundedRect = [self bounds]; | |
| 219 roundedRect.origin.y -= cornerRadius; | |
| 220 roundedRect.size.height += cornerRadius; | |
| 221 [[NSBezierPath bezierPathWithRoundedRect:roundedRect | |
| 222 xRadius:cornerRadius | |
| 223 yRadius:cornerRadius] addClip]; | |
| 224 if ([[self window] isMainWindow] || [[self window] isKeyWindow]) | |
| 225 [color_ set]; | |
| 226 else | |
| 227 [inactiveColor_ set]; | |
| 228 NSRectFill(rect); | |
| 229 } | |
| 230 | |
| 231 - (void)setColor:(NSColor*)color | |
| 232 inactiveColor:(NSColor*)inactiveColor { | |
| 233 color_.reset([color retain]); | |
| 234 inactiveColor_.reset([inactiveColor retain]); | |
| 235 } | |
| 236 | |
| 237 @end | |
| 238 | |
| 239 // TODO(jamescook): Should these be AppNSWindow to match AppWindow? | |
| 240 // http://crbug.com/344082 | |
| 241 @interface AppNSWindow : ChromeEventProcessingWindow | 203 @interface AppNSWindow : ChromeEventProcessingWindow |
| 242 @end | 204 @end |
| 243 | 205 |
| 244 @implementation AppNSWindow | 206 @implementation AppNSWindow |
| 245 | 207 |
| 246 // Similar to ChromeBrowserWindow, don't draw the title, but allow it to be seen | 208 // Similar to ChromeBrowserWindow, don't draw the title, but allow it to be seen |
| 247 // in menus, Expose, etc. | 209 // in menus, Expose, etc. |
| 248 - (BOOL)_isTitleHidden { | 210 - (BOOL)_isTitleHidden { |
| 249 return YES; | 211 return YES; |
| 250 } | 212 } |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 325 backing:NSBackingStoreBuffered | 287 backing:NSBackingStoreBuffered |
| 326 defer:NO]); | 288 defer:NO]); |
| 327 | 289 |
| 328 std::string name; | 290 std::string name; |
| 329 const extensions::Extension* extension = app_window_->GetExtension(); | 291 const extensions::Extension* extension = app_window_->GetExtension(); |
| 330 if (extension) | 292 if (extension) |
| 331 name = extension->name(); | 293 name = extension->name(); |
| 332 [window setTitle:base::SysUTF8ToNSString(name)]; | 294 [window setTitle:base::SysUTF8ToNSString(name)]; |
| 333 [[window contentView] setWantsLayer:YES]; | 295 [[window contentView] setWantsLayer:YES]; |
| 334 if (has_frame_ && has_frame_color_) { | 296 if (has_frame_ && has_frame_color_) { |
| 335 // AppKit only officially supports adding subviews to the window's | 297 [TitlebarBackgroundView addToNSWindow:window |
| 336 // contentView and not its superview (an NSNextStepFrame). The 10.10 SDK | 298 activeColor:active_frame_color_ |
| 337 // allows adding an NSTitlebarAccessoryViewController to a window, but the | 299 inactiveColor:inactive_frame_color_]; |
| 338 // view can only be placed above the window control buttons, so we'd have to | |
| 339 // replicate those. | |
| 340 NSView* window_view = [[window contentView] superview]; | |
| 341 CGFloat height = NSHeight([window_view bounds]) - | |
| 342 NSHeight([[window contentView] bounds]); | |
| 343 titlebar_background_view_.reset([[TitlebarBackgroundView alloc] | |
| 344 initWithFrame:NSMakeRect(0, NSMaxY([window_view bounds]) - height, | |
| 345 NSWidth([window_view bounds]), height)]); | |
| 346 [titlebar_background_view_ | |
| 347 setAutoresizingMask:NSViewWidthSizable | NSViewMinYMargin]; | |
| 348 [window_view addSubview:titlebar_background_view_ | |
| 349 positioned:NSWindowBelow | |
| 350 relativeTo:nil]; | |
| 351 [titlebar_background_view_ | |
| 352 setColor:gfx::SkColorToSRGBNSColor(active_frame_color_) | |
| 353 inactiveColor:gfx::SkColorToSRGBNSColor(inactive_frame_color_)]; | |
| 354 } | 300 } |
| 355 | 301 |
| 356 if (base::mac::IsOSSnowLeopard() && | 302 if (base::mac::IsOSSnowLeopard() && |
| 357 [window respondsToSelector:@selector(setBottomCornerRounded:)]) | 303 [window respondsToSelector:@selector(setBottomCornerRounded:)]) |
| 358 [window setBottomCornerRounded:NO]; | 304 [window setBottomCornerRounded:NO]; |
| 359 | 305 |
| 360 if (params.always_on_top) | 306 if (params.always_on_top) |
| 361 [window setLevel:AlwaysOnTopWindowLevel()]; | 307 [window setLevel:AlwaysOnTopWindowLevel()]; |
| 362 InitCollectionBehavior(window); | 308 InitCollectionBehavior(window); |
| 363 | 309 |
| (...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 781 NOTIMPLEMENTED(); | 727 NOTIMPLEMENTED(); |
| 782 } | 728 } |
| 783 | 729 |
| 784 void NativeAppWindowCocoa::WindowWillClose() { | 730 void NativeAppWindowCocoa::WindowWillClose() { |
| 785 [window_controller_ setAppWindow:NULL]; | 731 [window_controller_ setAppWindow:NULL]; |
| 786 app_window_->OnNativeWindowChanged(); | 732 app_window_->OnNativeWindowChanged(); |
| 787 app_window_->OnNativeClose(); | 733 app_window_->OnNativeClose(); |
| 788 } | 734 } |
| 789 | 735 |
| 790 void NativeAppWindowCocoa::WindowDidBecomeKey() { | 736 void NativeAppWindowCocoa::WindowDidBecomeKey() { |
| 791 [titlebar_background_view_ setNeedsDisplay:YES]; | |
| 792 content::RenderWidgetHostView* rwhv = | 737 content::RenderWidgetHostView* rwhv = |
| 793 WebContents()->GetRenderWidgetHostView(); | 738 WebContents()->GetRenderWidgetHostView(); |
| 794 if (rwhv) | 739 if (rwhv) |
| 795 rwhv->SetActive(true); | 740 rwhv->SetActive(true); |
| 796 app_window_->OnNativeWindowActivated(); | 741 app_window_->OnNativeWindowActivated(); |
| 797 | 742 |
| 798 WebContents()->RestoreFocus(); | 743 WebContents()->RestoreFocus(); |
| 799 } | 744 } |
| 800 | 745 |
| 801 void NativeAppWindowCocoa::WindowDidResignKey() { | 746 void NativeAppWindowCocoa::WindowDidResignKey() { |
| 802 // If our app is still active and we're still the key window, ignore this | 747 // If our app is still active and we're still the key window, ignore this |
| 803 // message, since it just means that a menu extra (on the "system status bar") | 748 // message, since it just means that a menu extra (on the "system status bar") |
| 804 // was activated; we'll get another |-windowDidResignKey| if we ever really | 749 // was activated; we'll get another |-windowDidResignKey| if we ever really |
| 805 // lose key window status. | 750 // lose key window status. |
| 806 if ([NSApp isActive] && ([NSApp keyWindow] == window())) | 751 if ([NSApp isActive] && ([NSApp keyWindow] == window())) |
| 807 return; | 752 return; |
| 808 | 753 |
| 809 [titlebar_background_view_ setNeedsDisplay:YES]; | |
| 810 | |
| 811 WebContents()->StoreFocus(); | 754 WebContents()->StoreFocus(); |
| 812 | 755 |
| 813 content::RenderWidgetHostView* rwhv = | 756 content::RenderWidgetHostView* rwhv = |
| 814 WebContents()->GetRenderWidgetHostView(); | 757 WebContents()->GetRenderWidgetHostView(); |
| 815 if (rwhv) | 758 if (rwhv) |
| 816 rwhv->SetActive(false); | 759 rwhv->SetActive(false); |
| 817 } | 760 } |
| 818 | 761 |
| 819 void NativeAppWindowCocoa::WindowDidFinishResize() { | 762 void NativeAppWindowCocoa::WindowDidFinishResize() { |
| 820 // Update |is_maximized_| if needed: | 763 // Update |is_maximized_| if needed: |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 950 } | 893 } |
| 951 | 894 |
| 952 void NativeAppWindowCocoa::UpdateRestoredBounds() { | 895 void NativeAppWindowCocoa::UpdateRestoredBounds() { |
| 953 if (IsRestored(*this)) | 896 if (IsRestored(*this)) |
| 954 restored_bounds_ = [window() frame]; | 897 restored_bounds_ = [window() frame]; |
| 955 } | 898 } |
| 956 | 899 |
| 957 void NativeAppWindowCocoa::HideWithoutMarkingHidden() { | 900 void NativeAppWindowCocoa::HideWithoutMarkingHidden() { |
| 958 [window() orderOut:window_controller_]; | 901 [window() orderOut:window_controller_]; |
| 959 } | 902 } |
| OLD | NEW |