1d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// found in the LICENSE file.
4d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ash/wm/overview/window_selector_panels.h"
6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ash/screen_util.h"
8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ash/shell.h"
9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ash/shell_window_ids.h"
10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ash/wm/overview/scoped_transform_overview_window.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ash/wm/overview/transparent_activate_window_button.h"
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ash/wm/panels/panel_layout_manager.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ash/wm/window_util.h"
14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/aura/window.h"
15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/compositor/layer.h"
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/compositor/layer_animation_observer.h"
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/compositor/layer_animation_sequence.h"
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/controls/button/button.h"
19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace ash {
21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace {
23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// This class extends ScopedTransformOverviewMode to hide and show the callout
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// widget for a panel window when entering / leaving overview mode, as well as
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// to add a transparent button for each panel window.
27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class ScopedTransformPanelWindow : public ScopedTransformOverviewWindow {
28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public:
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  explicit ScopedTransformPanelWindow(aura::Window* window);
30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual ~ScopedTransformPanelWindow();
31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // ScopedTransformOverviewWindow overrides:
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void PrepareForOverview() OVERRIDE;
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void SetTransform(
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      aura::Window* root_window,
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const gfx::Transform& transform,
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      bool animate) OVERRIDE;
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private:
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Returns the panel window bounds after the transformation.
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Rect GetTransformedBounds();
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<TransparentActivateWindowButton> window_button_;
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScopedTransformPanelWindow);
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)};
48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)ScopedTransformPanelWindow::ScopedTransformPanelWindow(aura::Window* window)
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    : ScopedTransformOverviewWindow(window) {
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)ScopedTransformPanelWindow::~ScopedTransformPanelWindow() {
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void ScopedTransformPanelWindow::PrepareForOverview() {
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ScopedTransformOverviewWindow::PrepareForOverview();
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  window_button_.reset(new TransparentActivateWindowButton(window()));
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ScopedTransformPanelWindow::SetTransform(
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    aura::Window* root_window,
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const gfx::Transform& transform,
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    bool animate) {
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedTransformOverviewWindow::SetTransform(root_window, transform, animate);
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  window_button_->SetBounds(GetTransformedBounds());
67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Rect ScopedTransformPanelWindow::GetTransformedBounds() {
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::RectF bounds(ScreenUtil::ConvertRectToScreen(
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          window()->GetRootWindow(), window()->layer()->bounds()));
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Transform new_transform;
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  new_transform.Translate(bounds.x(),
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                          bounds.y());
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  new_transform.PreconcatTransform(window()->layer()->GetTargetTransform());
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  new_transform.Translate(-bounds.x(),
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                          -bounds.y());
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  new_transform.TransformRect(&bounds);
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return ToEnclosingRect(bounds);
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}  // namespace
83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)WindowSelectorPanels::WindowSelectorPanels(aura::Window* panels_root_window)
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    : panels_root_window_(panels_root_window) {
86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  static_cast<PanelLayoutManager*>(
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      Shell::GetContainer(panels_root_window_, kShellWindowId_PanelContainer)->
88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          layout_manager())->SetShowCalloutWidgets(false);
89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
91d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)WindowSelectorPanels::~WindowSelectorPanels() {
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  static_cast<PanelLayoutManager*>(
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      Shell::GetContainer(panels_root_window_, kShellWindowId_PanelContainer)->
94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          layout_manager())->SetShowCalloutWidgets(true);
95d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
96d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
97d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void WindowSelectorPanels::AddWindow(aura::Window* window) {
98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  DCHECK(window->GetRootWindow() == panels_root_window_);
99d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  transform_windows_.push_back(new ScopedTransformPanelWindow(window));
100d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)aura::Window* WindowSelectorPanels::GetRootWindow() {
103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return transform_windows_.front()->window()->GetRootWindow();
104d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool WindowSelectorPanels::HasSelectableWindow(const aura::Window* window) {
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (WindowList::const_iterator iter = transform_windows_.begin();
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       iter != transform_windows_.end(); ++iter) {
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if ((*iter)->window() == window)
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return true;
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return false;
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool WindowSelectorPanels::Contains(const aura::Window* target) {
116d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  for (WindowList::const_iterator iter = transform_windows_.begin();
117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)       iter != transform_windows_.end(); ++iter) {
118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if ((*iter)->Contains(target))
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return true;
120d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return false;
122d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void WindowSelectorPanels::RestoreWindowOnExit(aura::Window* window) {
125d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  for (WindowList::iterator iter = transform_windows_.begin();
126d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)       iter != transform_windows_.end(); ++iter) {
127d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if ((*iter)->Contains(window)) {
128d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      (*iter)->RestoreWindowOnExit();
129d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      break;
130d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
131d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
132d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
133d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
134d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)aura::Window* WindowSelectorPanels::SelectionWindow() {
135d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return transform_windows_.front()->window();
136d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
137d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
138d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void WindowSelectorPanels::RemoveWindow(const aura::Window* window) {
139d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  for (WindowList::iterator iter = transform_windows_.begin();
140d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)       iter != transform_windows_.end(); ++iter) {
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if ((*iter)->window() == window) {
142d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      (*iter)->OnWindowDestroyed();
143d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      transform_windows_.erase(iter);
144d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      break;
145d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
146d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  WindowSelectorItem::RemoveWindow(window);
148d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
149d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
150d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)bool WindowSelectorPanels::empty() const {
151d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return transform_windows_.empty();
152d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
153d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void WindowSelectorPanels::PrepareForOverview() {
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // |panel_windows| will hold all the windows in the panel container, sorted
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // according to their stacking order.
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const aura::Window::Windows panels =
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      transform_windows_[0]->window()->parent()->children();
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Call PrepareForOverview() in the reverse stacking order so that the
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // transparent windows that handle the events are in the correct stacking
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // order.
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  size_t transformed_windows = 0;
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (aura::Window::Windows::const_reverse_iterator iter = panels.rbegin();
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      iter != panels.rend(); iter++) {
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for (size_t j = 0; j < transform_windows_.size(); ++j) {
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if (transform_windows_[j]->window() == (*iter)) {
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        transform_windows_[j]->PrepareForOverview();
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        transformed_windows++;
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      }
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
172d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(transformed_windows == transform_windows_.size());
1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void WindowSelectorPanels::SetItemBounds(aura::Window* root_window,
1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                         const gfx::Rect& target_bounds,
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                         bool animate) {
179d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  gfx::Rect bounding_rect;
180d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  for (WindowList::iterator iter = transform_windows_.begin();
181d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)       iter != transform_windows_.end(); ++iter) {
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    bounding_rect.Union((*iter)->GetBoundsInScreen());
183d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
1841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  set_bounds(ScopedTransformOverviewWindow::
1851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ShrinkRectToFitPreservingAspectRatio(bounding_rect, target_bounds));
186d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  gfx::Transform bounding_transform =
1871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ScopedTransformOverviewWindow::GetTransformForRect(bounding_rect,
1881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                         bounds());
189d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  for (WindowList::iterator iter = transform_windows_.begin();
190d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)       iter != transform_windows_.end(); ++iter) {
191d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    gfx::Transform transform;
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    gfx::Rect bounds = (*iter)->GetBoundsInScreen();
193d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    transform.Translate(bounding_rect.x() - bounds.x(),
194d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                        bounding_rect.y() - bounds.y());
195d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    transform.PreconcatTransform(bounding_transform);
196d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    transform.Translate(bounds.x() - bounding_rect.x(),
197d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                        bounds.y() - bounding_rect.y());
1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    (*iter)->SetTransform(root_window, transform, animate);
199d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
200d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
201d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
202d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}  // namespace ash
203