1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file. 4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/aura/window_tree_host_mojo.h" 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <vector> 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/aura/window_tree_host_mojo_delegate.h" 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/aura/env.h" 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/aura/window.h" 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h" 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/events/event.h" 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/events/event_constants.h" 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace mojo { 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace { 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const char kTreeHostsKey[] = "tree_hosts"; 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)typedef std::vector<WindowTreeHostMojo*> Managers; 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class TreeHosts : public base::SupportsUserData::Data { 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TreeHosts() {} 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual ~TreeHosts() {} 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) static TreeHosts* Get() { 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TreeHosts* hosts = static_cast<TreeHosts*>( 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) aura::Env::GetInstance()->GetUserData(kTreeHostsKey)); 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!hosts) { 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) hosts = new TreeHosts; 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) aura::Env::GetInstance()->SetUserData(kTreeHostsKey, hosts); 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return hosts; 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void Add(WindowTreeHostMojo* manager) { 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) managers_.push_back(manager); 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void Remove(WindowTreeHostMojo* manager) { 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Managers::iterator i = std::find(managers_.begin(), managers_.end(), 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) manager); 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(i != managers_.end()); 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) managers_.erase(i); 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::vector<WindowTreeHostMojo*> managers() const { 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return managers_; 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private: 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Managers managers_; 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TreeHosts); 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// WindowTreeHostMojo, public: 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)WindowTreeHostMojo::WindowTreeHostMojo(View* view, 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) WindowTreeHostMojoDelegate* delegate) 666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) : view_(view), 676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bounds_(view->bounds()), 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) delegate_(delegate) { 696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) view_->AddObserver(this); 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CreateCompositor(GetAcceleratedWidget()); 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TreeHosts::Get()->Add(this); 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)WindowTreeHostMojo::~WindowTreeHostMojo() { 766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) view_->RemoveObserver(this); 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TreeHosts::Get()->Remove(this); 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DestroyCompositor(); 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DestroyDispatcher(); 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// static 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)WindowTreeHostMojo* WindowTreeHostMojo::ForCompositor( 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ui::Compositor* compositor) { 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Managers& managers = TreeHosts::Get()->managers(); 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (size_t i = 0; i < managers.size(); ++i) { 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (managers[i]->compositor() == compositor) 88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return managers[i]; 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return NULL; 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void WindowTreeHostMojo::SetContents(const SkBitmap& contents) { 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) delegate_->CompositorContentsChanged(contents); 95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// WindowTreeHostMojo, aura::WindowTreeHost implementation: 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)ui::EventSource* WindowTreeHostMojo::GetEventSource() { 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return this; 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)gfx::AcceleratedWidget WindowTreeHostMojo::GetAcceleratedWidget() { 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return gfx::kNullAcceleratedWidget; 106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void WindowTreeHostMojo::Show() { 109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) window()->Show(); 110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void WindowTreeHostMojo::Hide() { 113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)gfx::Rect WindowTreeHostMojo::GetBounds() const { 116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return bounds_; 117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void WindowTreeHostMojo::SetBounds(const gfx::Rect& bounds) { 120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) window()->SetBounds(gfx::Rect(bounds.size())); 121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)gfx::Point WindowTreeHostMojo::GetLocationOnNativeScreen() const { 124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return gfx::Point(0, 0); 125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void WindowTreeHostMojo::SetCapture() { 128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NOTIMPLEMENTED(); 129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void WindowTreeHostMojo::ReleaseCapture() { 132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NOTIMPLEMENTED(); 133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void WindowTreeHostMojo::PostNativeEvent( 136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::NativeEvent& native_event) { 137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NOTIMPLEMENTED(); 138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void WindowTreeHostMojo::SetCursorNative(gfx::NativeCursor cursor) { 141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NOTIMPLEMENTED(); 142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void WindowTreeHostMojo::MoveCursorToNative(const gfx::Point& location) { 145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NOTIMPLEMENTED(); 146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void WindowTreeHostMojo::OnCursorVisibilityChangedNative(bool show) { 149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NOTIMPLEMENTED(); 150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// WindowTreeHostMojo, ui::EventSource implementation: 154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)ui::EventProcessor* WindowTreeHostMojo::GetEventProcessor() { 156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return dispatcher(); 157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 1606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// WindowTreeHostMojo, ViewObserver implementation: 1616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void WindowTreeHostMojo::OnViewBoundsChanged( 1636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) View* view, 1646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const gfx::Rect& old_bounds, 165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const gfx::Rect& new_bounds) { 1666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) bounds_ = new_bounds; 1676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (old_bounds.origin() != new_bounds.origin()) 1686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OnHostMoved(bounds_.origin()); 1696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (old_bounds.size() != new_bounds.size()) 1706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) OnHostResized(bounds_.size()); 1716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace mojo 174