| 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 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 backing:NSBackingStoreBuffered | 269 backing:NSBackingStoreBuffered |
| 270 defer:NO]; | 270 defer:NO]; |
| 271 | 271 |
| 272 std::string name; | 272 std::string name; |
| 273 const extensions::Extension* extension = app_window_->GetExtension(); | 273 const extensions::Extension* extension = app_window_->GetExtension(); |
| 274 if (extension) | 274 if (extension) |
| 275 name = extension->name(); | 275 name = extension->name(); |
| 276 [window setTitle:base::SysUTF8ToNSString(name)]; | 276 [window setTitle:base::SysUTF8ToNSString(name)]; |
| 277 [[window contentView] setWantsLayer:YES]; | 277 [[window contentView] setWantsLayer:YES]; |
| 278 | 278 |
| 279 if (base::mac::IsOSSnowLeopard() && | |
| 280 [window respondsToSelector:@selector(setBottomCornerRounded:)]) | |
| 281 [window setBottomCornerRounded:NO]; | |
| 282 | |
| 283 if (params.always_on_top) | 279 if (params.always_on_top) |
| 284 gfx::SetNSWindowAlwaysOnTop(window, true); | 280 gfx::SetNSWindowAlwaysOnTop(window, true); |
| 285 | 281 |
| 286 gfx::SetNSWindowVisibleOnAllWorkspaces(window, | 282 gfx::SetNSWindowVisibleOnAllWorkspaces(window, |
| 287 params.visible_on_all_workspaces); | 283 params.visible_on_all_workspaces); |
| 288 | 284 |
| 289 window_controller_.reset( | 285 window_controller_.reset( |
| 290 [[NativeAppWindowController alloc] initWithWindow:window]); | 286 [[NativeAppWindowController alloc] initWithWindow:window]); |
| 291 | 287 |
| 292 if (has_frame_ && has_frame_color_) { | 288 if (has_frame_ && has_frame_color_) { |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 389 if (fullscreen == is_fullscreen_) | 385 if (fullscreen == is_fullscreen_) |
| 390 return; | 386 return; |
| 391 | 387 |
| 392 // 10.11 posts an _endLiveResize event just before exiting fullscreen, so | 388 // 10.11 posts an _endLiveResize event just before exiting fullscreen, so |
| 393 // ensure the window reports as fullscreen while the window is transitioning | 389 // ensure the window reports as fullscreen while the window is transitioning |
| 394 // to ensure the window bounds are not incorrectly captured as the last known | 390 // to ensure the window bounds are not incorrectly captured as the last known |
| 395 // restored bounds. | 391 // restored bounds. |
| 396 if (fullscreen) | 392 if (fullscreen) |
| 397 is_fullscreen_ = true; | 393 is_fullscreen_ = true; |
| 398 | 394 |
| 399 if (base::mac::IsOSLionOrLater()) { | 395 // If going fullscreen, but the window is constrained (fullscreen UI control |
| 400 // If going fullscreen, but the window is constrained (fullscreen UI control | 396 // is disabled), temporarily enable it. It will be disabled again on leaving |
| 401 // is disabled), temporarily enable it. It will be disabled again on leaving | 397 // fullscreen. |
| 402 // fullscreen. | 398 if (fullscreen && !shows_fullscreen_controls_) |
| 403 if (fullscreen && !shows_fullscreen_controls_) | 399 gfx::SetNSWindowCanFullscreen(window(), true); |
| 404 gfx::SetNSWindowCanFullscreen(window(), true); | 400 [window() toggleFullScreen:nil]; |
| 405 [window() toggleFullScreen:nil]; | |
| 406 is_fullscreen_ = fullscreen; | |
| 407 return; | |
| 408 } | |
| 409 | |
| 410 DCHECK(base::mac::IsOSSnowLeopard()); | |
| 411 | |
| 412 // Fade to black. | |
| 413 const CGDisplayReservationInterval kFadeDurationSeconds = 0.6; | |
| 414 bool did_fade_out = false; | |
| 415 CGDisplayFadeReservationToken token; | |
| 416 if (CGAcquireDisplayFadeReservation(kFadeDurationSeconds, &token) == | |
| 417 kCGErrorSuccess) { | |
| 418 did_fade_out = true; | |
| 419 CGDisplayFade(token, kFadeDurationSeconds / 2, kCGDisplayBlendNormal, | |
| 420 kCGDisplayBlendSolidColor, 0.0, 0.0, 0.0, /*synchronous=*/true); | |
| 421 } | |
| 422 | |
| 423 // Since frameless windows insert the WebContentsView into the NSThemeFrame | |
| 424 // ([[window contentView] superview]), and since that NSThemeFrame is | |
| 425 // destroyed and recreated when we change the styleMask of the window, we | |
| 426 // need to remove the view from the window when we change the style, and | |
| 427 // add it back afterwards. | |
| 428 UninstallView(); | |
| 429 if (fullscreen) { | |
| 430 UpdateRestoredBounds(); | |
| 431 [window() setStyleMask:NSBorderlessWindowMask]; | |
| 432 [window() setFrame:[window() | |
| 433 frameRectForContentRect:[[window() screen] frame]] | |
| 434 display:YES]; | |
| 435 base::mac::RequestFullScreen(base::mac::kFullScreenModeAutoHideAll); | |
| 436 } else { | |
| 437 base::mac::ReleaseFullScreen(base::mac::kFullScreenModeAutoHideAll); | |
| 438 [window() setStyleMask:GetWindowStyleMask()]; | |
| 439 [window() setFrame:restored_bounds_ display:YES]; | |
| 440 } | |
| 441 InstallView(); | |
| 442 | |
| 443 // Fade back in. | |
| 444 if (did_fade_out) { | |
| 445 CGDisplayFade(token, kFadeDurationSeconds / 2, kCGDisplayBlendSolidColor, | |
| 446 kCGDisplayBlendNormal, 0.0, 0.0, 0.0, /*synchronous=*/false); | |
| 447 CGReleaseDisplayFadeReservation(token); | |
| 448 } | |
| 449 is_fullscreen_ = fullscreen; | 401 is_fullscreen_ = fullscreen; |
| 450 } | 402 } |
| 451 | 403 |
| 452 bool NativeAppWindowCocoa::IsFullscreenOrPending() const { | 404 bool NativeAppWindowCocoa::IsFullscreenOrPending() const { |
| 453 return is_fullscreen_; | 405 return is_fullscreen_; |
| 454 } | 406 } |
| 455 | 407 |
| 456 gfx::NativeWindow NativeAppWindowCocoa::GetNativeWindow() const { | 408 gfx::NativeWindow NativeAppWindowCocoa::GetNativeWindow() const { |
| 457 return window(); | 409 return window(); |
| 458 } | 410 } |
| (...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 880 } | 832 } |
| 881 | 833 |
| 882 void NativeAppWindowCocoa::UpdateRestoredBounds() { | 834 void NativeAppWindowCocoa::UpdateRestoredBounds() { |
| 883 if (IsRestored(*this)) | 835 if (IsRestored(*this)) |
| 884 restored_bounds_ = [window() frame]; | 836 restored_bounds_ = [window() frame]; |
| 885 } | 837 } |
| 886 | 838 |
| 887 void NativeAppWindowCocoa::HideWithoutMarkingHidden() { | 839 void NativeAppWindowCocoa::HideWithoutMarkingHidden() { |
| 888 [window() orderOut:window_controller_]; | 840 [window() orderOut:window_controller_]; |
| 889 } | 841 } |
| OLD | NEW |