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