| Index: ash/wm/workspace/phantom_window_controller.cc
|
| diff --git a/ash/wm/workspace/phantom_window_controller.cc b/ash/wm/workspace/phantom_window_controller.cc
|
| index 4608f4d8a3a980d30f8b8a3e91e41a6111ca56e8..cb12e9c281d02b935f63f56984987cdfa4ca5615 100644
|
| --- a/ash/wm/workspace/phantom_window_controller.cc
|
| +++ b/ash/wm/workspace/phantom_window_controller.cc
|
| @@ -4,6 +4,8 @@
|
|
|
| #include "ash/wm/workspace/phantom_window_controller.h"
|
|
|
| +#include <math.h>
|
| +
|
| #include "ash/ash_switches.h"
|
| #include "ash/shell.h"
|
| #include "ash/shell_window_ids.h"
|
| @@ -32,22 +34,34 @@ const int kAnimationDurationMs = 200;
|
| // The size of the phantom window at the beginning of the show animation in
|
| // relation to the size of the phantom window at the end of the animation when
|
| // using the alternate caption button style.
|
| -const float kAlternateCaptionButtonStyleAnimationInitialBoundsRatio = 0.85f;
|
| +const float kAlternateStyleStartBoundsRatio = 0.85f;
|
|
|
| // The amount of pixels that the phantom window's shadow should extend past
|
| // the bounds passed into Show(). There is no shadow when not using the
|
| // alternate caption button style.
|
| -const int kShadowThickness = 15;
|
| -
|
| -// Converts the bounds of a phantom window without a shadow to those of a
|
| -// phantom window with a shadow.
|
| -gfx::Rect GetBoundsWithShadow(const gfx::Rect& bounds) {
|
| - gfx::Rect bounds_with_shadow(bounds);
|
| - // Phantom windows have a shadow solely when using the alternate caption
|
| - // button style.
|
| - if (switches::UseAlternateFrameCaptionButtonStyle())
|
| - bounds_with_shadow.Inset(-kShadowThickness, -kShadowThickness);
|
| - return bounds_with_shadow;
|
| +const int kAlternateStyleShadowThickness = 15;
|
| +
|
| +// The minimum size of a phantom window including the shadow when using the
|
| +// alternate caption button style. The minimum size is derived from the size of
|
| +// the IDR_AURA_PHANTOM_WINDOW image assets.
|
| +const int kAlternateStyleMinSizeWithShadow = 100;
|
| +
|
| +// Adjusts the phantom window's bounds so that the bounds:
|
| +// - Include the size of the shadow.
|
| +// - Have a size equal to or larger than the minimize phantom window size.
|
| +gfx::Rect GetAdjustedBoundsForAlternateStyle(const gfx::Rect& bounds) {
|
| + int x_inset = std::max(
|
| + static_cast<int>(
|
| + ceil((kAlternateStyleMinSizeWithShadow - bounds.width()) / 2.0f)),
|
| + kAlternateStyleShadowThickness);
|
| + int y_inset = std::max(
|
| + static_cast<int>(
|
| + ceil((kAlternateStyleMinSizeWithShadow - bounds.height()) / 2.0f)),
|
| + kAlternateStyleShadowThickness);
|
| +
|
| + gfx::Rect adjusted_bounds(bounds);
|
| + adjusted_bounds.Inset(-x_inset, -y_inset);
|
| + return adjusted_bounds;
|
| }
|
|
|
| // Starts an animation of |widget| to |new_bounds_in_screen|. No-op if |widget|
|
| @@ -138,72 +152,89 @@ PhantomWindowController::~PhantomWindowController() {
|
| }
|
|
|
| void PhantomWindowController::Show(const gfx::Rect& bounds_in_screen) {
|
| - if (GetBoundsWithShadow(bounds_in_screen) == target_bounds_in_screen_)
|
| + if (switches::UseAlternateFrameCaptionButtonStyle())
|
| + ShowAlternate(bounds_in_screen);
|
| + else
|
| + ShowLegacy(bounds_in_screen);
|
| +}
|
| +
|
| +void PhantomWindowController::ShowAlternate(const gfx::Rect& bounds_in_screen) {
|
| + gfx::Rect adjusted_bounds_in_screen =
|
| + GetAdjustedBoundsForAlternateStyle(bounds_in_screen);
|
| + if (adjusted_bounds_in_screen == target_bounds_in_screen_)
|
| return;
|
| - target_bounds_in_screen_ = GetBoundsWithShadow(bounds_in_screen);
|
| + target_bounds_in_screen_ = adjusted_bounds_in_screen;
|
| +
|
| + gfx::Rect start_bounds_in_screen = target_bounds_in_screen_;
|
| + int start_width = std::max(
|
| + kAlternateStyleMinSizeWithShadow,
|
| + static_cast<int>(
|
| + start_bounds_in_screen.width() * kAlternateStyleStartBoundsRatio));
|
| + int start_height = std::max(
|
| + kAlternateStyleMinSizeWithShadow,
|
| + static_cast<int>(
|
| + start_bounds_in_screen.height() * kAlternateStyleStartBoundsRatio));
|
| + start_bounds_in_screen.Inset(
|
| + floor((start_bounds_in_screen.width() - start_width) / 2.0f),
|
| + floor((start_bounds_in_screen.height() - start_height) / 2.0f));
|
| + phantom_widget_in_target_root_ = CreatePhantomWidget(
|
| + wm::GetRootWindowMatching(target_bounds_in_screen_),
|
| + start_bounds_in_screen);
|
| +
|
| + AnimateToBounds(phantom_widget_in_target_root_.get(),
|
| + target_bounds_in_screen_);
|
| +}
|
|
|
| - if (switches::UseAlternateFrameCaptionButtonStyle()) {
|
| - gfx::Rect start_bounds_in_screen = target_bounds_in_screen_;
|
| - float inset_ratio =
|
| - (1.0f - kAlternateCaptionButtonStyleAnimationInitialBoundsRatio) / 2;
|
| - start_bounds_in_screen.Inset(
|
| - static_cast<int>(start_bounds_in_screen.width() * inset_ratio),
|
| - static_cast<int>(start_bounds_in_screen.height() * inset_ratio));
|
| - phantom_widget_in_target_root_ = CreatePhantomWidget(
|
| - wm::GetRootWindowMatching(target_bounds_in_screen_),
|
| - start_bounds_in_screen);
|
| -
|
| - AnimateToBounds(phantom_widget_in_target_root_.get(),
|
| - target_bounds_in_screen_);
|
| - } else {
|
| - gfx::Rect start_bounds_in_screen;
|
| - if (!phantom_widget_in_target_root_) {
|
| - start_bounds_in_screen =
|
| - GetBoundsWithShadow(window_->GetBoundsInScreen());
|
| - } else {
|
| - start_bounds_in_screen =
|
| - phantom_widget_in_target_root_->GetWindowBoundsInScreen();
|
| - }
|
| +void PhantomWindowController::ShowLegacy(const gfx::Rect& bounds_in_screen) {
|
| + if (bounds_in_screen == target_bounds_in_screen_)
|
| + return;
|
| + target_bounds_in_screen_ = bounds_in_screen;
|
|
|
| - aura::Window* target_root =
|
| - wm::GetRootWindowMatching(target_bounds_in_screen_);
|
| - if (!phantom_widget_in_target_root_ ||
|
| - phantom_widget_in_target_root_->GetNativeWindow()->GetRootWindow() !=
|
| - target_root) {
|
| - phantom_widget_in_target_root_ =
|
| - CreatePhantomWidget(target_root, start_bounds_in_screen);
|
| - }
|
| - AnimateToBounds(phantom_widget_in_target_root_.get(),
|
| - target_bounds_in_screen_);
|
| + gfx::Rect start_bounds_in_screen;
|
| + if (!phantom_widget_in_target_root_) {
|
| + start_bounds_in_screen = window_->GetBoundsInScreen();
|
| + } else {
|
| + start_bounds_in_screen =
|
| + phantom_widget_in_target_root_->GetWindowBoundsInScreen();
|
| + }
|
|
|
| - // Create a secondary widget in a second screen if |start_bounds_in_screen|
|
| - // lies at least partially in another screen. This allows animations to
|
| - // start or restart in one root window and progress to another root.
|
| - aura::Window* start_root =
|
| - wm::GetRootWindowMatching(start_bounds_in_screen);
|
| - if (start_root == target_root) {
|
| - aura::Window::Windows root_windows = Shell::GetAllRootWindows();
|
| - for (size_t i = 0; i < root_windows.size(); ++i) {
|
| - if (root_windows[i] != target_root &&
|
| - root_windows[i]->GetBoundsInScreen().Intersects(
|
| - start_bounds_in_screen)) {
|
| - start_root = root_windows[i];
|
| - break;
|
| - }
|
| + aura::Window* target_root =
|
| + wm::GetRootWindowMatching(target_bounds_in_screen_);
|
| + if (!phantom_widget_in_target_root_ ||
|
| + phantom_widget_in_target_root_->GetNativeWindow()->GetRootWindow() !=
|
| + target_root) {
|
| + phantom_widget_in_target_root_ =
|
| + CreatePhantomWidget(target_root, start_bounds_in_screen);
|
| + }
|
| + AnimateToBounds(phantom_widget_in_target_root_.get(),
|
| + target_bounds_in_screen_);
|
| +
|
| + // Create a secondary widget in a second screen if |start_bounds_in_screen|
|
| + // lies at least partially in another screen. This allows animations to start
|
| + // or restart in one root window and progress to another root.
|
| + aura::Window* start_root = wm::GetRootWindowMatching(start_bounds_in_screen);
|
| + if (start_root == target_root) {
|
| + aura::Window::Windows root_windows = Shell::GetAllRootWindows();
|
| + for (size_t i = 0; i < root_windows.size(); ++i) {
|
| + if (root_windows[i] != target_root &&
|
| + root_windows[i]->GetBoundsInScreen().Intersects(
|
| + start_bounds_in_screen)) {
|
| + start_root = root_windows[i];
|
| + break;
|
| }
|
| }
|
| - if (start_root == target_root) {
|
| - phantom_widget_in_start_root_.reset();
|
| - } else {
|
| - if (!phantom_widget_in_start_root_ ||
|
| - phantom_widget_in_start_root_->GetNativeWindow()->GetRootWindow() !=
|
| - start_root) {
|
| - phantom_widget_in_start_root_ =
|
| - CreatePhantomWidget(start_root, start_bounds_in_screen);
|
| - }
|
| - AnimateToBounds(phantom_widget_in_start_root_.get(),
|
| - target_bounds_in_screen_);
|
| + }
|
| + if (start_root == target_root) {
|
| + phantom_widget_in_start_root_.reset();
|
| + } else {
|
| + if (!phantom_widget_in_start_root_ ||
|
| + phantom_widget_in_start_root_->GetNativeWindow()->GetRootWindow() !=
|
| + start_root) {
|
| + phantom_widget_in_start_root_ =
|
| + CreatePhantomWidget(start_root, start_bounds_in_screen);
|
| }
|
| + AnimateToBounds(phantom_widget_in_start_root_.get(),
|
| + target_bounds_in_screen_);
|
| }
|
| }
|
|
|
|
|