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 #include "ash/common/wm/overview/window_grid.h" | 5 #include "ash/common/wm/overview/window_grid.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <functional> | 8 #include <functional> |
9 #include <set> | 9 #include <set> |
10 #include <utility> | 10 #include <utility> |
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
403 } | 403 } |
404 | 404 |
405 if (!ash::MaterialDesignController::IsOverviewMaterial() && | 405 if (!ash::MaterialDesignController::IsOverviewMaterial() && |
406 base::CommandLine::ForCurrentProcess()->HasSwitch( | 406 base::CommandLine::ForCurrentProcess()->HasSwitch( |
407 switches::kAshEnableStableOverviewOrder)) { | 407 switches::kAshEnableStableOverviewOrder)) { |
408 // Reorder windows to try to minimize movement to target overview positions. | 408 // Reorder windows to try to minimize movement to target overview positions. |
409 // This also creates a stable window ordering. | 409 // This also creates a stable window ordering. |
410 ReorderItemsGreedyLeastMovement(&windows_in_root, root_window_, | 410 ReorderItemsGreedyLeastMovement(&windows_in_root, root_window_, |
411 window_selector_->text_filter_bottom()); | 411 window_selector_->text_filter_bottom()); |
412 } | 412 } |
413 PrepareForUsingMasksOrShapes(windows_in_root.size()); | |
414 for (auto* window : windows_in_root) { | 413 for (auto* window : windows_in_root) { |
415 window_observer_.Add(window); | 414 window_observer_.Add(window); |
416 window_list_.push_back(new WindowSelectorItem(window, window_selector_)); | 415 window_list_.push_back(new WindowSelectorItem(window, window_selector_)); |
417 } | 416 } |
418 } | 417 } |
419 | 418 |
420 WindowGrid::~WindowGrid() {} | 419 WindowGrid::~WindowGrid() {} |
421 | 420 |
422 void WindowGrid::Shutdown() { | 421 void WindowGrid::Shutdown() { |
423 for (auto iter = window_list_.begin(); iter != window_list_.end(); ++iter) | |
424 (*iter)->Shutdown(); | |
425 | |
426 if (shield_widget_) { | 422 if (shield_widget_) { |
427 // Fade out the shield widget. This animation continues past the lifetime | 423 // Fade out the shield widget. This animation continues past the lifetime |
428 // of |this|. | 424 // of |this|. |
429 WmWindow* widget_window = | 425 WmWindow* widget_window = |
430 WmLookup::Get()->GetWindowForWidget(shield_widget_.get()); | 426 WmLookup::Get()->GetWindowForWidget(shield_widget_.get()); |
431 ui::ScopedLayerAnimationSettings animation_settings( | 427 ui::ScopedLayerAnimationSettings animation_settings( |
432 widget_window->GetLayer()->GetAnimator()); | 428 widget_window->GetLayer()->GetAnimator()); |
433 animation_settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds( | 429 animation_settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds( |
434 kOverviewSelectorTransitionMilliseconds)); | 430 kOverviewSelectorTransitionMilliseconds)); |
435 animation_settings.SetTweenType(gfx::Tween::EASE_IN_2); | 431 animation_settings.SetTweenType(gfx::Tween::EASE_IN); |
436 animation_settings.SetPreemptionStrategy( | 432 animation_settings.SetPreemptionStrategy( |
437 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); | 433 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); |
438 // CleanupAnimationObserver will delete itself (and the shield widget) when | 434 // CleanupAnimationObserver will delete itself (and the shield widget) when |
439 // the opacity animation is complete. | 435 // the opacity animation is complete. |
440 // Ownership over the observer is passed to the window_selector_->delegate() | 436 // Ownership over the observer is passed to the window_selector_->delegate() |
441 // which has longer lifetime so that animations can continue even after the | 437 // which has longer lifetime so that animations can continue even after the |
442 // overview mode is shut down. | 438 // overview mode is shut down. |
443 views::Widget* shield_widget = shield_widget_.get(); | 439 views::Widget* shield_widget = shield_widget_.get(); |
444 std::unique_ptr<CleanupAnimationObserver> observer( | 440 std::unique_ptr<CleanupAnimationObserver> observer( |
445 new CleanupAnimationObserver(std::move(shield_widget_))); | 441 new CleanupAnimationObserver(std::move(shield_widget_))); |
446 animation_settings.AddObserver(observer.get()); | 442 animation_settings.AddObserver(observer.get()); |
447 window_selector_->delegate()->AddDelayedAnimationObserver( | 443 window_selector_->delegate()->AddDelayedAnimationObserver( |
448 std::move(observer)); | 444 std::move(observer)); |
449 shield_widget->SetOpacity(0.f); | 445 shield_widget->SetOpacity(0.f); |
450 } | 446 } |
451 } | 447 } |
452 | 448 |
453 void WindowGrid::PrepareForOverview() { | 449 void WindowGrid::PrepareForOverview() { |
454 if (ash::MaterialDesignController::IsOverviewMaterial()) | 450 if (ash::MaterialDesignController::IsOverviewMaterial()) |
455 InitShieldWidget(); | 451 InitShieldWidget(); |
456 for (auto iter = window_list_.begin(); iter != window_list_.end(); ++iter) | 452 for (auto iter = window_list_.begin(); iter != window_list_.end(); ++iter) |
457 (*iter)->PrepareForOverview(); | 453 (*iter)->PrepareForOverview(); |
458 prepared_for_overview_ = true; | 454 prepared_for_overview_ = true; |
459 } | 455 } |
460 | 456 |
461 void WindowGrid::PositionWindowsMD(bool animate) { | 457 void WindowGrid::PositionWindowsMD(bool animate) { |
462 if (window_list_.empty()) | 458 if (window_list_.empty()) |
463 return; | 459 return; |
464 PrepareForUsingMasksOrShapes(window_list_.size()); | 460 |
| 461 const int kUnlimited = -1; |
| 462 const size_t windows_count = window_list_.size(); |
| 463 const base::CommandLine* command_line = |
| 464 base::CommandLine::ForCurrentProcess(); |
| 465 int windows_to_use_masks = kMaxWindowsCountToHideHeaderWithMasks; |
| 466 if (command_line->HasSwitch(switches::kAshMaxWindowsToUseMaskInOverview) && |
| 467 (!base::StringToInt(command_line->GetSwitchValueASCII( |
| 468 switches::kAshMaxWindowsToUseMaskInOverview), |
| 469 &windows_to_use_masks) || |
| 470 windows_to_use_masks <= kUnlimited)) { |
| 471 windows_to_use_masks = kMaxWindowsCountToHideHeaderWithMasks; |
| 472 } |
| 473 int windows_to_use_shapes = kUnlimited; |
| 474 if (command_line->HasSwitch(switches::kAshMaxWindowsToUseShapeInOverview) && |
| 475 (!base::StringToInt(command_line->GetSwitchValueASCII( |
| 476 switches::kAshMaxWindowsToUseShapeInOverview), |
| 477 &windows_to_use_shapes) || |
| 478 windows_to_use_shapes <= kUnlimited)) { |
| 479 windows_to_use_shapes = kUnlimited; |
| 480 } |
| 481 WindowSelectorItem::set_use_mask(windows_to_use_masks <= kUnlimited || |
| 482 static_cast<int>(windows_count) <= |
| 483 windows_to_use_masks); |
| 484 WindowSelectorItem::set_use_shape(windows_to_use_shapes <= kUnlimited || |
| 485 static_cast<int>(windows_count) <= |
| 486 windows_to_use_shapes); |
| 487 |
465 gfx::Rect total_bounds = | 488 gfx::Rect total_bounds = |
466 root_window_->ConvertRectToScreen(wm::GetDisplayWorkAreaBoundsInParent( | 489 root_window_->ConvertRectToScreen(wm::GetDisplayWorkAreaBoundsInParent( |
467 root_window_->GetChildByShellWindowId( | 490 root_window_->GetChildByShellWindowId( |
468 kShellWindowId_DefaultContainer))); | 491 kShellWindowId_DefaultContainer))); |
469 // Windows occupy vertically centered area with additional vertical insets. | 492 // Windows occupy vertically centered area with additional vertical insets. |
470 int horizontal_inset = | 493 int horizontal_inset = |
471 gfx::ToFlooredInt(std::min(kOverviewInsetRatio * total_bounds.width(), | 494 gfx::ToFlooredInt(std::min(kOverviewInsetRatio * total_bounds.width(), |
472 kOverviewInsetRatio * total_bounds.height())); | 495 kOverviewInsetRatio * total_bounds.height())); |
473 int vertical_inset = | 496 int vertical_inset = |
474 horizontal_inset + | 497 horizontal_inset + |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
563 // |right_bound| was reverted. Perform one last pass to position the |rects|. | 586 // |right_bound| was reverted. Perform one last pass to position the |rects|. |
564 if (make_last_adjustment) { | 587 if (make_last_adjustment) { |
565 gfx::Rect overview_bounds(total_bounds); | 588 gfx::Rect overview_bounds(total_bounds); |
566 overview_bounds.set_width(right_bound - total_bounds.x()); | 589 overview_bounds.set_width(right_bound - total_bounds.x()); |
567 FitWindowRectsInBounds(overview_bounds, | 590 FitWindowRectsInBounds(overview_bounds, |
568 std::min(kMaxHeight + 2 * kWindowMarginMD, height), | 591 std::min(kMaxHeight + 2 * kWindowMarginMD, height), |
569 &rects, &max_bottom, &min_right, &max_right); | 592 &rects, &max_bottom, &min_right, &max_right); |
570 } | 593 } |
571 // Position the windows centering the left-aligned rows vertically. | 594 // Position the windows centering the left-aligned rows vertically. |
572 gfx::Vector2d offset(0, (total_bounds.bottom() - max_bottom) / 2); | 595 gfx::Vector2d offset(0, (total_bounds.bottom() - max_bottom) / 2); |
573 for (size_t i = 0; i < window_list_.size(); ++i) { | 596 for (size_t i = 0; i < windows_count; ++i) { |
574 window_list_[i]->SetBounds( | 597 window_list_[i]->SetBounds( |
575 rects[i] + offset, | 598 rects[i] + offset, |
576 animate | 599 animate |
577 ? OverviewAnimationType::OVERVIEW_ANIMATION_LAY_OUT_SELECTOR_ITEMS | 600 ? OverviewAnimationType::OVERVIEW_ANIMATION_LAY_OUT_SELECTOR_ITEMS |
578 : OverviewAnimationType::OVERVIEW_ANIMATION_NONE); | 601 : OverviewAnimationType::OVERVIEW_ANIMATION_NONE); |
579 } | 602 } |
580 | 603 |
581 // If the selection widget is active, reposition it without any animation. | 604 // If the selection widget is active, reposition it without any animation. |
582 if (selection_widget_) | 605 if (selection_widget_) |
583 MoveSelectionWidgetToTarget(animate); | 606 MoveSelectionWidgetToTarget(animate); |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
832 WmWindow* widget_window = | 855 WmWindow* widget_window = |
833 WmLookup::Get()->GetWindowForWidget(shield_widget_.get()); | 856 WmLookup::Get()->GetWindowForWidget(shield_widget_.get()); |
834 const gfx::Rect bounds = widget_window->GetParent()->GetBounds(); | 857 const gfx::Rect bounds = widget_window->GetParent()->GetBounds(); |
835 widget_window->SetBounds(bounds); | 858 widget_window->SetBounds(bounds); |
836 widget_window->SetName("OverviewModeShield"); | 859 widget_window->SetName("OverviewModeShield"); |
837 | 860 |
838 ui::ScopedLayerAnimationSettings animation_settings( | 861 ui::ScopedLayerAnimationSettings animation_settings( |
839 widget_window->GetLayer()->GetAnimator()); | 862 widget_window->GetLayer()->GetAnimator()); |
840 animation_settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds( | 863 animation_settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds( |
841 kOverviewSelectorTransitionMilliseconds)); | 864 kOverviewSelectorTransitionMilliseconds)); |
842 animation_settings.SetTweenType(gfx::Tween::EASE_IN); | 865 animation_settings.SetTweenType(gfx::Tween::LINEAR_OUT_SLOW_IN); |
843 animation_settings.SetPreemptionStrategy( | 866 animation_settings.SetPreemptionStrategy( |
844 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); | 867 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); |
845 shield_widget_->SetOpacity(kShieldOpacity); | 868 shield_widget_->SetOpacity(kShieldOpacity); |
846 } | 869 } |
847 | 870 |
848 void WindowGrid::InitSelectionWidget(WindowSelector::Direction direction) { | 871 void WindowGrid::InitSelectionWidget(WindowSelector::Direction direction) { |
849 const bool material = ash::MaterialDesignController::IsOverviewMaterial(); | 872 const bool material = ash::MaterialDesignController::IsOverviewMaterial(); |
850 const int border_thickness = material ? kWindowSelectionBorderThicknessMD | 873 const int border_thickness = material ? kWindowSelectionBorderThicknessMD |
851 : kWindowSelectionBorderThickness; | 874 : kWindowSelectionBorderThickness; |
852 const int border_color = | 875 const int border_color = |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1032 if (*min_right > left) | 1055 if (*min_right > left) |
1033 *min_right = left; | 1056 *min_right = left; |
1034 if (*max_right < left) | 1057 if (*max_right < left) |
1035 *max_right = left; | 1058 *max_right = left; |
1036 } | 1059 } |
1037 *max_bottom = top + height; | 1060 *max_bottom = top + height; |
1038 } | 1061 } |
1039 return windows_fit; | 1062 return windows_fit; |
1040 } | 1063 } |
1041 | 1064 |
1042 void WindowGrid::PrepareForUsingMasksOrShapes(size_t windows_count) const { | |
1043 const int kUnlimited = -1; | |
1044 const base::CommandLine* command_line = | |
1045 base::CommandLine::ForCurrentProcess(); | |
1046 int windows_to_use_masks = kMaxWindowsCountToHideHeaderWithMasks; | |
1047 if (command_line->HasSwitch(switches::kAshMaxWindowsToUseMaskInOverview) && | |
1048 (!base::StringToInt(command_line->GetSwitchValueASCII( | |
1049 switches::kAshMaxWindowsToUseMaskInOverview), | |
1050 &windows_to_use_masks) || | |
1051 windows_to_use_masks <= kUnlimited)) { | |
1052 windows_to_use_masks = kMaxWindowsCountToHideHeaderWithMasks; | |
1053 } | |
1054 int windows_to_use_shapes = kUnlimited; | |
1055 if (command_line->HasSwitch(switches::kAshMaxWindowsToUseShapeInOverview) && | |
1056 (!base::StringToInt(command_line->GetSwitchValueASCII( | |
1057 switches::kAshMaxWindowsToUseShapeInOverview), | |
1058 &windows_to_use_shapes) || | |
1059 windows_to_use_shapes <= kUnlimited)) { | |
1060 windows_to_use_shapes = kUnlimited; | |
1061 } | |
1062 WindowSelectorItem::set_use_mask(windows_to_use_masks <= kUnlimited || | |
1063 static_cast<int>(windows_count) <= | |
1064 windows_to_use_masks); | |
1065 WindowSelectorItem::set_use_shape(windows_to_use_shapes <= kUnlimited || | |
1066 static_cast<int>(windows_count) <= | |
1067 windows_to_use_shapes); | |
1068 } | |
1069 | |
1070 } // namespace ash | 1065 } // namespace ash |
OLD | NEW |