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