window_tree_host.cc revision a02191e04bc25c4935f804f2c080ae28663d096d
1069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project// Use of this source code is governed by a BSD-style license that can be
3069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project// found in the LICENSE file.
4069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
5069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "ui/aura/window_tree_host.h"
6069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
7069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "base/debug/trace_event.h"
8069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "ui/aura/client/capture_client.h"
9069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "ui/aura/client/cursor_client.h"
10069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "ui/aura/env.h"
11069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "ui/aura/window.h"
12069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "ui/aura/window_event_dispatcher.h"
13069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "ui/aura/window_targeter.h"
14069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "ui/aura/window_tree_host_observer.h"
15069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "ui/base/view_prop.h"
16069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "ui/compositor/dip_util.h"
17069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "ui/compositor/layer.h"
18069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "ui/gfx/display.h"
19069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "ui/gfx/insets.h"
20069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "ui/gfx/point.h"
21069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "ui/gfx/point3_f.h"
22069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "ui/gfx/point_conversions.h"
23069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "ui/gfx/screen.h"
24069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#include "ui/gfx/size_conversions.h"
25069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
26069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectnamespace aura {
27069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
28069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectconst char kWindowTreeHostForAcceleratedWidget[] =
29069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    "__AURA_WINDOW_TREE_HOST_ACCELERATED_WIDGET__";
30069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
31069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectfloat GetDeviceScaleFactorFromDisplay(Window* window) {
32069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  gfx::Display display = gfx::Screen::GetScreenFor(window)->
33069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project      GetDisplayNearestWindow(window);
34069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  DCHECK(display.is_valid());
35069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  return display.device_scale_factor();
36069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
37069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
38069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
39069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project// WindowTreeHost, public:
40069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
41069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source ProjectWindowTreeHost::~WindowTreeHost() {
42069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  DCHECK(!compositor_) << "compositor must be destroyed before root window";
43069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
44069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
45069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#if defined(OS_ANDROID)
46069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project// static
47069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source ProjectWindowTreeHost* WindowTreeHost::Create(const gfx::Rect& bounds) {
48069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // This is only hit for tests and ash, right now these aren't an issue so
49d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath  // adding the CHECK.
50d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath  // TODO(sky): decide if we want a factory.
51d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath  CHECK(false);
52d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath  return NULL;
53069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
54069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project#endif
55d42abb2fd917184764daf22f5f299e848b8701d7Narayan Kamath
56069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project// static
57069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source ProjectWindowTreeHost* WindowTreeHost::GetForAcceleratedWidget(
58069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    gfx::AcceleratedWidget widget) {
59069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  return reinterpret_cast<WindowTreeHost*>(
60069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project      ui::ViewProp::GetValue(widget, kWindowTreeHostForAcceleratedWidget));
61069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
62069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
63069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid WindowTreeHost::InitHost() {
64069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  InitCompositor();
65069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  UpdateRootWindowSize(GetBounds().size());
66069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  Env::GetInstance()->NotifyHostInitialized(this);
67069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  window()->Show();
68069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
69069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
70069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid WindowTreeHost::InitCompositor() {
71069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  compositor_->SetScaleAndSize(GetDeviceScaleFactorFromDisplay(window()),
72069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                               GetBounds().size());
73069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  compositor_->SetRootLayer(window()->layer());
74069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
75069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
76069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid WindowTreeHost::AddObserver(WindowTreeHostObserver* observer) {
77069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  observers_.AddObserver(observer);
78069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
79069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
80069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid WindowTreeHost::RemoveObserver(WindowTreeHostObserver* observer) {
81069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  observers_.RemoveObserver(observer);
82069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
83069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
84069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectui::EventProcessor* WindowTreeHost::event_processor() {
85069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  return dispatcher();
86069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
87069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
88069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectgfx::Transform WindowTreeHost::GetRootTransform() const {
89069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  float scale = ui::GetDeviceScaleFactor(window()->layer());
90069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  gfx::Transform transform;
91069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  transform.Scale(scale, scale);
92069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  transform *= window()->layer()->transform();
93069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  return transform;
94069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
95069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
96069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid WindowTreeHost::SetRootTransform(const gfx::Transform& transform) {
97069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  window()->SetTransform(transform);
98069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  UpdateRootWindowSize(GetBounds().size());
99069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
100069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
101069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectgfx::Transform WindowTreeHost::GetInverseRootTransform() const {
102069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  gfx::Transform invert;
103069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  gfx::Transform transform = GetRootTransform();
104069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  if (!transform.GetInverse(&invert))
105069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    return transform;
106069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  return invert;
107069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
108069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
109069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid WindowTreeHost::UpdateRootWindowSize(const gfx::Size& host_size) {
110069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  gfx::Rect bounds(host_size);
111069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  gfx::RectF new_bounds(ui::ConvertRectToDIP(window()->layer(), bounds));
112069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  GetRootTransform().TransformRect(&new_bounds);
113069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  window()->SetBounds(gfx::Rect(gfx::ToFlooredSize(new_bounds.size())));
114069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
115069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
116069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid WindowTreeHost::ConvertPointToNativeScreen(gfx::Point* point) const {
117069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  ConvertPointToHost(point);
118069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  gfx::Point location = GetLocationOnNativeScreen();
119069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  point->Offset(location.x(), location.y());
120069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
121069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
122069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid WindowTreeHost::ConvertPointFromNativeScreen(gfx::Point* point) const {
123069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  gfx::Point location = GetLocationOnNativeScreen();
124069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  point->Offset(-location.x(), -location.y());
125069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  ConvertPointFromHost(point);
126069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
127069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
128069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid WindowTreeHost::ConvertPointToHost(gfx::Point* point) const {
129069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  gfx::Point3F point_3f(*point);
130069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  GetRootTransform().TransformPoint(&point_3f);
131069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  *point = gfx::ToFlooredPoint(point_3f.AsPointF());
132069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
133069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
134069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid WindowTreeHost::ConvertPointFromHost(gfx::Point* point) const {
135069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  gfx::Point3F point_3f(*point);
136069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  GetInverseRootTransform().TransformPoint(&point_3f);
137069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  *point = gfx::ToFlooredPoint(point_3f.AsPointF());
138069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
139069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
140069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid WindowTreeHost::SetCursor(gfx::NativeCursor cursor) {
141069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  last_cursor_ = cursor;
142069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // A lot of code seems to depend on NULL cursors actually showing an arrow,
143069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // so just pass everything along to the host.
144069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  SetCursorNative(cursor);
145069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
146069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
147069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid WindowTreeHost::OnCursorVisibilityChanged(bool show) {
148069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // Clear any existing mouse hover effects when the cursor becomes invisible.
149069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // Note we do not need to dispatch a mouse enter when the cursor becomes
150069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // visible because that can only happen in response to a mouse event, which
151069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // will trigger its own mouse enter.
152069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  if (!show) {
153069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    dispatcher()->DispatchMouseExitAtPoint(
154069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        dispatcher()->GetLastMouseLocationInRoot());
155069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  }
156069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
157069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  OnCursorVisibilityChangedNative(show);
158069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
159069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
160069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid WindowTreeHost::MoveCursorTo(const gfx::Point& location_in_dip) {
161069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  gfx::Point host_location(location_in_dip);
162069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  ConvertPointToHost(&host_location);
163069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  MoveCursorToInternal(location_in_dip, host_location);
164069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
165069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
166069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid WindowTreeHost::MoveCursorToHostLocation(const gfx::Point& host_location) {
167069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  gfx::Point root_location(host_location);
168069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  ConvertPointFromHost(&root_location);
169069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  MoveCursorToInternal(root_location, host_location);
170069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
171069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
172069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
173069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project// WindowTreeHost, protected:
174069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
175069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source ProjectWindowTreeHost::WindowTreeHost()
176069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    : window_(new Window(NULL)),
177069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project      last_cursor_(ui::kCursorNull) {
178069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
179069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
180069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid WindowTreeHost::DestroyCompositor() {
181069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  DCHECK(GetAcceleratedWidget());
182069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  compositor_.reset();
183069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
184069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
185069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid WindowTreeHost::DestroyDispatcher() {
186069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  delete window_;
187069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  window_ = NULL;
188069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  dispatcher_.reset();
189069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
190069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // TODO(beng): this comment is no longer quite valid since this function
191069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // isn't called from WED, and WED isn't a subclass of Window. So it seems
192069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // like we could just rely on ~Window now.
193069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // Destroy child windows while we're still valid. This is also done by
194069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // ~Window, but by that time any calls to virtual methods overriden here (such
195069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // as GetRootWindow()) result in Window's implementation. By destroying here
196069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // we ensure GetRootWindow() still returns this.
197069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  //window()->RemoveOrDestroyChildren();
198069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
199069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
200069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid WindowTreeHost::CreateCompositor(
201069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    gfx::AcceleratedWidget accelerated_widget) {
202069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  compositor_.reset(new ui::Compositor(GetAcceleratedWidget()));
203069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  DCHECK(compositor_.get());
204069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // TODO(beng): I think this setup should probably all move to a "accelerated
205069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // widget available" function.
206069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  if (!dispatcher()) {
207069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    window()->Init(WINDOW_LAYER_NOT_DRAWN);
208069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    window()->set_host(this);
209069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    window()->SetName("RootWindow");
210069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    window()->SetEventTargeter(
211069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        scoped_ptr<ui::EventTargeter>(new WindowTargeter()));
212069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    prop_.reset(new ui::ViewProp(GetAcceleratedWidget(),
213069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                                 kWindowTreeHostForAcceleratedWidget,
214069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                                 this));
215069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    dispatcher_.reset(new WindowEventDispatcher(this));
216069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  }
217069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
218069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
219069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid WindowTreeHost::OnHostMoved(const gfx::Point& new_location) {
220069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  TRACE_EVENT1("ui", "WindowTreeHost::OnHostMoved",
221069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project               "origin", new_location.ToString());
222069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
223069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  FOR_EACH_OBSERVER(WindowTreeHostObserver, observers_,
224069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    OnHostMoved(this, new_location));
225069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
226069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
227069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid WindowTreeHost::OnHostResized(const gfx::Size& new_size) {
228069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // The compositor should have the same size as the native root window host.
229069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // Get the latest scale from display because it might have been changed.
230069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  compositor_->SetScaleAndSize(GetDeviceScaleFactorFromDisplay(window()),
231069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                               new_size);
232069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
233069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  gfx::Size layer_size = GetBounds().size();
234069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // The layer, and the observers should be notified of the
235069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  // transformed size of the root window.
236069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  UpdateRootWindowSize(layer_size);
237069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  FOR_EACH_OBSERVER(WindowTreeHostObserver, observers_, OnHostResized(this));
238069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
239069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
240069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid WindowTreeHost::OnHostCloseRequested() {
241069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  FOR_EACH_OBSERVER(WindowTreeHostObserver, observers_,
242069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                    OnHostCloseRequested(this));
243069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
244069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
245069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid WindowTreeHost::OnHostActivated() {
246069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  Env::GetInstance()->NotifyHostActivated(this);
247069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
248069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
249069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid WindowTreeHost::OnHostLostWindowCapture() {
250069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  Window* capture_window = client::GetCaptureWindow(window());
251069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  if (capture_window && capture_window->GetRootWindow() == window())
252069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    capture_window->ReleaseCapture();
253069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
254069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
255069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project////////////////////////////////////////////////////////////////////////////////
256069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project// WindowTreeHost, private:
257069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
258069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectvoid WindowTreeHost::MoveCursorToInternal(const gfx::Point& root_location,
259069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                                          const gfx::Point& host_location) {
260069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  MoveCursorToNative(host_location);
261069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  client::CursorClient* cursor_client = client::GetCursorClient(window());
262069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  if (cursor_client) {
263069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    const gfx::Display& display =
264069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        gfx::Screen::GetScreenFor(window())->GetDisplayNearestWindow(window());
265069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    cursor_client->SetDisplay(display);
266069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  }
267069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project  dispatcher()->OnCursorMovedToRootLocation(root_location);
268069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
269069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
270069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}  // namespace aura
271069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project