Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(863)

Side by Side Diff: ash/wm/window_animations.cc

Issue 10837211: Draw web content area correctly on a phantom window for window dragging (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: remove WindowPainter Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | ash/wm/window_util.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/wm/window_animations.h" 5 #include "ash/wm/window_animations.h"
6 6
7 #include <math.h> 7 #include <math.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <vector> 10 #include <vector>
11 11
12 #include "ash/ash_switches.h" 12 #include "ash/ash_switches.h"
13 #include "ash/launcher/launcher.h" 13 #include "ash/launcher/launcher.h"
14 #include "ash/screen_ash.h" 14 #include "ash/screen_ash.h"
15 #include "ash/shell.h" 15 #include "ash/shell.h"
16 #include "ash/wm/window_util.h"
16 #include "base/command_line.h" 17 #include "base/command_line.h"
17 #include "base/compiler_specific.h" 18 #include "base/compiler_specific.h"
18 #include "base/logging.h" 19 #include "base/logging.h"
19 #include "base/message_loop.h" 20 #include "base/message_loop.h"
20 #include "base/stl_util.h" 21 #include "base/stl_util.h"
21 #include "base/time.h" 22 #include "base/time.h"
22 #include "ui/aura/client/aura_constants.h" 23 #include "ui/aura/client/aura_constants.h"
23 #include "ui/aura/window.h" 24 #include "ui/aura/window.h"
24 #include "ui/aura/window_observer.h" 25 #include "ui/aura/window_observer.h"
25 #include "ui/aura/window_property.h" 26 #include "ui/aura/window_property.h"
(...skipping 583 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 return true; 610 return true;
610 case WINDOW_VISIBILITY_ANIMATION_TYPE_BRIGHTNESS_GRAYSCALE: 611 case WINDOW_VISIBILITY_ANIMATION_TYPE_BRIGHTNESS_GRAYSCALE:
611 AnimateHideWindow_BrightnessGrayscale(window); 612 AnimateHideWindow_BrightnessGrayscale(window);
612 return true; 613 return true;
613 default: 614 default:
614 NOTREACHED(); 615 NOTREACHED();
615 return false; 616 return false;
616 } 617 }
617 } 618 }
618 619
619 // Recreates a fresh layer for |window| and all its child windows. Does not
620 // recreate shadows or other non-window layers. Returns the old layer and its
621 // children, maintaining the hierarchy.
622 Layer* RecreateWindowLayers(Window* window) {
623 Layer* old_layer = window->RecreateLayer();
624 DCHECK(old_layer);
625 for (Window::Windows::const_iterator it = window->children().begin();
626 it != window->children().end();
627 ++it) {
628 aura::Window* child = *it;
629 Layer* old_child_layer = RecreateWindowLayers(child);
630 // Maintain the hierarchy of the detached layers.
631 old_layer->Add(old_child_layer);
632 }
633 return old_layer;
634 }
635
636 // Deletes |layer| and all its child layers.
637 void DeepDelete(Layer* layer) {
638 std::vector<Layer*> children = layer->children();
639 for (std::vector<Layer*>::const_iterator it = children.begin();
640 it != children.end();
641 ++it) {
642 Layer* child = *it;
643 DeepDelete(child);
644 }
645 delete layer;
646 }
647
648 // Observer for a window cross-fade animation. If either the window closes or 620 // Observer for a window cross-fade animation. If either the window closes or
649 // the layer's animation completes or compositing is aborted due to GPU crash, 621 // the layer's animation completes or compositing is aborted due to GPU crash,
650 // it deletes the layer and removes itself as an observer. 622 // it deletes the layer and removes itself as an observer.
651 class CrossFadeObserver : public ui::CompositorObserver, 623 class CrossFadeObserver : public ui::CompositorObserver,
652 public aura::WindowObserver, 624 public aura::WindowObserver,
653 public ui::ImplicitAnimationObserver { 625 public ui::ImplicitAnimationObserver {
654 public: 626 public:
655 // Observes |window| for destruction, but does not take ownership. 627 // Observes |window| for destruction, but does not take ownership.
656 // Takes ownership of |layer| and its child layers. 628 // Takes ownership of |layer| and its child layers.
657 CrossFadeObserver(Window* window, Layer* layer) 629 CrossFadeObserver(Window* window, Layer* layer)
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
703 private: 675 private:
704 // Can be called multiple times if the window is closed or the compositor 676 // Can be called multiple times if the window is closed or the compositor
705 // fails in the middle of the animation. 677 // fails in the middle of the animation.
706 void Cleanup() { 678 void Cleanup() {
707 if (window_) { 679 if (window_) {
708 window_->RemoveObserver(this); 680 window_->RemoveObserver(this);
709 window_ = NULL; 681 window_ = NULL;
710 } 682 }
711 if (layer_) { 683 if (layer_) {
712 layer_->GetCompositor()->RemoveObserver(this); 684 layer_->GetCompositor()->RemoveObserver(this);
713 DeepDelete(layer_); 685 wm::DeepDeleteLayers(layer_);
714 layer_ = NULL; 686 layer_ = NULL;
715 } 687 }
716 } 688 }
717 689
718 Window* window_; // not owned 690 Window* window_; // not owned
719 Layer* layer_; // owned 691 Layer* layer_; // owned
720 692
721 DISALLOW_COPY_AND_ASSIGN(CrossFadeObserver); 693 DISALLOW_COPY_AND_ASSIGN(CrossFadeObserver);
722 }; 694 };
723 695
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
761 return new internal::HidingWindowAnimationObserver(window); 733 return new internal::HidingWindowAnimationObserver(window);
762 } 734 }
763 735
764 void CrossFadeToBounds(aura::Window* window, const gfx::Rect& new_bounds) { 736 void CrossFadeToBounds(aura::Window* window, const gfx::Rect& new_bounds) {
765 DCHECK(window->TargetVisibility()); 737 DCHECK(window->TargetVisibility());
766 gfx::Rect old_bounds = window->bounds(); 738 gfx::Rect old_bounds = window->bounds();
767 739
768 // Create fresh layers for the window and all its children to paint into. 740 // Create fresh layers for the window and all its children to paint into.
769 // Takes ownership of the old layer and all its children, which will be 741 // Takes ownership of the old layer and all its children, which will be
770 // cleaned up after the animation completes. 742 // cleaned up after the animation completes.
771 ui::Layer* old_layer = internal::RecreateWindowLayers(window); 743 ui::Layer* old_layer = wm::RecreateWindowLayers(window);
772 ui::Layer* new_layer = window->layer(); 744 ui::Layer* new_layer = window->layer();
773 745
774 // Ensure the higher-resolution layer is on top. 746 // Ensure the higher-resolution layer is on top.
775 bool old_on_top = (old_bounds.width() > new_bounds.width()); 747 bool old_on_top = (old_bounds.width() > new_bounds.width());
776 if (old_on_top) 748 if (old_on_top)
777 old_layer->parent()->StackBelow(new_layer, old_layer); 749 old_layer->parent()->StackBelow(new_layer, old_layer);
778 else 750 else
779 old_layer->parent()->StackAbove(new_layer, old_layer); 751 old_layer->parent()->StackAbove(new_layer, old_layer);
780 752
781 // Tween types for transform animations must match to keep the window edges 753 // Tween types for transform animations must match to keep the window edges
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
877 AnimateHideWindow(window); 849 AnimateHideWindow(window);
878 } 850 }
879 } 851 }
880 852
881 void SetDelayedOldLayerDeletionInCrossFadeForTest(bool value) { 853 void SetDelayedOldLayerDeletionInCrossFadeForTest(bool value) {
882 delayed_old_layer_deletion_in_cross_fade_for_test_ = value; 854 delayed_old_layer_deletion_in_cross_fade_for_test_ = value;
883 } 855 }
884 856
885 } // namespace internal 857 } // namespace internal
886 } // namespace ash 858 } // namespace ash
OLDNEW
« no previous file with comments | « no previous file | ash/wm/window_util.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698