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