Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Side by Side Diff: mojo/services/window_manager/window_manager_app.cc

Issue 599213002: First cut at supporting activation in the window manager (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/public/cpp/application/application_connection.h" 10 #include "mojo/public/cpp/application/application_connection.h"
11 #include "mojo/public/cpp/application/application_impl.h" 11 #include "mojo/public/cpp/application/application_impl.h"
12 #include "mojo/services/public/cpp/input_events/input_events_type_converters.h" 12 #include "mojo/services/public/cpp/input_events/input_events_type_converters.h"
13 #include "mojo/services/public/cpp/view_manager/view.h" 13 #include "mojo/services/public/cpp/view_manager/view.h"
14 #include "mojo/services/public/cpp/view_manager/view_manager.h" 14 #include "mojo/services/public/cpp/view_manager/view_manager.h"
15 #include "ui/aura/window.h" 15 #include "ui/aura/window.h"
16 #include "ui/aura/window_delegate.h" 16 #include "ui/aura/window_delegate.h"
17 #include "ui/aura/window_property.h" 17 #include "ui/aura/window_property.h"
18 #include "ui/base/hit_test.h" 18 #include "ui/base/hit_test.h"
19 #include "ui/wm/core/capture_controller.h" 19 #include "ui/wm/core/capture_controller.h"
20 #include "ui/wm/core/focus_controller.h" 20 #include "ui/wm/core/focus_controller.h"
21 #include "ui/wm/core/focus_rules.h"
22 #include "ui/wm/public/activation_client.h" 21 #include "ui/wm/public/activation_client.h"
23 22
24 DECLARE_WINDOW_PROPERTY_TYPE(mojo::View*); 23 DECLARE_WINDOW_PROPERTY_TYPE(mojo::View*);
25 24
26 namespace mojo { 25 namespace mojo {
27 26
28 // The aura::Windows we use to track Views don't render, so we don't actually 27 // The aura::Windows we use to track Views don't render, so we don't actually
29 // need to supply a fully functional WindowDelegate. We do need to provide _a_ 28 // need to supply a fully functional WindowDelegate. We do need to provide _a_
30 // delegate however, otherwise the event dispatcher won't dispatch events to 29 // delegate however, otherwise the event dispatcher won't dispatch events to
31 // these windows. (The aura WindowTargeter won't allow a delegate-less window 30 // these windows. (The aura WindowTargeter won't allow a delegate-less window
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 }; 64 };
66 65
67 namespace { 66 namespace {
68 67
69 DEFINE_WINDOW_PROPERTY_KEY(View*, kViewKey, NULL); 68 DEFINE_WINDOW_PROPERTY_KEY(View*, kViewKey, NULL);
70 69
71 Id GetIdForWindow(aura::Window* window) { 70 Id GetIdForWindow(aura::Window* window) {
72 return window ? WindowManagerApp::GetViewForWindow(window)->id() : 0; 71 return window ? WindowManagerApp::GetViewForWindow(window)->id() : 0;
73 } 72 }
74 73
75 class WMFocusRules : public wm::FocusRules {
76 public:
77 WMFocusRules() {}
78 virtual ~WMFocusRules() {}
79
80 private:
81 // Overridden from wm::FocusRules:
82 virtual bool IsToplevelWindow(aura::Window* window) const MOJO_OVERRIDE {
83 return true;
84 }
85 virtual bool CanActivateWindow(aura::Window* window) const MOJO_OVERRIDE {
86 return true;
87 }
88 virtual bool CanFocusWindow(aura::Window* window) const MOJO_OVERRIDE {
89 return true;
90 }
91 virtual aura::Window* GetToplevelWindow(
92 aura::Window* window) const MOJO_OVERRIDE {
93 return window;
94 }
95 virtual aura::Window* GetActivatableWindow(
96 aura::Window* window) const MOJO_OVERRIDE {
97 return window;
98 }
99 virtual aura::Window* GetFocusableWindow(
100 aura::Window* window) const MOJO_OVERRIDE {
101 return window;
102 }
103 virtual aura::Window* GetNextActivatableWindow(
104 aura::Window* ignore) const MOJO_OVERRIDE {
105 return NULL;
106 }
107
108 DISALLOW_COPY_AND_ASSIGN(WMFocusRules);
109 };
110
111 } // namespace 74 } // namespace
112 75
113 //////////////////////////////////////////////////////////////////////////////// 76 ////////////////////////////////////////////////////////////////////////////////
114 // WindowManagerApp, public: 77 // WindowManagerApp, public:
115 78
116 WindowManagerApp::WindowManagerApp( 79 WindowManagerApp::WindowManagerApp(
117 ViewManagerDelegate* view_manager_delegate, 80 ViewManagerDelegate* view_manager_delegate,
118 WindowManagerDelegate* window_manager_delegate) 81 WindowManagerDelegate* window_manager_delegate)
119 : window_manager_service_factory_(this), 82 : window_manager_service_factory_(this),
120 wrapped_view_manager_delegate_(view_manager_delegate), 83 wrapped_view_manager_delegate_(view_manager_delegate),
121 wrapped_window_manager_delegate_(window_manager_delegate), 84 wrapped_window_manager_delegate_(window_manager_delegate),
122 view_manager_(NULL), 85 view_manager_(NULL),
123 root_(NULL), 86 root_(NULL),
124 dummy_delegate_(new DummyDelegate) { 87 dummy_delegate_(new DummyDelegate) {
125 } 88 }
126 89
127 WindowManagerApp::~WindowManagerApp() {} 90 WindowManagerApp::~WindowManagerApp() {}
128 91
129 // static 92 // static
130 View* WindowManagerApp::GetViewForWindow(aura::Window* window) { 93 View* WindowManagerApp::GetViewForWindow(aura::Window* window) {
131 return window->GetProperty(kViewKey); 94 return window->GetProperty(kViewKey);
132 } 95 }
133 96
97 aura::Window* WindowManagerApp::GetWindowForViewId(Id view) const {
98 ViewIdToWindowMap::const_iterator it = view_id_to_window_map_.find(view);
99 return it != view_id_to_window_map_.end() ? it->second : NULL;
100 }
101
134 void WindowManagerApp::AddConnection(WindowManagerServiceImpl* connection) { 102 void WindowManagerApp::AddConnection(WindowManagerServiceImpl* connection) {
135 DCHECK(connections_.find(connection) == connections_.end()); 103 DCHECK(connections_.find(connection) == connections_.end());
136 connections_.insert(connection); 104 connections_.insert(connection);
137 } 105 }
138 106
139 void WindowManagerApp::RemoveConnection(WindowManagerServiceImpl* connection) { 107 void WindowManagerApp::RemoveConnection(WindowManagerServiceImpl* connection) {
140 DCHECK(connections_.find(connection) != connections_.end()); 108 DCHECK(connections_.find(connection) != connections_.end());
141 connections_.erase(connection); 109 connections_.erase(connection);
142 } 110 }
143 111
(...skipping 12 matching lines...) Expand all
156 void WindowManagerApp::ActivateWindow(Id view) { 124 void WindowManagerApp::ActivateWindow(Id view) {
157 aura::Window* window = GetWindowForViewId(view); 125 aura::Window* window = GetWindowForViewId(view);
158 DCHECK(window); 126 DCHECK(window);
159 activation_client_->ActivateWindow(window); 127 activation_client_->ActivateWindow(window);
160 } 128 }
161 129
162 bool WindowManagerApp::IsReady() const { 130 bool WindowManagerApp::IsReady() const {
163 return view_manager_ && root_; 131 return view_manager_ && root_;
164 } 132 }
165 133
134 void WindowManagerApp::InitFocus(wm::FocusRules* rules) {
135 wm::FocusController* focus_controller = new wm::FocusController(rules);
136 activation_client_ = focus_controller;
137 focus_client_.reset(focus_controller);
138 aura::client::SetFocusClient(window_tree_host_->window(), focus_controller);
139 aura::client::SetActivationClient(window_tree_host_->window(),
140 focus_controller);
141
142 focus_client_->AddObserver(this);
143 activation_client_->AddObserver(this);
144 }
145
166 //////////////////////////////////////////////////////////////////////////////// 146 ////////////////////////////////////////////////////////////////////////////////
167 // WindowManagerApp, ApplicationDelegate implementation: 147 // WindowManagerApp, ApplicationDelegate implementation:
168 148
169 void WindowManagerApp::Initialize(ApplicationImpl* impl) { 149 void WindowManagerApp::Initialize(ApplicationImpl* impl) {
170 aura_init_.reset(new AuraInit); 150 aura_init_.reset(new AuraInit);
171 view_manager_client_factory_.reset( 151 view_manager_client_factory_.reset(
172 new ViewManagerClientFactory(impl->shell(), this)); 152 new ViewManagerClientFactory(impl->shell(), this));
173 } 153 }
174 154
175 bool WindowManagerApp::ConfigureIncomingConnection( 155 bool WindowManagerApp::ConfigureIncomingConnection(
(...skipping 16 matching lines...) Expand all
192 root_ = root; 172 root_ = root;
193 173
194 window_tree_host_.reset(new WindowTreeHostMojo(root_, this)); 174 window_tree_host_.reset(new WindowTreeHostMojo(root_, this));
195 window_tree_host_->window()->SetBounds(root->bounds()); 175 window_tree_host_->window()->SetBounds(root->bounds());
196 window_tree_host_->window()->Show(); 176 window_tree_host_->window()->Show();
197 177
198 RegisterSubtree(root_, window_tree_host_->window()); 178 RegisterSubtree(root_, window_tree_host_->window());
199 179
200 capture_client_.reset( 180 capture_client_.reset(
201 new wm::ScopedCaptureClient(window_tree_host_->window())); 181 new wm::ScopedCaptureClient(window_tree_host_->window()));
202 wm::FocusController* focus_controller =
203 new wm::FocusController(new WMFocusRules);
204 activation_client_ = focus_controller;
205 focus_client_.reset(focus_controller);
206 aura::client::SetFocusClient(window_tree_host_->window(), focus_controller);
207
208 focus_client_->AddObserver(this);
209 activation_client_->AddObserver(this);
210 182
211 if (wrapped_view_manager_delegate_) { 183 if (wrapped_view_manager_delegate_) {
212 wrapped_view_manager_delegate_->OnEmbed( 184 wrapped_view_manager_delegate_->OnEmbed(
213 view_manager, root, exported_services, imported_services.Pass()); 185 view_manager, root, exported_services, imported_services.Pass());
214 } 186 }
215 187
216 for (Connections::const_iterator it = connections_.begin(); 188 for (Connections::const_iterator it = connections_.begin();
217 it != connections_.end(); ++it) { 189 it != connections_.end(); ++it) {
218 (*it)->NotifyReady(); 190 (*it)->NotifyReady();
219 } 191 }
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 //////////////////////////////////////////////////////////////////////////////// 292 ////////////////////////////////////////////////////////////////////////////////
321 // WindowManagerApp, aura::client::ActivationChangeObserver implementation: 293 // WindowManagerApp, aura::client::ActivationChangeObserver implementation:
322 294
323 void WindowManagerApp::OnWindowActivated(aura::Window* gained_active, 295 void WindowManagerApp::OnWindowActivated(aura::Window* gained_active,
324 aura::Window* lost_active) { 296 aura::Window* lost_active) {
325 for (Connections::const_iterator it = connections_.begin(); 297 for (Connections::const_iterator it = connections_.begin();
326 it != connections_.end(); ++it) { 298 it != connections_.end(); ++it) {
327 (*it)->NotifyWindowActivated(GetIdForWindow(gained_active), 299 (*it)->NotifyWindowActivated(GetIdForWindow(gained_active),
328 GetIdForWindow(lost_active)); 300 GetIdForWindow(lost_active));
329 } 301 }
302 View* view = GetViewForWindow(gained_active);
sky 2014/09/26 23:01:41 Can't gained_active be NULL.
303 view->MoveToFront();
330 } 304 }
331 305
332 //////////////////////////////////////////////////////////////////////////////// 306 ////////////////////////////////////////////////////////////////////////////////
333 // WindowManagerApp, private: 307 // WindowManagerApp, private:
334 308
335 aura::Window* WindowManagerApp::GetWindowForViewId(Id view) const {
336 ViewIdToWindowMap::const_iterator it = view_id_to_window_map_.find(view);
337 return it != view_id_to_window_map_.end() ? it->second : NULL;
338 }
339
340 void WindowManagerApp::RegisterSubtree(View* view, aura::Window* parent) { 309 void WindowManagerApp::RegisterSubtree(View* view, aura::Window* parent) {
341 view->AddObserver(this); 310 view->AddObserver(this);
342 DCHECK(view_id_to_window_map_.find(view->id()) == 311 DCHECK(view_id_to_window_map_.find(view->id()) ==
343 view_id_to_window_map_.end()); 312 view_id_to_window_map_.end());
344 aura::Window* window = new aura::Window(dummy_delegate_.get()); 313 aura::Window* window = new aura::Window(dummy_delegate_.get());
345 window->set_id(view->id()); 314 window->set_id(view->id());
346 window->SetProperty(kViewKey, view); 315 window->SetProperty(kViewKey, view);
347 // All events pass through the root during dispatch, so we only need a handler 316 // All events pass through the root during dispatch, so we only need a handler
348 // installed there. 317 // installed there.
349 if (view == root_) 318 if (view == root_)
(...skipping 12 matching lines...) Expand all
362 ViewIdToWindowMap::iterator it = view_id_to_window_map_.find(view->id()); 331 ViewIdToWindowMap::iterator it = view_id_to_window_map_.find(view->id());
363 DCHECK(it != view_id_to_window_map_.end()); 332 DCHECK(it != view_id_to_window_map_.end());
364 scoped_ptr<aura::Window> window(it->second); 333 scoped_ptr<aura::Window> window(it->second);
365 view_id_to_window_map_.erase(it); 334 view_id_to_window_map_.erase(it);
366 View::Children::const_iterator child = view->children().begin(); 335 View::Children::const_iterator child = view->children().begin();
367 for (; child != view->children().end(); ++child) 336 for (; child != view->children().end(); ++child)
368 UnregisterSubtree(*child); 337 UnregisterSubtree(*child);
369 } 338 }
370 339
371 } // namespace mojo 340 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698