OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "mojo/services/window_manager/window_manager_app.h" | 5 #include "mojo/services/window_manager/window_manager_app.h" |
6 | 6 |
7 #include "base/message_loop/message_loop.h" | 7 #include "base/message_loop/message_loop.h" |
8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
9 #include "mojo/aura/aura_init.h" | 9 #include "mojo/aura/aura_init.h" |
10 #include "mojo/aura/window_tree_host_mojo.h" | |
11 #include "mojo/public/cpp/application/application_connection.h" | 10 #include "mojo/public/cpp/application/application_connection.h" |
| 11 #include "mojo/services/public/cpp/input_events/input_events_type_converters.h" |
12 #include "mojo/services/public/cpp/view_manager/view.h" | 12 #include "mojo/services/public/cpp/view_manager/view.h" |
13 #include "mojo/services/public/cpp/view_manager/view_manager.h" | 13 #include "mojo/services/public/cpp/view_manager/view_manager.h" |
14 #include "ui/aura/window.h" | 14 #include "ui/aura/window.h" |
| 15 #include "ui/aura/window_delegate.h" |
15 #include "ui/aura/window_property.h" | 16 #include "ui/aura/window_property.h" |
| 17 #include "ui/base/hit_test.h" |
16 #include "ui/wm/core/capture_controller.h" | 18 #include "ui/wm/core/capture_controller.h" |
17 #include "ui/wm/core/focus_controller.h" | 19 #include "ui/wm/core/focus_controller.h" |
18 #include "ui/wm/core/focus_rules.h" | 20 #include "ui/wm/core/focus_rules.h" |
19 #include "ui/wm/public/activation_client.h" | 21 #include "ui/wm/public/activation_client.h" |
20 | 22 |
21 DECLARE_WINDOW_PROPERTY_TYPE(mojo::View*); | 23 DECLARE_WINDOW_PROPERTY_TYPE(mojo::View*); |
22 | 24 |
23 namespace mojo { | 25 namespace mojo { |
| 26 |
| 27 // The aura::Windows we use to track Views don't render, so we don't actually |
| 28 // need to supply a fully functional WindowDelegate. We do need to provide _a_ |
| 29 // delegate however, otherwise the event dispatcher won't dispatch events to |
| 30 // these windows. (The aura WindowTargeter won't allow a delegate-less window |
| 31 // to be the target of an event, since the window delegate is considered the |
| 32 // "target handler"). |
| 33 class DummyDelegate : public aura::WindowDelegate { |
| 34 public: |
| 35 DummyDelegate() {} |
| 36 virtual ~DummyDelegate() {} |
| 37 |
| 38 private: |
| 39 // WindowDelegate overrides: |
| 40 virtual gfx::Size GetMinimumSize() const OVERRIDE { return gfx::Size(); } |
| 41 virtual gfx::Size GetMaximumSize() const OVERRIDE { return gfx::Size(); } |
| 42 virtual void OnBoundsChanged(const gfx::Rect& old_bounds, |
| 43 const gfx::Rect& new_bounds) OVERRIDE {} |
| 44 virtual gfx::NativeCursor GetCursor(const gfx::Point& point) OVERRIDE { |
| 45 return gfx::kNullCursor; |
| 46 } |
| 47 virtual int GetNonClientComponent(const gfx::Point& point) const OVERRIDE { |
| 48 return HTCAPTION; |
| 49 } |
| 50 virtual bool ShouldDescendIntoChildForEventHandling( |
| 51 aura::Window* child, |
| 52 const gfx::Point& location) OVERRIDE { return true; } |
| 53 virtual bool CanFocus() OVERRIDE { return true; } |
| 54 virtual void OnCaptureLost() OVERRIDE {} |
| 55 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE {} |
| 56 virtual void OnDeviceScaleFactorChanged(float device_scale_factor) OVERRIDE {} |
| 57 virtual void OnWindowDestroying(aura::Window* window) OVERRIDE {} |
| 58 virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE {} |
| 59 virtual void OnWindowTargetVisibilityChanged(bool visible) OVERRIDE {} |
| 60 virtual bool HasHitTestMask() const OVERRIDE { return false; } |
| 61 virtual void GetHitTestMask(gfx::Path* mask) const OVERRIDE {} |
| 62 |
| 63 DISALLOW_COPY_AND_ASSIGN(DummyDelegate); |
| 64 }; |
| 65 |
24 namespace { | 66 namespace { |
25 | 67 |
26 DEFINE_WINDOW_PROPERTY_KEY(View*, kViewKey, NULL); | 68 DEFINE_WINDOW_PROPERTY_KEY(View*, kViewKey, NULL); |
27 | 69 |
28 Id GetIdForWindow(aura::Window* window) { | 70 Id GetIdForWindow(aura::Window* window) { |
29 return window ? window->GetProperty(kViewKey)->id() : 0; | 71 return window ? WindowManagerApp::GetViewForWindow(window)->id() : 0; |
30 } | 72 } |
31 | 73 |
32 class WMFocusRules : public wm::FocusRules { | 74 class WMFocusRules : public wm::FocusRules { |
33 public: | 75 public: |
34 WMFocusRules() {} | 76 WMFocusRules() {} |
35 virtual ~WMFocusRules() {} | 77 virtual ~WMFocusRules() {} |
36 | 78 |
37 private: | 79 private: |
38 // Overridden from wm::FocusRules: | 80 // Overridden from wm::FocusRules: |
39 virtual bool IsToplevelWindow(aura::Window* window) const MOJO_OVERRIDE { | 81 virtual bool IsToplevelWindow(aura::Window* window) const MOJO_OVERRIDE { |
(...skipping 23 matching lines...) Expand all Loading... |
63 } | 105 } |
64 | 106 |
65 DISALLOW_COPY_AND_ASSIGN(WMFocusRules); | 107 DISALLOW_COPY_AND_ASSIGN(WMFocusRules); |
66 }; | 108 }; |
67 | 109 |
68 } // namespace | 110 } // namespace |
69 | 111 |
70 //////////////////////////////////////////////////////////////////////////////// | 112 //////////////////////////////////////////////////////////////////////////////// |
71 // WindowManagerApp, public: | 113 // WindowManagerApp, public: |
72 | 114 |
73 WindowManagerApp::WindowManagerApp(ViewManagerDelegate* delegate) | 115 WindowManagerApp::WindowManagerApp( |
| 116 ViewManagerDelegate* view_manager_delegate, |
| 117 WindowManagerDelegate* window_manager_delegate) |
74 : window_manager_service_factory_(this), | 118 : window_manager_service_factory_(this), |
75 wrapped_delegate_(delegate), | 119 wrapped_view_manager_delegate_(view_manager_delegate), |
| 120 wrapped_window_manager_delegate_(window_manager_delegate), |
76 view_manager_(NULL), | 121 view_manager_(NULL), |
77 view_manager_client_factory_(this), | 122 view_manager_client_factory_(this), |
78 root_(NULL) { | 123 root_(NULL), |
| 124 dummy_delegate_(new DummyDelegate) { |
79 } | 125 } |
80 | 126 |
81 WindowManagerApp::~WindowManagerApp() {} | 127 WindowManagerApp::~WindowManagerApp() {} |
82 | 128 |
| 129 // static |
| 130 View* WindowManagerApp::GetViewForWindow(aura::Window* window) { |
| 131 return window->GetProperty(kViewKey); |
| 132 } |
| 133 |
83 void WindowManagerApp::AddConnection(WindowManagerServiceImpl* connection) { | 134 void WindowManagerApp::AddConnection(WindowManagerServiceImpl* connection) { |
84 DCHECK(connections_.find(connection) == connections_.end()); | 135 DCHECK(connections_.find(connection) == connections_.end()); |
85 connections_.insert(connection); | 136 connections_.insert(connection); |
86 } | 137 } |
87 | 138 |
88 void WindowManagerApp::RemoveConnection(WindowManagerServiceImpl* connection) { | 139 void WindowManagerApp::RemoveConnection(WindowManagerServiceImpl* connection) { |
89 DCHECK(connections_.find(connection) != connections_.end()); | 140 DCHECK(connections_.find(connection) != connections_.end()); |
90 connections_.erase(connection); | 141 connections_.erase(connection); |
91 } | 142 } |
92 | 143 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 | 179 |
129 //////////////////////////////////////////////////////////////////////////////// | 180 //////////////////////////////////////////////////////////////////////////////// |
130 // WindowManagerApp, ViewManagerDelegate implementation: | 181 // WindowManagerApp, ViewManagerDelegate implementation: |
131 | 182 |
132 void WindowManagerApp::OnEmbed(ViewManager* view_manager, | 183 void WindowManagerApp::OnEmbed(ViewManager* view_manager, |
133 View* root, | 184 View* root, |
134 ServiceProviderImpl* exported_services, | 185 ServiceProviderImpl* exported_services, |
135 scoped_ptr<ServiceProvider> imported_services) { | 186 scoped_ptr<ServiceProvider> imported_services) { |
136 DCHECK(!view_manager_ && !root_); | 187 DCHECK(!view_manager_ && !root_); |
137 view_manager_ = view_manager; | 188 view_manager_ = view_manager; |
| 189 view_manager_->SetWindowManagerDelegate(this); |
138 root_ = root; | 190 root_ = root; |
139 root_->AddObserver(this); | |
140 | 191 |
141 window_tree_host_.reset(new WindowTreeHostMojo(root_, this)); | 192 window_tree_host_.reset(new WindowTreeHostMojo(root_, this)); |
| 193 window_tree_host_->window()->SetBounds(root->bounds()); |
| 194 window_tree_host_->window()->Show(); |
142 | 195 |
143 RegisterSubtree(root_->id(), window_tree_host_->window()); | 196 RegisterSubtree(root_, window_tree_host_->window()); |
144 | 197 |
145 capture_client_.reset( | 198 capture_client_.reset( |
146 new wm::ScopedCaptureClient(window_tree_host_->window())); | 199 new wm::ScopedCaptureClient(window_tree_host_->window())); |
147 wm::FocusController* focus_controller = | 200 wm::FocusController* focus_controller = |
148 new wm::FocusController(new WMFocusRules); | 201 new wm::FocusController(new WMFocusRules); |
149 activation_client_ = focus_controller; | 202 activation_client_ = focus_controller; |
150 focus_client_.reset(focus_controller); | 203 focus_client_.reset(focus_controller); |
| 204 aura::client::SetFocusClient(window_tree_host_->window(), focus_controller); |
151 | 205 |
152 focus_client_->AddObserver(this); | 206 focus_client_->AddObserver(this); |
153 activation_client_->AddObserver(this); | 207 activation_client_->AddObserver(this); |
154 | 208 |
155 if (wrapped_delegate_) { | 209 if (wrapped_view_manager_delegate_) { |
156 wrapped_delegate_->OnEmbed(view_manager, root, exported_services, | 210 wrapped_view_manager_delegate_->OnEmbed( |
157 imported_services.Pass()); | 211 view_manager, root, exported_services, imported_services.Pass()); |
158 } | 212 } |
159 | 213 |
160 for (Connections::const_iterator it = connections_.begin(); | 214 for (Connections::const_iterator it = connections_.begin(); |
161 it != connections_.end(); ++it) { | 215 it != connections_.end(); ++it) { |
162 (*it)->NotifyReady(); | 216 (*it)->NotifyReady(); |
163 } | 217 } |
164 } | 218 } |
165 | 219 |
166 void WindowManagerApp::OnViewManagerDisconnected( | 220 void WindowManagerApp::OnViewManagerDisconnected( |
167 ViewManager* view_manager) { | 221 ViewManager* view_manager) { |
168 DCHECK_EQ(view_manager_, view_manager); | 222 DCHECK_EQ(view_manager_, view_manager); |
169 if (wrapped_delegate_) | 223 if (wrapped_view_manager_delegate_) |
170 wrapped_delegate_->OnViewManagerDisconnected(view_manager); | 224 wrapped_view_manager_delegate_->OnViewManagerDisconnected(view_manager); |
171 view_manager_ = NULL; | 225 view_manager_ = NULL; |
172 base::MessageLoop::current()->Quit(); | 226 base::MessageLoop::current()->Quit(); |
173 } | 227 } |
174 | 228 |
175 //////////////////////////////////////////////////////////////////////////////// | 229 //////////////////////////////////////////////////////////////////////////////// |
| 230 // WindowManagerApp, WindowManagerDelegate implementation: |
| 231 |
| 232 void WindowManagerApp::Embed( |
| 233 const String& url, |
| 234 InterfaceRequest<ServiceProvider> service_provider) { |
| 235 if (wrapped_window_manager_delegate_) |
| 236 wrapped_window_manager_delegate_->Embed(url, service_provider.Pass()); |
| 237 } |
| 238 |
| 239 void WindowManagerApp::DispatchEvent(EventPtr event) { |
| 240 scoped_ptr<ui::Event> ui_event = |
| 241 TypeConverter<EventPtr, scoped_ptr<ui::Event> >::ConvertTo(event); |
| 242 if (ui_event) |
| 243 window_tree_host_->SendEventToProcessor(ui_event.get()); |
| 244 } |
| 245 |
| 246 //////////////////////////////////////////////////////////////////////////////// |
176 // WindowManagerApp, ViewObserver implementation: | 247 // WindowManagerApp, ViewObserver implementation: |
177 | 248 |
178 void WindowManagerApp::OnTreeChanged( | 249 void WindowManagerApp::OnTreeChanged( |
179 const ViewObserver::TreeChangeParams& params) { | 250 const ViewObserver::TreeChangeParams& params) { |
180 DCHECK_EQ(params.receiver, root_); | 251 if (params.receiver != root_) |
| 252 return; |
181 DCHECK(params.old_parent || params.new_parent); | 253 DCHECK(params.old_parent || params.new_parent); |
182 if (!params.target) | 254 if (!params.target) |
183 return; | 255 return; |
184 | 256 |
185 if (params.new_parent) { | 257 if (params.new_parent) { |
186 if (view_id_to_window_map_.find(params.target->id()) == | 258 if (view_id_to_window_map_.find(params.target->id()) == |
187 view_id_to_window_map_.end()) { | 259 view_id_to_window_map_.end()) { |
188 ViewIdToWindowMap::const_iterator it = | 260 ViewIdToWindowMap::const_iterator it = |
189 view_id_to_window_map_.find(params.new_parent->id()); | 261 view_id_to_window_map_.find(params.new_parent->id()); |
190 DCHECK(it != view_id_to_window_map_.end()); | 262 DCHECK(it != view_id_to_window_map_.end()); |
191 RegisterSubtree(params.target->id(), it->second); | 263 RegisterSubtree(params.target, it->second); |
192 } | 264 } |
193 } else if (params.old_parent) { | 265 } else if (params.old_parent) { |
194 UnregisterSubtree(params.target->id()); | 266 UnregisterSubtree(params.target); |
195 } | 267 } |
196 } | 268 } |
197 | 269 |
198 void WindowManagerApp::OnViewDestroyed(View* view) { | 270 void WindowManagerApp::OnViewDestroyed(View* view) { |
| 271 if (view != root_) |
| 272 return; |
| 273 aura::Window* window = GetWindowForViewId(view->id()); |
| 274 window->RemovePreTargetHandler(this); |
199 root_ = NULL; | 275 root_ = NULL; |
200 STLDeleteValues(&view_id_to_window_map_); | 276 STLDeleteValues(&view_id_to_window_map_); |
201 if (focus_client_.get()) | 277 if (focus_client_.get()) |
202 focus_client_->RemoveObserver(this); | 278 focus_client_->RemoveObserver(this); |
203 if (activation_client_) | 279 if (activation_client_) |
204 activation_client_->RemoveObserver(this); | 280 activation_client_->RemoveObserver(this); |
205 window_tree_host_.reset(); | 281 window_tree_host_.reset(); |
206 } | 282 } |
207 | 283 |
| 284 void WindowManagerApp::OnViewBoundsChanged(View* view, |
| 285 const gfx::Rect& old_bounds, |
| 286 const gfx::Rect& new_bounds) { |
| 287 aura::Window* window = GetWindowForViewId(view->id()); |
| 288 window->SetBounds(new_bounds); |
| 289 } |
| 290 |
208 //////////////////////////////////////////////////////////////////////////////// | 291 //////////////////////////////////////////////////////////////////////////////// |
209 // WindowManagerApp, WindowTreeHostMojoDelegate implementation: | 292 // WindowManagerApp, WindowTreeHostMojoDelegate implementation: |
210 | 293 |
211 void WindowManagerApp::CompositorContentsChanged(const SkBitmap& bitmap) { | 294 void WindowManagerApp::CompositorContentsChanged(const SkBitmap& bitmap) { |
212 // We draw nothing. | 295 // We draw nothing. |
213 NOTREACHED(); | 296 NOTREACHED(); |
214 } | 297 } |
215 | 298 |
216 //////////////////////////////////////////////////////////////////////////////// | 299 //////////////////////////////////////////////////////////////////////////////// |
| 300 // WindowManagerApp, ui::EventHandler implementation: |
| 301 |
| 302 void WindowManagerApp::OnEvent(ui::Event* event) { |
| 303 aura::Window* window = static_cast<aura::Window*>(event->target()); |
| 304 view_manager_->DispatchEvent( |
| 305 GetViewForWindow(window), |
| 306 TypeConverter<EventPtr, ui::Event>::ConvertFrom(*event)); |
| 307 } |
| 308 |
| 309 //////////////////////////////////////////////////////////////////////////////// |
217 // WindowManagerApp, aura::client::FocusChangeObserver implementation: | 310 // WindowManagerApp, aura::client::FocusChangeObserver implementation: |
218 | 311 |
219 void WindowManagerApp::OnWindowFocused(aura::Window* gained_focus, | 312 void WindowManagerApp::OnWindowFocused(aura::Window* gained_focus, |
220 aura::Window* lost_focus) { | 313 aura::Window* lost_focus) { |
221 for (Connections::const_iterator it = connections_.begin(); | 314 for (Connections::const_iterator it = connections_.begin(); |
222 it != connections_.end(); ++it) { | 315 it != connections_.end(); ++it) { |
223 (*it)->NotifyViewFocused(GetIdForWindow(gained_focus), | 316 (*it)->NotifyViewFocused(GetIdForWindow(gained_focus), |
224 GetIdForWindow(lost_focus)); | 317 GetIdForWindow(lost_focus)); |
225 } | 318 } |
226 } | 319 } |
(...skipping 11 matching lines...) Expand all Loading... |
238 } | 331 } |
239 | 332 |
240 //////////////////////////////////////////////////////////////////////////////// | 333 //////////////////////////////////////////////////////////////////////////////// |
241 // WindowManagerApp, private: | 334 // WindowManagerApp, private: |
242 | 335 |
243 aura::Window* WindowManagerApp::GetWindowForViewId(Id view) const { | 336 aura::Window* WindowManagerApp::GetWindowForViewId(Id view) const { |
244 ViewIdToWindowMap::const_iterator it = view_id_to_window_map_.find(view); | 337 ViewIdToWindowMap::const_iterator it = view_id_to_window_map_.find(view); |
245 return it != view_id_to_window_map_.end() ? it->second : NULL; | 338 return it != view_id_to_window_map_.end() ? it->second : NULL; |
246 } | 339 } |
247 | 340 |
248 void WindowManagerApp::RegisterSubtree(Id id, | 341 void WindowManagerApp::RegisterSubtree(View* view, aura::Window* parent) { |
249 aura::Window* parent) { | 342 view->AddObserver(this); |
250 View* view = view_manager_->GetViewById(id); | 343 DCHECK(view_id_to_window_map_.find(view->id()) == |
251 DCHECK(view_id_to_window_map_.find(id) == view_id_to_window_map_.end()); | 344 view_id_to_window_map_.end()); |
252 aura::Window* window = new aura::Window(NULL); | 345 aura::Window* window = new aura::Window(dummy_delegate_.get()); |
| 346 window->set_id(view->id()); |
253 window->SetProperty(kViewKey, view); | 347 window->SetProperty(kViewKey, view); |
| 348 // All events pass through the root during dispatch, so we only need a handler |
| 349 // installed there. |
| 350 if (view == root_) |
| 351 window->AddPreTargetHandler(this); |
254 parent->AddChild(window); | 352 parent->AddChild(window); |
255 view_id_to_window_map_[id] = window; | 353 window->SetBounds(view->bounds()); |
| 354 window->Show(); |
| 355 view_id_to_window_map_[view->id()] = window; |
256 View::Children::const_iterator it = view->children().begin(); | 356 View::Children::const_iterator it = view->children().begin(); |
257 for (; it != view->children().end(); ++it) | 357 for (; it != view->children().end(); ++it) |
258 RegisterSubtree((*it)->id(), window); | 358 RegisterSubtree(*it, window); |
259 } | 359 } |
260 | 360 |
261 void WindowManagerApp::UnregisterSubtree(Id id) { | 361 void WindowManagerApp::UnregisterSubtree(View* view) { |
262 View* view = view_manager_->GetViewById(id); | 362 view->RemoveObserver(this); |
263 ViewIdToWindowMap::iterator it = view_id_to_window_map_.find(id); | 363 ViewIdToWindowMap::iterator it = view_id_to_window_map_.find(view->id()); |
264 DCHECK(it != view_id_to_window_map_.end()); | 364 DCHECK(it != view_id_to_window_map_.end()); |
265 scoped_ptr<aura::Window> window(it->second); | 365 scoped_ptr<aura::Window> window(it->second); |
266 view_id_to_window_map_.erase(it); | 366 view_id_to_window_map_.erase(it); |
267 View::Children::const_iterator child = view->children().begin(); | 367 View::Children::const_iterator child = view->children().begin(); |
268 for (; child != view->children().end(); ++child) | 368 for (; child != view->children().end(); ++child) |
269 UnregisterSubtree((*child)->id()); | 369 UnregisterSubtree(*child); |
270 } | 370 } |
271 | 371 |
272 } // namespace mojo | 372 } // namespace mojo |
OLD | NEW |