| 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" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 | 44 |
| 45 using extensions::AppWindow; | 45 using extensions::AppWindow; |
| 46 | 46 |
| 47 @interface NSWindow (NSPrivateApis) | 47 @interface NSWindow (NSPrivateApis) |
| 48 - (void)setBottomCornerRounded:(BOOL)rounded; | 48 - (void)setBottomCornerRounded:(BOOL)rounded; |
| 49 - (BOOL)_isTitleHidden; | 49 - (BOOL)_isTitleHidden; |
| 50 @end | 50 @end |
| 51 | 51 |
| 52 namespace { | 52 namespace { |
| 53 | 53 |
| 54 void SetWorkspacesCollectionBehavior(NSWindow* window, bool always_visible) { | |
| 55 NSWindowCollectionBehavior behavior = [window collectionBehavior]; | |
| 56 if (always_visible) | |
| 57 behavior |= NSWindowCollectionBehaviorCanJoinAllSpaces; | |
| 58 else | |
| 59 behavior &= ~NSWindowCollectionBehaviorCanJoinAllSpaces; | |
| 60 [window setCollectionBehavior:behavior]; | |
| 61 } | |
| 62 | |
| 63 void InitCollectionBehavior(NSWindow* window) { | |
| 64 // Since always-on-top windows have a higher window level | |
| 65 // than NSNormalWindowLevel, they will default to | |
| 66 // NSWindowCollectionBehaviorTransient. Set the value | |
| 67 // explicitly here to match normal windows. | |
| 68 NSWindowCollectionBehavior behavior = [window collectionBehavior]; | |
| 69 behavior |= NSWindowCollectionBehaviorManaged; | |
| 70 [window setCollectionBehavior:behavior]; | |
| 71 } | |
| 72 | |
| 73 // Returns the level for windows that are configured to be always on top. | |
| 74 // This is not a constant because NSFloatingWindowLevel is a macro defined | |
| 75 // as a function call. | |
| 76 NSInteger AlwaysOnTopWindowLevel() { | |
| 77 return NSFloatingWindowLevel; | |
| 78 } | |
| 79 | |
| 80 NSRect GfxToCocoaBounds(gfx::Rect bounds) { | 54 NSRect GfxToCocoaBounds(gfx::Rect bounds) { |
| 81 typedef AppWindow::BoundsSpecification BoundsSpecification; | 55 typedef AppWindow::BoundsSpecification BoundsSpecification; |
| 82 | 56 |
| 83 NSRect main_screen_rect = [[[NSScreen screens] objectAtIndex:0] frame]; | 57 NSRect main_screen_rect = [[[NSScreen screens] objectAtIndex:0] frame]; |
| 84 | 58 |
| 85 // If coordinates are unspecified, center window on primary screen. | 59 // If coordinates are unspecified, center window on primary screen. |
| 86 if (bounds.x() == BoundsSpecification::kUnspecifiedPosition) | 60 if (bounds.x() == BoundsSpecification::kUnspecifiedPosition) |
| 87 bounds.set_x(floor((NSWidth(main_screen_rect) - bounds.width()) / 2)); | 61 bounds.set_x(floor((NSWidth(main_screen_rect) - bounds.width()) / 2)); |
| 88 if (bounds.y() == BoundsSpecification::kUnspecifiedPosition) | 62 if (bounds.y() == BoundsSpecification::kUnspecifiedPosition) |
| 89 bounds.set_y(floor((NSHeight(main_screen_rect) - bounds.height()) / 2)); | 63 bounds.set_y(floor((NSHeight(main_screen_rect) - bounds.height()) / 2)); |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 351 [titlebar_background_view_ | 325 [titlebar_background_view_ |
| 352 setColor:gfx::SkColorToSRGBNSColor(active_frame_color_) | 326 setColor:gfx::SkColorToSRGBNSColor(active_frame_color_) |
| 353 inactiveColor:gfx::SkColorToSRGBNSColor(inactive_frame_color_)]; | 327 inactiveColor:gfx::SkColorToSRGBNSColor(inactive_frame_color_)]; |
| 354 } | 328 } |
| 355 | 329 |
| 356 if (base::mac::IsOSSnowLeopard() && | 330 if (base::mac::IsOSSnowLeopard() && |
| 357 [window respondsToSelector:@selector(setBottomCornerRounded:)]) | 331 [window respondsToSelector:@selector(setBottomCornerRounded:)]) |
| 358 [window setBottomCornerRounded:NO]; | 332 [window setBottomCornerRounded:NO]; |
| 359 | 333 |
| 360 if (params.always_on_top) | 334 if (params.always_on_top) |
| 361 [window setLevel:AlwaysOnTopWindowLevel()]; | 335 gfx::SetNSWindowAlwaysOnTop(window, true); |
| 362 InitCollectionBehavior(window); | |
| 363 | 336 |
| 364 SetWorkspacesCollectionBehavior(window, params.visible_on_all_workspaces); | 337 gfx::SetNSWindowVisibleOnAllWorkspaces(window, |
| 338 params.visible_on_all_workspaces); |
| 365 | 339 |
| 366 window_controller_.reset( | 340 window_controller_.reset( |
| 367 [[NativeAppWindowController alloc] initWithWindow:window.release()]); | 341 [[NativeAppWindowController alloc] initWithWindow:window.release()]); |
| 368 | 342 |
| 369 NSView* view = WebContents()->GetNativeView(); | 343 NSView* view = WebContents()->GetNativeView(); |
| 370 [view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; | 344 [view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; |
| 371 | 345 |
| 372 InstallView(); | 346 InstallView(); |
| 373 | 347 |
| 374 [[window_controller_ window] setDelegate:window_controller_]; | 348 [[window_controller_ window] setDelegate:window_controller_]; |
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 702 } | 676 } |
| 703 | 677 |
| 704 void NativeAppWindowCocoa::FlashFrame(bool flash) { | 678 void NativeAppWindowCocoa::FlashFrame(bool flash) { |
| 705 apps::ExtensionAppShimHandler::RequestUserAttentionForWindow( | 679 apps::ExtensionAppShimHandler::RequestUserAttentionForWindow( |
| 706 app_window_, | 680 app_window_, |
| 707 flash ? apps::APP_SHIM_ATTENTION_CRITICAL | 681 flash ? apps::APP_SHIM_ATTENTION_CRITICAL |
| 708 : apps::APP_SHIM_ATTENTION_CANCEL); | 682 : apps::APP_SHIM_ATTENTION_CANCEL); |
| 709 } | 683 } |
| 710 | 684 |
| 711 bool NativeAppWindowCocoa::IsAlwaysOnTop() const { | 685 bool NativeAppWindowCocoa::IsAlwaysOnTop() const { |
| 712 return [window() level] == AlwaysOnTopWindowLevel(); | 686 return gfx::IsNSWindowAlwaysOnTop(window()); |
| 713 } | 687 } |
| 714 | 688 |
| 715 void NativeAppWindowCocoa::RenderViewCreated(content::RenderViewHost* rvh) { | 689 void NativeAppWindowCocoa::RenderViewCreated(content::RenderViewHost* rvh) { |
| 716 if (IsActive()) | 690 if (IsActive()) |
| 717 WebContents()->RestoreFocus(); | 691 WebContents()->RestoreFocus(); |
| 718 } | 692 } |
| 719 | 693 |
| 720 bool NativeAppWindowCocoa::IsFrameless() const { | 694 bool NativeAppWindowCocoa::IsFrameless() const { |
| 721 return !has_frame_; | 695 return !has_frame_; |
| 722 } | 696 } |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 916 is_resizable_ && !size_constraints_.HasFixedSize(); | 890 is_resizable_ && !size_constraints_.HasFixedSize(); |
| 917 shows_fullscreen_controls_ = | 891 shows_fullscreen_controls_ = |
| 918 is_resizable_ && !size_constraints_.HasMaximumSize() && has_frame_; | 892 is_resizable_ && !size_constraints_.HasMaximumSize() && has_frame_; |
| 919 | 893 |
| 920 gfx::ApplyNSWindowSizeConstraints(window(), min_size, max_size, | 894 gfx::ApplyNSWindowSizeConstraints(window(), min_size, max_size, |
| 921 shows_resize_controls_, | 895 shows_resize_controls_, |
| 922 shows_fullscreen_controls_); | 896 shows_fullscreen_controls_); |
| 923 } | 897 } |
| 924 | 898 |
| 925 void NativeAppWindowCocoa::SetAlwaysOnTop(bool always_on_top) { | 899 void NativeAppWindowCocoa::SetAlwaysOnTop(bool always_on_top) { |
| 926 [window() setLevel:(always_on_top ? AlwaysOnTopWindowLevel() : | 900 gfx::SetNSWindowAlwaysOnTop(window(), always_on_top); |
| 927 NSNormalWindowLevel)]; | |
| 928 } | 901 } |
| 929 | 902 |
| 930 void NativeAppWindowCocoa::SetVisibleOnAllWorkspaces(bool always_visible) { | 903 void NativeAppWindowCocoa::SetVisibleOnAllWorkspaces(bool always_visible) { |
| 931 SetWorkspacesCollectionBehavior(window(), always_visible); | 904 gfx::SetNSWindowVisibleOnAllWorkspaces(window(), always_visible); |
| 932 } | 905 } |
| 933 | 906 |
| 934 void NativeAppWindowCocoa::SetInterceptAllKeys(bool want_all_key) { | 907 void NativeAppWindowCocoa::SetInterceptAllKeys(bool want_all_key) { |
| 935 // TODO(sriramsr): implement for OSX (http://crbug.com/166928). | 908 // TODO(sriramsr): implement for OSX (http://crbug.com/166928). |
| 936 NOTIMPLEMENTED(); | 909 NOTIMPLEMENTED(); |
| 937 } | 910 } |
| 938 | 911 |
| 939 NativeAppWindowCocoa::~NativeAppWindowCocoa() { | 912 NativeAppWindowCocoa::~NativeAppWindowCocoa() { |
| 940 } | 913 } |
| 941 | 914 |
| 942 AppNSWindow* NativeAppWindowCocoa::window() const { | 915 AppNSWindow* NativeAppWindowCocoa::window() const { |
| 943 NSWindow* window = [window_controller_ window]; | 916 NSWindow* window = [window_controller_ window]; |
| 944 CHECK(!window || [window isKindOfClass:[AppNSWindow class]]); | 917 CHECK(!window || [window isKindOfClass:[AppNSWindow class]]); |
| 945 return static_cast<AppNSWindow*>(window); | 918 return static_cast<AppNSWindow*>(window); |
| 946 } | 919 } |
| 947 | 920 |
| 948 content::WebContents* NativeAppWindowCocoa::WebContents() const { | 921 content::WebContents* NativeAppWindowCocoa::WebContents() const { |
| 949 return app_window_->web_contents(); | 922 return app_window_->web_contents(); |
| 950 } | 923 } |
| 951 | 924 |
| 952 void NativeAppWindowCocoa::UpdateRestoredBounds() { | 925 void NativeAppWindowCocoa::UpdateRestoredBounds() { |
| 953 if (IsRestored(*this)) | 926 if (IsRestored(*this)) |
| 954 restored_bounds_ = [window() frame]; | 927 restored_bounds_ = [window() frame]; |
| 955 } | 928 } |
| 956 | 929 |
| 957 void NativeAppWindowCocoa::HideWithoutMarkingHidden() { | 930 void NativeAppWindowCocoa::HideWithoutMarkingHidden() { |
| 958 [window() orderOut:window_controller_]; | 931 [window() orderOut:window_controller_]; |
| 959 } | 932 } |
| OLD | NEW |