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 "athena/screen/public/screen_manager.h" | 5 #include "athena/screen/public/screen_manager.h" |
6 | 6 |
7 #include "athena/input/public/accelerator_manager.h" | 7 #include "athena/input/public/accelerator_manager.h" |
8 #include "athena/screen/screen_accelerator_handler.h" | 8 #include "athena/screen/screen_accelerator_handler.h" |
9 #include "athena/util/container_priorities.h" | 9 #include "athena/util/container_priorities.h" |
10 #include "athena/util/fill_layout_manager.h" | 10 #include "athena/util/fill_layout_manager.h" |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 : container_(container) { | 147 : container_(container) { |
148 container_->AddObserver(this); | 148 container_->AddObserver(this); |
149 } | 149 } |
150 | 150 |
151 virtual ~AthenaEventTargeter() { | 151 virtual ~AthenaEventTargeter() { |
152 // Removed before the container is removed. | 152 // Removed before the container is removed. |
153 if (container_) | 153 if (container_) |
154 container_->RemoveObserver(this); | 154 container_->RemoveObserver(this); |
155 } | 155 } |
156 | 156 |
| 157 void SetPreviousEventTargeter(scoped_ptr<ui::EventTargeter> targeter) { |
| 158 previous_root_event_targeter_ = targeter.Pass(); |
| 159 } |
| 160 |
157 private: | 161 private: |
158 // aura::WindowTargeter: | 162 // aura::WindowTargeter: |
159 virtual bool SubtreeCanAcceptEvent( | 163 virtual bool SubtreeCanAcceptEvent( |
160 ui::EventTarget* target, | 164 ui::EventTarget* target, |
161 const ui::LocatedEvent& event) const override { | 165 const ui::LocatedEvent& event) const override { |
162 aura::Window* window = static_cast<aura::Window*>(target); | 166 aura::Window* window = static_cast<aura::Window*>(target); |
163 const aura::Window::Windows& containers = | 167 const aura::Window::Windows& containers = |
164 container_->GetRootWindow()->children(); | 168 container_->GetRootWindow()->children(); |
165 aura::Window::Windows::const_iterator iter = | 169 aura::Window::Windows::const_iterator iter = |
166 std::find(containers.begin(), containers.end(), container_); | 170 std::find(containers.begin(), containers.end(), container_); |
167 DCHECK(iter != containers.end()); | 171 DCHECK(iter != containers.end()); |
168 for (; iter != containers.end(); ++iter) { | 172 for (; iter != containers.end(); ++iter) { |
169 if ((*iter)->Contains(window)) | 173 if ((*iter)->Contains(window)) |
170 return true; | 174 return true; |
171 } | 175 } |
172 return false; | 176 return false; |
173 } | 177 } |
174 | 178 |
175 // aura::WindowObserver: | 179 // aura::WindowObserver: |
176 virtual void OnWindowDestroying(aura::Window* window) override { | 180 virtual void OnWindowDestroying(aura::Window* window) override { |
177 aura::Window* root_window = container_->GetRootWindow(); | 181 aura::Window* root_window = container_->GetRootWindow(); |
178 DCHECK_EQ(window, container_); | 182 DCHECK_EQ(window, container_); |
179 DCHECK_EQ( | 183 DCHECK_EQ( |
180 this, static_cast<ui::EventTarget*>(root_window)->GetEventTargeter()); | 184 this, static_cast<ui::EventTarget*>(root_window)->GetEventTargeter()); |
181 | 185 |
182 container_->RemoveObserver(this); | 186 container_->RemoveObserver(this); |
183 container_ = NULL; | 187 container_ = NULL; |
184 | 188 |
185 // This will remove myself. | 189 // This will remove myself. |
186 root_window->SetEventTargeter(scoped_ptr<ui::EventTargeter>()); | 190 root_window->SetEventTargeter(previous_root_event_targeter_.Pass()); |
187 } | 191 } |
188 | 192 |
189 aura::Window* container_; | 193 aura::Window* container_; |
| 194 scoped_ptr<ui::EventTargeter> previous_root_event_targeter_; |
190 | 195 |
191 DISALLOW_COPY_AND_ASSIGN(AthenaEventTargeter); | 196 DISALLOW_COPY_AND_ASSIGN(AthenaEventTargeter); |
192 }; | 197 }; |
193 | 198 |
194 class ScreenManagerImpl : public ScreenManager { | 199 class ScreenManagerImpl : public ScreenManager { |
195 public: | 200 public: |
196 explicit ScreenManagerImpl(aura::Window* root_window); | 201 explicit ScreenManagerImpl(aura::Window* root_window); |
197 virtual ~ScreenManagerImpl(); | 202 virtual ~ScreenManagerImpl(); |
198 | 203 |
199 void Init(); | 204 void Init(); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 container->SetProperty(kContainerParamsKey, new ContainerParams(params)); | 323 container->SetProperty(kContainerParamsKey, new ContainerParams(params)); |
319 | 324 |
320 // If another container is already grabbing the input, SetEventTargeter | 325 // If another container is already grabbing the input, SetEventTargeter |
321 // implicitly release the grabbing and remove the EventTargeter instance. | 326 // implicitly release the grabbing and remove the EventTargeter instance. |
322 // TODO(mukai|oshima): think about the ideal behavior of multiple grabbing | 327 // TODO(mukai|oshima): think about the ideal behavior of multiple grabbing |
323 // and implement it. | 328 // and implement it. |
324 if (params.grab_inputs) { | 329 if (params.grab_inputs) { |
325 DCHECK(std::find_if(children.begin(), children.end(), &GrabsInput) | 330 DCHECK(std::find_if(children.begin(), children.end(), &GrabsInput) |
326 == children.end()) | 331 == children.end()) |
327 << "input has already been grabbed by another container"; | 332 << "input has already been grabbed by another container"; |
328 root_window_->SetEventTargeter( | 333 AthenaEventTargeter* athena_event_targeter = |
329 scoped_ptr<ui::EventTargeter>(new AthenaEventTargeter(container))); | 334 new AthenaEventTargeter(container); |
| 335 athena_event_targeter->SetPreviousEventTargeter( |
| 336 root_window_->SetEventTargeter( |
| 337 scoped_ptr<ui::EventTargeter>(athena_event_targeter))); |
330 } | 338 } |
331 | 339 |
332 root_window_->AddChild(container); | 340 root_window_->AddChild(container); |
333 | 341 |
334 aura::Window::Windows::const_iterator iter = | 342 aura::Window::Windows::const_iterator iter = |
335 std::find_if(children.begin(), | 343 std::find_if(children.begin(), |
336 children.end(), | 344 children.end(), |
337 HigherPriorityFinder(params.z_order_priority)); | 345 HigherPriorityFinder(params.z_order_priority)); |
338 if (iter != children.end()) | 346 if (iter != children.end()) |
339 root_window_->StackChildBelow(container, *iter); | 347 root_window_->StackChildBelow(container, *iter); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
385 } | 393 } |
386 | 394 |
387 // static | 395 // static |
388 void ScreenManager::Shutdown() { | 396 void ScreenManager::Shutdown() { |
389 DCHECK(instance); | 397 DCHECK(instance); |
390 delete instance; | 398 delete instance; |
391 DCHECK(!instance); | 399 DCHECK(!instance); |
392 } | 400 } |
393 | 401 |
394 } // namespace athena | 402 } // namespace athena |
OLD | NEW |