| Index: ash/wm/overview/window_selector_window.cc
|
| diff --git a/ash/wm/overview/window_selector_window.cc b/ash/wm/overview/window_selector_window.cc
|
| index 226c782462273c8d71e05f3ce55544006683cd3f..bf5840e32044397651665293373e218024be1093 100644
|
| --- a/ash/wm/overview/window_selector_window.cc
|
| +++ b/ash/wm/overview/window_selector_window.cc
|
| @@ -4,239 +4,52 @@
|
|
|
| #include "ash/wm/overview/window_selector_window.h"
|
|
|
| -#include "ash/shell.h"
|
| -#include "ui/aura/client/aura_constants.h"
|
| -#include "ui/aura/client/screen_position_client.h"
|
| -#include "ui/aura/root_window.h"
|
| #include "ui/aura/window.h"
|
| -#include "ui/compositor/layer_animation_observer.h"
|
| -#include "ui/compositor/scoped_layer_animation_settings.h"
|
| -#include "ui/gfx/display.h"
|
| -#include "ui/gfx/interpolated_transform.h"
|
| -#include "ui/gfx/transform_util.h"
|
| -#include "ui/views/corewm/shadow_types.h"
|
| -#include "ui/views/corewm/window_animations.h"
|
| -#include "ui/views/corewm/window_util.h"
|
| -#include "ui/views/widget/widget.h"
|
|
|
| namespace ash {
|
|
|
| -namespace {
|
| -
|
| -const int kOverviewWindowTransitionMilliseconds = 100;
|
| -
|
| -// Creates a copy of |window| with |recreated_layer| in the |target_root|.
|
| -views::Widget* CreateCopyOfWindow(aura::RootWindow* target_root,
|
| - aura::Window* src_window,
|
| - ui::Layer* recreated_layer) {
|
| - views::Widget* widget = new views::Widget;
|
| - views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP);
|
| - params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
|
| - params.parent = src_window->parent();
|
| - params.can_activate = false;
|
| - params.keep_on_top = true;
|
| - widget->set_focus_on_creation(false);
|
| - widget->Init(params);
|
| - widget->SetVisibilityChangedAnimationsEnabled(false);
|
| - std::string name = src_window->name() + " (Copy)";
|
| - widget->GetNativeWindow()->SetName(name);
|
| - views::corewm::SetShadowType(widget->GetNativeWindow(),
|
| - views::corewm::SHADOW_TYPE_RECTANGULAR);
|
| -
|
| - // Set the bounds in the target root window.
|
| - gfx::Display target_display =
|
| - Shell::GetScreen()->GetDisplayNearestWindow(target_root);
|
| - aura::client::ScreenPositionClient* screen_position_client =
|
| - aura::client::GetScreenPositionClient(src_window->GetRootWindow());
|
| - if (screen_position_client && target_display.is_valid()) {
|
| - screen_position_client->SetBounds(widget->GetNativeWindow(),
|
| - src_window->GetBoundsInScreen(), target_display);
|
| - } else {
|
| - widget->SetBounds(src_window->GetBoundsInScreen());
|
| - }
|
| - widget->StackAbove(src_window);
|
| -
|
| - // Move the |recreated_layer| to the newly created window.
|
| - recreated_layer->set_delegate(src_window->layer()->delegate());
|
| - gfx::Rect layer_bounds = recreated_layer->bounds();
|
| - layer_bounds.set_origin(gfx::Point(0, 0));
|
| - recreated_layer->SetBounds(layer_bounds);
|
| - recreated_layer->SetVisible(false);
|
| - recreated_layer->parent()->Remove(recreated_layer);
|
| -
|
| - aura::Window* window = widget->GetNativeWindow();
|
| - recreated_layer->SetVisible(true);
|
| - window->layer()->Add(recreated_layer);
|
| - window->layer()->StackAtTop(recreated_layer);
|
| - window->layer()->SetOpacity(1);
|
| - window->Show();
|
| - return widget;
|
| -}
|
| -
|
| -// An observer which closes the widget and deletes the layer after an
|
| -// animation finishes.
|
| -class CleanupWidgetAfterAnimationObserver : public ui::LayerAnimationObserver {
|
| - public:
|
| - CleanupWidgetAfterAnimationObserver(views::Widget* widget, ui::Layer* layer);
|
| -
|
| - virtual void OnLayerAnimationEnded(
|
| - ui::LayerAnimationSequence* sequence) OVERRIDE;
|
| - virtual void OnLayerAnimationAborted(
|
| - ui::LayerAnimationSequence* sequence) OVERRIDE;
|
| - virtual void OnLayerAnimationScheduled(
|
| - ui::LayerAnimationSequence* sequence) OVERRIDE;
|
| -
|
| - protected:
|
| - virtual ~CleanupWidgetAfterAnimationObserver();
|
| -
|
| - private:
|
| - views::Widget* widget_;
|
| - ui::Layer* layer_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(CleanupWidgetAfterAnimationObserver);
|
| -};
|
| -
|
| -CleanupWidgetAfterAnimationObserver::CleanupWidgetAfterAnimationObserver(
|
| - views::Widget* widget,
|
| - ui::Layer* layer)
|
| - : widget_(widget),
|
| - layer_(layer) {
|
| - widget_->GetNativeWindow()->layer()->GetAnimator()->AddObserver(this);
|
| -}
|
| -
|
| -void CleanupWidgetAfterAnimationObserver::OnLayerAnimationEnded(
|
| - ui::LayerAnimationSequence* sequence) {
|
| - delete this;
|
| +WindowSelectorWindow::WindowSelectorWindow(aura::Window* window)
|
| + : transform_window_(window) {
|
| }
|
|
|
| -void CleanupWidgetAfterAnimationObserver::OnLayerAnimationAborted(
|
| - ui::LayerAnimationSequence* sequence) {
|
| - delete this;
|
| +WindowSelectorWindow::~WindowSelectorWindow() {
|
| }
|
|
|
| -void CleanupWidgetAfterAnimationObserver::OnLayerAnimationScheduled(
|
| - ui::LayerAnimationSequence* sequence) {
|
| +const aura::RootWindow* WindowSelectorWindow::GetRootWindow() const {
|
| + return transform_window_.window()->GetRootWindow();
|
| }
|
|
|
| -CleanupWidgetAfterAnimationObserver::~CleanupWidgetAfterAnimationObserver() {
|
| - widget_->GetNativeWindow()->layer()->GetAnimator()->RemoveObserver(this);
|
| - widget_->Close();
|
| - widget_ = NULL;
|
| - if (layer_) {
|
| - views::corewm::DeepDeleteLayers(layer_);
|
| - layer_ = NULL;
|
| - }
|
| +aura::Window* WindowSelectorWindow::TargetedWindow(
|
| + const aura::Window* target) const {
|
| + if (transform_window_.Contains(target))
|
| + return transform_window_.window();
|
| + return NULL;
|
| }
|
|
|
| -// The animation settings used for window selector animations.
|
| -class WindowSelectorAnimationSettings
|
| - : public ui::ScopedLayerAnimationSettings {
|
| - public:
|
| - WindowSelectorAnimationSettings(aura::Window* window) :
|
| - ui::ScopedLayerAnimationSettings(window->layer()->GetAnimator()) {
|
| - SetPreemptionStrategy(
|
| - ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
|
| - SetTransitionDuration(base::TimeDelta::FromMilliseconds(
|
| - kOverviewWindowTransitionMilliseconds));
|
| - }
|
| -
|
| - virtual ~WindowSelectorAnimationSettings() {
|
| - }
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -WindowSelectorWindow::WindowSelectorWindow(aura::Window* window)
|
| - : window_(window),
|
| - window_copy_(NULL),
|
| - layer_(NULL),
|
| - minimized_(window->GetProperty(aura::client::kShowStateKey) ==
|
| - ui::SHOW_STATE_MINIMIZED),
|
| - original_transform_(window->layer()->GetTargetTransform()) {
|
| -}
|
| -
|
| -WindowSelectorWindow::~WindowSelectorWindow() {
|
| - if (window_) {
|
| - WindowSelectorAnimationSettings animation_settings(window_);
|
| - gfx::Transform transform;
|
| - window_->SetTransform(original_transform_);
|
| - if (minimized_ && window_->GetProperty(aura::client::kShowStateKey) !=
|
| - ui::SHOW_STATE_MINIMIZED) {
|
| - // Setting opacity 0 and visible false ensures that the property change
|
| - // to SHOW_STATE_MINIMIZED will not animate the window from its original
|
| - // bounds to the minimized position.
|
| - window_->layer()->SetOpacity(0);
|
| - window_->layer()->SetVisible(false);
|
| - window_->SetProperty(aura::client::kShowStateKey,
|
| - ui::SHOW_STATE_MINIMIZED);
|
| - }
|
| - }
|
| - // If a copy of the window was created, clean it up.
|
| - if (window_copy_) {
|
| - if (window_) {
|
| - // If the initial window wasn't destroyed, the copy needs to be animated
|
| - // out. CleanupWidgetAfterAnimationObserver will destroy the widget and
|
| - // layer after the animation is complete.
|
| - new CleanupWidgetAfterAnimationObserver(window_copy_, layer_);
|
| - WindowSelectorAnimationSettings animation_settings(
|
| - window_copy_->GetNativeWindow());
|
| - window_copy_->GetNativeWindow()->SetTransform(original_transform_);
|
| - } else {
|
| - window_copy_->Close();
|
| - if (layer_)
|
| - views::corewm::DeepDeleteLayers(layer_);
|
| - }
|
| - window_copy_ = NULL;
|
| - layer_ = NULL;
|
| - }
|
| +void WindowSelectorWindow::RestoreWindowOnExit(aura::Window* window) {
|
| + transform_window_.RestoreWindowOnExit();
|
| }
|
|
|
| -bool WindowSelectorWindow::Contains(const aura::Window* window) const {
|
| - if (window_copy_ && window_copy_->GetNativeWindow()->Contains(window))
|
| - return true;
|
| - return window_->Contains(window);
|
| +aura::Window* WindowSelectorWindow::SelectionWindow() const {
|
| + return transform_window_.window();
|
| }
|
|
|
| -void WindowSelectorWindow::RestoreWindowOnExit() {
|
| - minimized_ = false;
|
| - original_transform_ = gfx::Transform();
|
| +void WindowSelectorWindow::RemoveWindow(const aura::Window* window) {
|
| + DCHECK_EQ(transform_window_.window(), window);
|
| + transform_window_.OnWindowDestroyed();
|
| }
|
|
|
| -void WindowSelectorWindow::OnWindowDestroyed() {
|
| - window_ = NULL;
|
| +bool WindowSelectorWindow::empty() const {
|
| + return transform_window_.window() == NULL;
|
| }
|
|
|
| -void WindowSelectorWindow::TransformToFitBounds(
|
| - aura::RootWindow* root_window,
|
| - const gfx::Rect& target_bounds) {
|
| - if (minimized_ && window_->GetProperty(aura::client::kShowStateKey) ==
|
| - ui::SHOW_STATE_MINIMIZED) {
|
| - window_->Show();
|
| - }
|
| - fit_bounds_ = target_bounds;
|
| - const gfx::Rect bounds = window_->GetBoundsInScreen();
|
| - float scale = std::min(1.0f,
|
| - std::min(static_cast<float>(target_bounds.width()) / bounds.width(),
|
| - static_cast<float>(target_bounds.height()) / bounds.height()));
|
| - gfx::Transform transform;
|
| - gfx::Vector2d offset(
|
| - 0.5 * (target_bounds.width() - scale * bounds.width()),
|
| - 0.5 * (target_bounds.height() - scale * bounds.height()));
|
| - transform.Translate(target_bounds.x() - bounds.x() + offset.x(),
|
| - target_bounds.y() - bounds.y() + offset.y());
|
| - transform.Scale(scale, scale);
|
| - if (root_window != window_->GetRootWindow()) {
|
| - if (!window_copy_) {
|
| - DCHECK(!layer_);
|
| - layer_ = views::corewm::RecreateWindowLayers(window_, true);
|
| - window_copy_ = CreateCopyOfWindow(root_window, window_, layer_);
|
| - }
|
| - WindowSelectorAnimationSettings animation_settings(
|
| - window_copy_->GetNativeWindow());
|
| - window_copy_->GetNativeWindow()->SetTransform(transform);
|
| - }
|
| - WindowSelectorAnimationSettings animation_settings(window_);
|
| - window_->SetTransform(transform);
|
| +void WindowSelectorWindow::SetBounds(aura::RootWindow* root_window,
|
| + const gfx::Rect& target_bounds) {
|
| + WindowSelectorItem::SetBounds(root_window, target_bounds);
|
| + gfx::Rect bounding_rect = transform_window_.window()->GetBoundsInScreen();
|
| + transform_window_.SetTransform(root_window,
|
| + ScopedTransformOverviewWindow::GetTransformForRectPreservingAspectRatio(
|
| + transform_window_.window()->GetBoundsInScreen(), target_bounds));
|
| }
|
|
|
| } // namespace ash
|
|
|