Index: ash/wm/window_animations.cc |
diff --git a/ash/wm/window_animations.cc b/ash/wm/window_animations.cc |
index 96ecddc2a808f17f752d75422e44f35ceb5b47b9..deba7c46416a686b890607a6e2b76755b4412bc6 100644 |
--- a/ash/wm/window_animations.cc |
+++ b/ash/wm/window_animations.cc |
@@ -15,6 +15,7 @@ |
#include "ash/shell.h" |
#include "ash/wm/window_util.h" |
#include "ash/wm/workspace_controller.h" |
+#include "ash/wm/workspace/workspace_animations.h" |
#include "base/command_line.h" |
#include "base/compiler_specific.h" |
#include "base/logging.h" |
@@ -50,7 +51,7 @@ namespace internal { |
namespace { |
const float kWindowAnimation_Vertical_TranslateY = 15.f; |
-} |
+} // namespace |
DEFINE_WINDOW_PROPERTY_KEY(WindowVisibilityAnimationType, |
kWindowVisibilityAnimationTypeKey, |
@@ -69,7 +70,7 @@ const int kDefaultAnimationDurationForMenuMS = 150; |
const int kLayerAnimationsForMinimizeDurationMS = 200; |
// Durations for the cross-fade animation, in milliseconds. |
-const float kCrossFadeDurationMinMs = 100.f; |
+const float kCrossFadeDurationMinMs = 200.f; |
const float kCrossFadeDurationMaxMs = 400.f; |
// Durations for the brightness/grayscale fade animation, in milliseconds. |
@@ -89,6 +90,9 @@ const float kWindowAnimation_MinimizeRotate = 0.f; |
// Amount windows are scaled during workspace animations. |
const float kWorkspaceScale = .95f; |
+// Tween type when cross fading a workspace window. |
+const ui::Tween::Type kCrossFadeTweenType = ui::Tween::EASE_IN_OUT; |
+ |
int64 Round64(float f) { |
return static_cast<int64>(f + 0.5f); |
} |
@@ -585,8 +589,8 @@ bool AnimateShowWindow(aura::Window* window) { |
AnimateShowWindow_Minimize(window); |
return true; |
case WINDOW_VISIBILITY_ANIMATION_TYPE_BRIGHTNESS_GRAYSCALE: |
- AnimateShowWindow_BrightnessGrayscale(window); |
- return true; |
+ AnimateShowWindow_BrightnessGrayscale(window); |
+ return true; |
default: |
NOTREACHED(); |
return false; |
@@ -682,52 +686,6 @@ class CrossFadeObserver : public ui::CompositorObserver, |
namespace { |
-// Scales for workspaces above/below current workspace. |
-const float kWorkspaceScaleAbove = 1.1f; |
-const float kWorkspaceScaleBelow = .9f; |
- |
-// Amount of time to pause before animating anything. Only used during initial |
-// animation (when logging in). |
-const int kWorkspaceInitialPauseTimeMS = 750; |
- |
-// TODO: leaving in for now since Nicholas wants to play with this, remove if we |
-// leave it at 0. |
-const int kPauseTimeMS = 0; |
- |
-} // namespace |
- |
-// Amount of time for animating a workspace in or out. |
-const int kWorkspaceSwitchTimeMS = 200 + kPauseTimeMS; |
- |
-namespace { |
- |
-// Brightness for the non-active workspace. |
-// TODO(sky): ideally this would be -.33f, but it slows down animations by a |
-// factor of 2. Figure out why. |
-const float kWorkspaceBrightness = 0.0f; |
- |
-enum WorkspaceScaleType { |
- WORKSPACE_SCALE_ABOVE, |
- WORKSPACE_SCALE_BELOW, |
-}; |
- |
-// Used to identify what should animate in AnimateWorkspaceIn/Out. |
-enum WorkspaceAnimateTypes { |
- WORKSPACE_ANIMATE_OPACITY = 1 << 0, |
- WORKSPACE_ANIMATE_BRIGHTNESS = 1 << 1, |
-}; |
- |
-void ApplyWorkspaceScale(ui::Layer* layer, WorkspaceScaleType type) { |
- const float scale = type == WORKSPACE_SCALE_ABOVE ? kWorkspaceScaleAbove : |
- kWorkspaceScaleBelow; |
- ui::Transform transform; |
- transform.ConcatScale(scale, scale); |
- transform.ConcatTranslate( |
- -layer->bounds().width() * (scale - 1.0f) / 2, |
- -layer->bounds().height() * (scale - 1.0f) / 2); |
- layer->SetTransform(transform); |
-} |
- |
// Implementation of cross fading. Window is the window being cross faded. It |
// should be at the target bounds. |old_layer| the previous layer from |window|. |
// This takes ownership of |old_layer| and deletes when the animation is done. |
@@ -735,8 +693,7 @@ void ApplyWorkspaceScale(ui::Layer* layer, WorkspaceScaleType type) { |
// animating. Returns the duration of the fade. |
TimeDelta CrossFadeImpl(aura::Window* window, |
ui::Layer* old_layer, |
- ui::Tween::Type tween_type, |
- base::TimeDelta pause_duration) { |
+ ui::Tween::Type tween_type) { |
const gfx::Rect old_bounds(old_layer->bounds()); |
const gfx::Rect new_bounds(window->bounds()); |
const bool old_on_top = (old_bounds.width() > new_bounds.width()); |
@@ -748,10 +705,6 @@ TimeDelta CrossFadeImpl(aura::Window* window, |
{ |
old_layer->GetAnimator()->StopAnimating(); |
ui::ScopedLayerAnimationSettings settings(old_layer->GetAnimator()); |
- settings.SetPreemptionStrategy(ui::LayerAnimator::ENQUEUE_NEW_ANIMATION); |
- old_layer->GetAnimator()->SchedulePauseForProperties( |
- pause_duration, ui::LayerAnimationElement::TRANSFORM, |
- ui::LayerAnimationElement::OPACITY, -1); |
// Animation observer owns the old layer and deletes itself. |
settings.AddObserver(new internal::CrossFadeObserver(window, old_layer)); |
@@ -795,10 +748,6 @@ TimeDelta CrossFadeImpl(aura::Window* window, |
// Animate the new layer to the identity transform, so the window goes to |
// its newly set bounds. |
ui::ScopedLayerAnimationSettings settings(window->layer()->GetAnimator()); |
- settings.SetPreemptionStrategy(ui::LayerAnimator::ENQUEUE_NEW_ANIMATION); |
- window->layer()->GetAnimator()->SchedulePauseForProperties( |
- pause_duration, ui::LayerAnimationElement::TRANSFORM, |
- ui::LayerAnimationElement::OPACITY, -1); |
settings.SetTransitionDuration(duration); |
settings.SetTweenType(tween_type); |
window->layer()->SetTransform(ui::Transform()); |
@@ -810,119 +759,6 @@ TimeDelta CrossFadeImpl(aura::Window* window, |
return duration; |
} |
-// Returns a TimeDelta from |time_ms|. If animations are disabled this returns |
-// a TimeDelta of 0 (so the animation completes immediately). |
-base::TimeDelta AdjustAnimationTime(int time_ms) { |
- if (CommandLine::ForCurrentProcess()->HasSwitch( |
- ash::switches::kAshWindowAnimationsDisabled)) |
- time_ms = 0; |
- return base::TimeDelta::FromMilliseconds(time_ms); |
-} |
- |
-// Returns a TimeDelta adjusted for animations. If animations are disabled this |
-// returns 0. If animations are not disabled and |time_delta| is non-empty, it |
-// is returned. Otherwise |delta_time_ms| is returned. |
-base::TimeDelta AdjustAnimationTimeDelta(base::TimeDelta time_delta, |
- int delta_time_ms) { |
- if (CommandLine::ForCurrentProcess()->HasSwitch( |
- ash::switches::kAshWindowAnimationsDisabled)) |
- return base::TimeDelta(); |
- return time_delta == base::TimeDelta() ? |
- base::TimeDelta::FromMilliseconds(delta_time_ms) : time_delta; |
-} |
- |
-void AnimateWorkspaceInImpl(aura::Window* window, |
- WorkspaceAnimationDirection direction, |
- uint32 animate_types, |
- int pause_time_ms, |
- ui::Tween::Type tween_type, |
- base::TimeDelta duration) { |
- window->layer()->SetOpacity( |
- (animate_types & WORKSPACE_ANIMATE_OPACITY) ? 0.0f : 1.0f); |
- window->layer()->SetLayerBrightness( |
- (animate_types & WORKSPACE_ANIMATE_BRIGHTNESS) ? |
- kWorkspaceBrightness : 0.0f); |
- window->Show(); |
- ApplyWorkspaceScale(window->layer(), |
- direction == WORKSPACE_ANIMATE_UP ? |
- WORKSPACE_SCALE_BELOW : WORKSPACE_SCALE_ABOVE); |
- window->layer()->GetAnimator()->StopAnimating(); |
- |
- { |
- ui::ScopedLayerAnimationSettings settings(window->layer()->GetAnimator()); |
- |
- if (pause_time_ms > 0) { |
- settings.SetPreemptionStrategy(ui::LayerAnimator::ENQUEUE_NEW_ANIMATION); |
- window->layer()->GetAnimator()->SchedulePauseForProperties( |
- AdjustAnimationTime(pause_time_ms), |
- ui::LayerAnimationElement::TRANSFORM, |
- ui::LayerAnimationElement::OPACITY, |
- ui::LayerAnimationElement::BRIGHTNESS, |
- ui::LayerAnimationElement::VISIBILITY, |
- -1); |
- } |
- |
- settings.SetTweenType(tween_type); |
- settings.SetTransitionDuration(duration); |
- window->layer()->SetTransform(ui::Transform()); |
- window->layer()->SetOpacity(1.0f); |
- window->layer()->SetLayerBrightness(0.0f); |
- } |
-} |
- |
-void AnimateWorkspaceOutImpl(aura::Window* window, |
- WorkspaceAnimationDirection direction, |
- uint32 animate_types, |
- int pause_time_ms, |
- ui::Tween::Type tween_type, |
- TimeDelta duration) { |
- window->Show(); |
- window->layer()->SetTransform(ui::Transform()); |
- window->layer()->SetLayerBrightness(0.0f); |
- window->layer()->SetOpacity(1.0f); |
- window->layer()->GetAnimator()->StopAnimating(); |
- |
- { |
- ui::ScopedLayerAnimationSettings settings(window->layer()->GetAnimator()); |
- |
- if (pause_time_ms > 0) { |
- settings.SetPreemptionStrategy(ui::LayerAnimator::ENQUEUE_NEW_ANIMATION); |
- window->layer()->GetAnimator()->SchedulePauseForProperties( |
- AdjustAnimationTime(pause_time_ms), |
- ui::LayerAnimationElement::TRANSFORM, |
- ui::LayerAnimationElement::OPACITY, |
- ui::LayerAnimationElement::BRIGHTNESS, |
- ui::LayerAnimationElement::VISIBILITY, |
- -1); |
- } |
- |
- settings.SetTransitionDuration(duration); |
- settings.SetTweenType(tween_type); |
- ApplyWorkspaceScale(window->layer(), |
- direction == WORKSPACE_ANIMATE_UP ? |
- WORKSPACE_SCALE_ABOVE : WORKSPACE_SCALE_BELOW); |
- // NOTE: Hide() must be before SetOpacity(), else |
- // VisibilityController::UpdateLayerVisibility doesn't pass the false to the |
- // layer so that the layer and window end up out of sync and confused. |
- window->Hide(); |
- if (animate_types & WORKSPACE_ANIMATE_OPACITY) |
- window->layer()->SetOpacity(0.0f); |
- if (animate_types & WORKSPACE_ANIMATE_BRIGHTNESS) |
- window->layer()->SetLayerBrightness(kWorkspaceBrightness); |
- |
- // After the animation completes snap the transform back to the identity, |
- // otherwise any one that asks for screen bounds gets a slightly scaled |
- // version. |
- settings.SetPreemptionStrategy(ui::LayerAnimator::ENQUEUE_NEW_ANIMATION); |
- settings.SetTransitionDuration(base::TimeDelta()); |
- window->layer()->SetTransform(ui::Transform()); |
- } |
-} |
- |
-ui::Tween::Type TweenTypeForWorskpaceOut(WorkspaceType type) { |
- return WORKSPACE_DESKTOP ? ui::Tween::LINEAR : ui::Tween::EASE_OUT; |
-} |
- |
} // namespace |
//////////////////////////////////////////////////////////////////////////////// |
@@ -982,146 +818,21 @@ void CrossFadeToBounds(aura::Window* window, const gfx::Rect& new_bounds) { |
else |
old_layer->parent()->StackAbove(new_layer, old_layer); |
- CrossFadeImpl(window, old_layer, ui::Tween::EASE_OUT, base::TimeDelta()); |
+ CrossFadeImpl(window, old_layer, ui::Tween::EASE_OUT); |
} |
-void CrossFadeWindowBetweenWorkspaces(aura::Window* old_workspace, |
- aura::Window* new_workspace, |
+void CrossFadeWindowBetweenWorkspaces(aura::Window* new_workspace, |
aura::Window* window, |
ui::Layer* old_layer) { |
ui::Layer* layer_parent = new_workspace->layer()->parent(); |
layer_parent->Add(old_layer); |
const bool restoring = old_layer->bounds().width() > window->bounds().width(); |
- ui::Tween::Type tween_type, workspace_tween_type; |
- if (restoring) { |
+ if (restoring) |
layer_parent->StackAbove(old_layer, new_workspace->layer()); |
- tween_type = ui::Tween::EASE_OUT; |
- workspace_tween_type = ui::Tween::EASE_OUT; |
- } else { |
+ else |
layer_parent->StackBelow(old_layer, new_workspace->layer()); |
- tween_type = ui::Tween::EASE_IN_2; |
- workspace_tween_type = ui::Tween::LINEAR; |
- } |
- |
- const TimeDelta duration = |
- CrossFadeImpl(window, old_layer, tween_type, |
- AdjustAnimationTime(restoring ? 0 : kPauseTimeMS)); |
- |
- if (restoring) { |
- typedef aura::Window::Windows Windows; |
- if (old_workspace) |
- AnimateWorkspaceOutImpl(old_workspace, WORKSPACE_ANIMATE_UP, |
- WORKSPACE_ANIMATE_BRIGHTNESS, |
- 0, workspace_tween_type, duration); |
- |
- // Ideally we would use AnimateWorkspaceIn() for |new_workspace|, but that |
- // results in |window| animating with the workspace scale. We don't want |
- // that, so we explicitly animate each of the children to give the effect of |
- // the workspace scaling. |
- new_workspace->Show(); |
- new_workspace->SetTransform(ui::Transform()); |
- new_workspace->layer()->SetOpacity(1.0f); |
- new_workspace->layer()->SetLayerBrightness(0.0f); |
- const Windows& children(new_workspace->children()); |
- for (Windows::const_iterator i = children.begin(); i != children.end(); |
- ++i) { |
- aura::Window* child = *i; |
- if (child == window) |
- continue; |
- child->SetTransform(ash::internal::BuildWorkspaceSwitchTransform( |
- child, kWorkspaceScaleBelow)); |
- child->layer()->SetLayerBrightness(kWorkspaceBrightness); |
- ui::ScopedLayerAnimationSettings settings(child->layer()->GetAnimator()); |
- settings.SetTweenType(ui::Tween::EASE_OUT); |
- settings.SetTransitionDuration(duration); |
- child->SetTransform(ui::Transform()); |
- child->layer()->SetLayerBrightness(0.0f); |
- } |
- } else { |
- if (old_workspace) { |
- AnimateWorkspaceOutImpl(old_workspace, WORKSPACE_ANIMATE_DOWN, |
- WORKSPACE_ANIMATE_BRIGHTNESS, |
- 0, workspace_tween_type, duration); |
- } |
- |
- new_workspace->Show(); |
- new_workspace->layer()->SetOpacity(1.f); |
- new_workspace->layer()->SetTransform(ui::Transform()); |
- new_workspace->layer()->SetLayerBrightness(0.0f); |
- } |
-} |
- |
-void AnimateBetweenWorkspaces(aura::Window* old_window, |
- WorkspaceType old_type, |
- bool animate_old, |
- aura::Window* new_window, |
- WorkspaceType new_type, |
- bool is_restoring_maximized_window) { |
- uint32 common_animate_types = 0; |
- if (animate_old) { |
- // When switching to the desktop the old window lifts off. |
- uint32 animate_types = 0; |
- if (!(new_type == WORKSPACE_MAXIMIZED && old_type == WORKSPACE_MAXIMIZED)) |
- animate_types |= WORKSPACE_ANIMATE_BRIGHTNESS; |
- if ((new_type == WORKSPACE_DESKTOP || old_type == WORKSPACE_MAXIMIZED) && |
- !is_restoring_maximized_window) |
- animate_types |= WORKSPACE_ANIMATE_OPACITY; |
- AnimateWorkspaceOutImpl( |
- old_window, |
- new_type == WORKSPACE_DESKTOP ? WORKSPACE_ANIMATE_UP : |
- WORKSPACE_ANIMATE_DOWN, |
- animate_types, |
- 0, |
- TweenTypeForWorskpaceOut(old_type), |
- AdjustAnimationTime(kWorkspaceSwitchTimeMS)); |
- } |
- |
- // Switching from the desktop to a maximized animates down. |
- uint32 animate_types = common_animate_types; |
- if (!(new_type == WORKSPACE_MAXIMIZED && old_type == WORKSPACE_MAXIMIZED) && |
- !is_restoring_maximized_window) |
- animate_types |= WORKSPACE_ANIMATE_BRIGHTNESS; |
- if (old_type == WORKSPACE_DESKTOP) |
- animate_types |= WORKSPACE_ANIMATE_OPACITY; |
- AnimateWorkspaceInImpl( |
- new_window, |
- old_type == WORKSPACE_DESKTOP ? |
- WORKSPACE_ANIMATE_DOWN : WORKSPACE_ANIMATE_UP, |
- animate_types, |
- 0, |
- ui::Tween::EASE_OUT, |
- AdjustAnimationTime(kWorkspaceSwitchTimeMS)); |
-} |
- |
-void AnimateWorkspaceIn(aura::Window* window, |
- WorkspaceAnimationDirection direction, |
- bool initial_animate, |
- base::TimeDelta delta) { |
- AnimateWorkspaceInImpl( |
- window, direction, |
- WORKSPACE_ANIMATE_BRIGHTNESS | |
- (initial_animate ? WORKSPACE_ANIMATE_OPACITY : 0), |
- initial_animate ? kWorkspaceInitialPauseTimeMS : 0, |
- ui::Tween::EASE_OUT, |
- AdjustAnimationTimeDelta(delta, kWorkspaceSwitchTimeMS)); |
-} |
- |
-void AnimateWorkspaceOut(aura::Window* window, |
- WorkspaceAnimationDirection direction, |
- WorkspaceType type, |
- bool initial_animate, |
- base::TimeDelta delta) { |
- AnimateWorkspaceOutImpl(window, direction, WORKSPACE_ANIMATE_BRIGHTNESS, |
- initial_animate ? kWorkspaceInitialPauseTimeMS : 0, |
- TweenTypeForWorskpaceOut(type), |
- AdjustAnimationTimeDelta(delta, |
- kWorkspaceSwitchTimeMS)); |
-} |
-base::TimeDelta GetSystemBackgroundDestroyDuration() { |
- return base::TimeDelta::FromMilliseconds( |
- std::max(static_cast<int>(internal::kCrossFadeDurationMaxMs), |
- kWorkspaceSwitchTimeMS)); |
+ CrossFadeImpl(window, old_layer, internal::kCrossFadeTweenType); |
} |
TimeDelta GetCrossFadeDuration(const gfx::Rect& old_bounds, |
@@ -1131,7 +842,7 @@ TimeDelta GetCrossFadeDuration(const gfx::Rect& old_bounds, |
return base::TimeDelta(); |
const int min_time_ms = internal::WorkspaceController::IsWorkspace2Enabled() ? |
- kWorkspaceSwitchTimeMS : 0; |
+ internal::kWorkspaceSwitchTimeMS : 0; |
int old_area = old_bounds.width() * old_bounds.height(); |
int new_area = new_bounds.width() * new_bounds.height(); |
int max_area = std::max(old_area, new_area); |