| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 #import "ui/views/cocoa/bridged_native_widget.h" | 5 #import "ui/views/cocoa/bridged_native_widget.h" |
| 6 | 6 |
| 7 #import <objc/runtime.h> | 7 #import <objc/runtime.h> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/mac/mac_util.h" | 10 #include "base/mac/mac_util.h" |
| (...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 in_fullscreen_transition_ = true; | 379 in_fullscreen_transition_ = true; |
| 380 | 380 |
| 381 // If going into fullscreen, store an answer for GetRestoredBounds(). | 381 // If going into fullscreen, store an answer for GetRestoredBounds(). |
| 382 if (target_fullscreen_state) | 382 if (target_fullscreen_state) |
| 383 bounds_before_fullscreen_ = gfx::ScreenRectFromNSRect([window_ frame]); | 383 bounds_before_fullscreen_ = gfx::ScreenRectFromNSRect([window_ frame]); |
| 384 } | 384 } |
| 385 | 385 |
| 386 void BridgedNativeWidget::OnFullscreenTransitionComplete( | 386 void BridgedNativeWidget::OnFullscreenTransitionComplete( |
| 387 bool actual_fullscreen_state) { | 387 bool actual_fullscreen_state) { |
| 388 in_fullscreen_transition_ = false; | 388 in_fullscreen_transition_ = false; |
| 389 if (target_fullscreen_state_ == actual_fullscreen_state) | 389 |
| 390 if (target_fullscreen_state_ == actual_fullscreen_state) { |
| 391 // Ensure constraints are re-applied when completing a transition. |
| 392 OnSizeConstraintsChanged(); |
| 390 return; | 393 return; |
| 394 } |
| 391 | 395 |
| 392 // First update to reflect reality so that OnTargetFullscreenStateChanged() | 396 // First update to reflect reality so that OnTargetFullscreenStateChanged() |
| 393 // expects the change. | 397 // expects the change. |
| 394 target_fullscreen_state_ = actual_fullscreen_state; | 398 target_fullscreen_state_ = actual_fullscreen_state; |
| 395 ToggleDesiredFullscreenState(); | 399 ToggleDesiredFullscreenState(); |
| 396 | 400 |
| 397 // Usually ToggleDesiredFullscreenState() sets |in_fullscreen_transition_| via | 401 // Usually ToggleDesiredFullscreenState() sets |in_fullscreen_transition_| via |
| 398 // OnFullscreenTransitionStart(). When it does not, it means Cocoa ignored the | 402 // OnFullscreenTransitionStart(). When it does not, it means Cocoa ignored the |
| 399 // toggleFullScreen: request. This can occur when the fullscreen transition | 403 // toggleFullScreen: request. This can occur when the fullscreen transition |
| 400 // fails and Cocoa is *about* to send windowDidFailToEnterFullScreen:. | 404 // fails and Cocoa is *about* to send windowDidFailToEnterFullScreen:. |
| (...skipping 22 matching lines...) Expand all Loading... |
| 423 // of relying on AppKit to do it, and not worry that OnVisibilityChanged() | 427 // of relying on AppKit to do it, and not worry that OnVisibilityChanged() |
| 424 // won't be called for externally triggered fullscreen requests. | 428 // won't be called for externally triggered fullscreen requests. |
| 425 if (!window_visible_) | 429 if (!window_visible_) |
| 426 SetVisibilityState(SHOW_INACTIVE); | 430 SetVisibilityState(SHOW_INACTIVE); |
| 427 | 431 |
| 428 if (base::mac::IsOSSnowLeopard()) { | 432 if (base::mac::IsOSSnowLeopard()) { |
| 429 NOTIMPLEMENTED(); | 433 NOTIMPLEMENTED(); |
| 430 return; // TODO(tapted): Implement this for Snow Leopard. | 434 return; // TODO(tapted): Implement this for Snow Leopard. |
| 431 } | 435 } |
| 432 | 436 |
| 433 // Since fullscreen requests are ignored if the collection behavior does not | 437 // Enable fullscreen collection behavior because: |
| 434 // allow it, save the collection behavior and restore it after. | 438 // 1: -[NSWindow toggleFullscreen:] would otherwise be ignored, |
| 435 NSWindowCollectionBehavior behavior = [window_ collectionBehavior]; | 439 // 2: the fullscreen button must be enabled so the user can leave fullscreen. |
| 436 [window_ setCollectionBehavior:behavior | | 440 // This will be reset when a transition out of fullscreen completes. |
| 437 NSWindowCollectionBehaviorFullScreenPrimary]; | 441 gfx::SetNSWindowCanFullscreen(window_, true); |
| 442 |
| 438 [window_ toggleFullScreen:nil]; | 443 [window_ toggleFullScreen:nil]; |
| 439 [window_ setCollectionBehavior:behavior]; | |
| 440 } | 444 } |
| 441 | 445 |
| 442 void BridgedNativeWidget::OnSizeChanged() { | 446 void BridgedNativeWidget::OnSizeChanged() { |
| 443 gfx::Size new_size = GetClientAreaSize(); | 447 gfx::Size new_size = GetClientAreaSize(); |
| 444 native_widget_mac_->GetWidget()->OnNativeWidgetSizeChanged(new_size); | 448 native_widget_mac_->GetWidget()->OnNativeWidgetSizeChanged(new_size); |
| 445 if (layer()) | 449 if (layer()) |
| 446 UpdateLayerProperties(); | 450 UpdateLayerProperties(); |
| 447 } | 451 } |
| 448 | 452 |
| 449 void BridgedNativeWidget::OnVisibilityChanged() { | 453 void BridgedNativeWidget::OnVisibilityChanged() { |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 514 widget->OnNativeFocus(); | 518 widget->OnNativeFocus(); |
| 515 widget->GetFocusManager()->RestoreFocusedView(); | 519 widget->GetFocusManager()->RestoreFocusedView(); |
| 516 } else { | 520 } else { |
| 517 widget->OnNativeBlur(); | 521 widget->OnNativeBlur(); |
| 518 widget->GetFocusManager()->StoreFocusedView(true); | 522 widget->GetFocusManager()->StoreFocusedView(true); |
| 519 } | 523 } |
| 520 } | 524 } |
| 521 } | 525 } |
| 522 | 526 |
| 523 void BridgedNativeWidget::OnSizeConstraintsChanged() { | 527 void BridgedNativeWidget::OnSizeConstraintsChanged() { |
| 524 NSWindow* window = ns_window(); | 528 // Don't modify the size constraints or fullscreen collection behavior while |
| 529 // in fullscreen or during a transition. OnFullscreenTransitionComplete will |
| 530 // reset these after leaving fullscreen. |
| 531 if (target_fullscreen_state_ || in_fullscreen_transition_) |
| 532 return; |
| 533 |
| 525 Widget* widget = native_widget_mac()->GetWidget(); | 534 Widget* widget = native_widget_mac()->GetWidget(); |
| 526 gfx::Size min_size = widget->GetMinimumSize(); | 535 gfx::Size min_size = widget->GetMinimumSize(); |
| 527 gfx::Size max_size = widget->GetMaximumSize(); | 536 gfx::Size max_size = widget->GetMaximumSize(); |
| 528 bool is_resizable = widget->widget_delegate()->CanResize(); | 537 bool is_resizable = widget->widget_delegate()->CanResize(); |
| 529 bool shows_resize_controls = | 538 bool shows_resize_controls = |
| 530 is_resizable && (min_size.IsEmpty() || min_size != max_size); | 539 is_resizable && (min_size.IsEmpty() || min_size != max_size); |
| 531 bool shows_fullscreen_controls = | 540 bool shows_fullscreen_controls = |
| 532 is_resizable && widget->widget_delegate()->CanMaximize(); | 541 is_resizable && widget->widget_delegate()->CanMaximize(); |
| 533 | 542 |
| 534 gfx::ApplyNSWindowSizeConstraints(window, min_size, max_size, | 543 gfx::ApplyNSWindowSizeConstraints(window_, min_size, max_size, |
| 535 shows_resize_controls, | 544 shows_resize_controls, |
| 536 shows_fullscreen_controls); | 545 shows_fullscreen_controls); |
| 537 } | 546 } |
| 538 | 547 |
| 539 InputMethod* BridgedNativeWidget::CreateInputMethod() { | 548 InputMethod* BridgedNativeWidget::CreateInputMethod() { |
| 540 if (switches::IsTextInputFocusManagerEnabled()) | 549 if (switches::IsTextInputFocusManagerEnabled()) |
| 541 return new NullInputMethod(); | 550 return new NullInputMethod(); |
| 542 | 551 |
| 543 return new InputMethodBridge(this, GetHostInputMethod(), true); | 552 return new InputMethodBridge(this, GetHostInputMethod(), true); |
| 544 } | 553 } |
| (...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 832 window_, &kWindowPropertiesKey); | 841 window_, &kWindowPropertiesKey); |
| 833 if (!properties) { | 842 if (!properties) { |
| 834 properties = [NSMutableDictionary dictionary]; | 843 properties = [NSMutableDictionary dictionary]; |
| 835 objc_setAssociatedObject(window_, &kWindowPropertiesKey, | 844 objc_setAssociatedObject(window_, &kWindowPropertiesKey, |
| 836 properties, OBJC_ASSOCIATION_RETAIN); | 845 properties, OBJC_ASSOCIATION_RETAIN); |
| 837 } | 846 } |
| 838 return properties; | 847 return properties; |
| 839 } | 848 } |
| 840 | 849 |
| 841 } // namespace views | 850 } // namespace views |
| OLD | NEW |