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

Side by Side Diff: athena/screen/screen_manager_impl.cc

Issue 414903002: Introduce 'grab_inputs' property for athena container. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix Created 6 years, 5 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 | Annotate | Revision Log
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 "athena/screen/public/screen_manager.h" 5 #include "athena/screen/public/screen_manager.h"
6 6
7 #include "athena/common/container_priorities.h" 7 #include "athena/common/container_priorities.h"
8 #include "athena/common/fill_layout_manager.h" 8 #include "athena/common/fill_layout_manager.h"
9 #include "athena/input/public/accelerator_manager.h" 9 #include "athena/input/public/accelerator_manager.h"
10 #include "athena/screen/background_controller.h" 10 #include "athena/screen/background_controller.h"
11 #include "athena/screen/screen_accelerator_handler.h" 11 #include "athena/screen/screen_accelerator_handler.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/memory/scoped_ptr.h" 13 #include "base/memory/scoped_ptr.h"
14 #include "ui/aura/client/screen_position_client.h" 14 #include "ui/aura/client/screen_position_client.h"
15 #include "ui/aura/client/window_tree_client.h" 15 #include "ui/aura/client/window_tree_client.h"
16 #include "ui/aura/layout_manager.h" 16 #include "ui/aura/layout_manager.h"
17 #include "ui/aura/window.h" 17 #include "ui/aura/window.h"
18 #include "ui/aura/window_property.h" 18 #include "ui/aura/window_property.h"
19 #include "ui/aura/window_targeter.h"
19 #include "ui/aura/window_tree_host.h" 20 #include "ui/aura/window_tree_host.h"
20 #include "ui/wm/core/base_focus_rules.h" 21 #include "ui/wm/core/base_focus_rules.h"
21 #include "ui/wm/core/capture_controller.h" 22 #include "ui/wm/core/capture_controller.h"
22 23
23 namespace athena { 24 namespace athena {
24 namespace { 25 namespace {
25 26
26 DEFINE_OWNED_WINDOW_PROPERTY_KEY(ScreenManager::ContainerParams, 27 DEFINE_OWNED_WINDOW_PROPERTY_KEY(ScreenManager::ContainerParams,
27 kContainerParamsKey, 28 kContainerParamsKey,
28 NULL); 29 NULL);
29 30
30 ScreenManager* instance = NULL; 31 ScreenManager* instance = NULL;
31 32
33 bool DoesGrabInput(aura::Window* container) {
oshima 2014/07/24 18:12:48 Or GrabsInput (whichever you like).
Jun Mukai 2014/07/24 18:57:25 Done.
34 ScreenManager::ContainerParams* params =
35 container->GetProperty(kContainerParamsKey);
36 return params && params->grab_inputs;
37 }
38
32 class AthenaFocusRules : public wm::BaseFocusRules { 39 class AthenaFocusRules : public wm::BaseFocusRules {
33 public: 40 public:
34 AthenaFocusRules() {} 41 AthenaFocusRules() {}
35 virtual ~AthenaFocusRules() {} 42 virtual ~AthenaFocusRules() {}
36 43
37 // wm::BaseFocusRules: 44 // wm::BaseFocusRules:
38 virtual bool SupportsChildActivation(aura::Window* window) const OVERRIDE { 45 virtual bool SupportsChildActivation(aura::Window* window) const OVERRIDE {
39 ScreenManager::ContainerParams* params = 46 ScreenManager::ContainerParams* params =
40 window->GetProperty(kContainerParamsKey); 47 window->GetProperty(kContainerParamsKey);
41 return params && params->can_activate_children; 48 return params && params->can_activate_children;
42 } 49 }
50 virtual bool CanActivateWindow(aura::Window* window) const OVERRIDE {
51 // Check if other containers have 'grab_inputs' fields.
52 bool other_has_grab = false;
53 if (window) {
54 const aura::Window::Windows& containers =
55 window->GetRootWindow()->children();
56 for (size_t i = 0; i < containers.size(); ++i) {
57 ScreenManager::ContainerParams* params =
58 containers[i]->GetProperty(kContainerParamsKey);
59 if (!containers[i]->Contains(window) && params && params->grab_inputs) {
60 other_has_grab = true;
61 break;
62 }
oshima 2014/07/24 18:12:48 I wonder if we need to allow a window in higher z-
Jun Mukai 2014/07/24 18:57:26 Done.
63 }
64 }
65 return !other_has_grab && BaseFocusRules::CanActivateWindow(window);
66 }
43 67
44 private: 68 private:
45 DISALLOW_COPY_AND_ASSIGN(AthenaFocusRules); 69 DISALLOW_COPY_AND_ASSIGN(AthenaFocusRules);
46 }; 70 };
47 71
48 class AthenaWindowTreeClient : public aura::client::WindowTreeClient { 72 class AthenaWindowTreeClient : public aura::client::WindowTreeClient {
49 public: 73 public:
50 explicit AthenaWindowTreeClient(aura::Window* container) 74 explicit AthenaWindowTreeClient(aura::Window* container)
51 : container_(container) {} 75 : container_(container) {}
52 76
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 118
95 virtual void SetBounds(aura::Window* window, 119 virtual void SetBounds(aura::Window* window,
96 const gfx::Rect& bounds, 120 const gfx::Rect& bounds,
97 const gfx::Display& display) OVERRIDE { 121 const gfx::Display& display) OVERRIDE {
98 window->SetBounds(bounds); 122 window->SetBounds(bounds);
99 } 123 }
100 124
101 DISALLOW_COPY_AND_ASSIGN(AthenaScreenPositionClient); 125 DISALLOW_COPY_AND_ASSIGN(AthenaScreenPositionClient);
102 }; 126 };
103 127
128 class AthenaEventTargeter : public aura::WindowTargeter,
129 public aura::WindowObserver {
130 public:
131 AthenaEventTargeter(aura::Window* container)
oshima 2014/07/24 18:12:48 nit: explicit
Jun Mukai 2014/07/24 18:57:26 Done.
132 : container_(container) {
133 container_->AddObserver(this);
134 }
135
136 virtual ~AthenaEventTargeter() {
137 // Removed before the container is removed.
138 if (container_)
139 container_->RemoveObserver(this);
140 }
141
142 private:
143 // aura::WindowTargeter:
144 virtual bool SubtreeCanAcceptEvent(
145 ui::EventTarget* target,
146 const ui::LocatedEvent& event) const OVERRIDE {
147 aura::Window* window = static_cast<aura::Window*>(target);
148 const aura::Window::Windows& containers =
149 container_->GetRootWindow()->children();
150 aura::Window::Windows::const_iterator iter =
151 std::find(containers.begin(), containers.end(), container_);
152 DCHECK(iter != containers.end());
153 for (; iter != containers.end(); ++iter) {
154 if ((*iter)->Contains(window))
155 return true;
156 }
157 return false;
158 }
159
160 // aura::WindowObserver:
161 virtual void OnWindowDestroying(aura::Window* window) OVERRIDE {
162 aura::Window* root_window = container_->GetRootWindow();
163 DCHECK_EQ(window, container_);
164 DCHECK_EQ(
165 this, static_cast<ui::EventTarget*>(root_window)->GetEventTargeter());
166
167 container_->RemoveObserver(this);
168 container_ = NULL;
169
170 // This will remove myself.
171 root_window->SetEventTargeter(scoped_ptr<ui::EventTargeter>());
172 }
173
174 aura::Window* container_;
175
176 DISALLOW_COPY_AND_ASSIGN(AthenaEventTargeter);
177 };
178
104 class ScreenManagerImpl : public ScreenManager { 179 class ScreenManagerImpl : public ScreenManager {
105 public: 180 public:
106 explicit ScreenManagerImpl(aura::Window* root_window); 181 explicit ScreenManagerImpl(aura::Window* root_window);
107 virtual ~ScreenManagerImpl(); 182 virtual ~ScreenManagerImpl();
108 183
109 void Init(); 184 void Init();
110 185
111 private: 186 private:
112 // ScreenManager: 187 // ScreenManager:
113 virtual aura::Window* CreateDefaultContainer( 188 virtual aura::Window* CreateDefaultContainer(
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 #if !defined(NDEBUG) 276 #if !defined(NDEBUG)
202 DCHECK(std::find_if(children.begin(), 277 DCHECK(std::find_if(children.begin(),
203 children.end(), 278 children.end(),
204 PriorityMatcher(params.z_order_priority)) 279 PriorityMatcher(params.z_order_priority))
205 == children.end()) 280 == children.end())
206 << "The container with the priority " 281 << "The container with the priority "
207 << params.z_order_priority << " already exists."; 282 << params.z_order_priority << " already exists.";
208 #endif 283 #endif
209 284
210 container->SetProperty(kContainerParamsKey, new ContainerParams(params)); 285 container->SetProperty(kContainerParamsKey, new ContainerParams(params));
286
287 // If another container is already grabbing the input, SetEventTargeter
288 // implicitly release the grabbing and remove the EventTargeter instance.
289 // TODO(mukai|oshima): think about the ideal behavior of multiple grabbing
290 // and implement it.
291 if (params.grab_inputs) {
292 DCHECK(std::find_if(children.begin(), children.end(), &DoesGrabInput)
293 == children.end());
oshima 2014/07/24 18:12:48 add message << "input has already been grabbed by
Jun Mukai 2014/07/24 18:57:26 Done.
294 root_window_->SetEventTargeter(
295 scoped_ptr<ui::EventTargeter>(new AthenaEventTargeter(container)));
296 }
297
211 root_window_->AddChild(container); 298 root_window_->AddChild(container);
212 299
213 aura::Window::Windows::const_iterator iter = 300 aura::Window::Windows::const_iterator iter =
214 std::find_if(children.begin(), 301 std::find_if(children.begin(),
215 children.end(), 302 children.end(),
216 HigherPriorityFinder(params.z_order_priority)); 303 HigherPriorityFinder(params.z_order_priority));
217 if (iter != children.end()) 304 if (iter != children.end())
218 root_window_->StackChildBelow(container, *iter); 305 root_window_->StackChildBelow(container, *iter);
219 306
220 container->Show(); 307 container->Show();
221 return container; 308 return container;
222 } 309 }
223 310
224 void ScreenManagerImpl::SetBackgroundImage(const gfx::ImageSkia& image) { 311 void ScreenManagerImpl::SetBackgroundImage(const gfx::ImageSkia& image) {
225 background_controller_->SetImage(image); 312 background_controller_->SetImage(image);
226 } 313 }
227 314
228 } // namespace 315 } // namespace
229 316
230 ScreenManager::ContainerParams::ContainerParams(const std::string& n, 317 ScreenManager::ContainerParams::ContainerParams(const std::string& n,
231 int priority) 318 int priority)
232 : name(n), can_activate_children(false), z_order_priority(priority) { 319 : name(n),
320 can_activate_children(false),
321 grab_inputs(false),
322 z_order_priority(priority) {
233 } 323 }
234 324
235 // static 325 // static
236 ScreenManager* ScreenManager::Create(aura::Window* root_window) { 326 ScreenManager* ScreenManager::Create(aura::Window* root_window) {
237 (new ScreenManagerImpl(root_window))->Init(); 327 (new ScreenManagerImpl(root_window))->Init();
238 DCHECK(instance); 328 DCHECK(instance);
239 return instance; 329 return instance;
240 } 330 }
241 331
242 // static 332 // static
243 ScreenManager* ScreenManager::Get() { 333 ScreenManager* ScreenManager::Get() {
244 DCHECK(instance); 334 DCHECK(instance);
245 return instance; 335 return instance;
246 } 336 }
247 337
248 // static 338 // static
249 void ScreenManager::Shutdown() { 339 void ScreenManager::Shutdown() {
250 DCHECK(instance); 340 DCHECK(instance);
251 delete instance; 341 delete instance;
252 DCHECK(!instance); 342 DCHECK(!instance);
253 } 343 }
254 344
255 // static 345 // static
256 wm::FocusRules* ScreenManager::CreateFocusRules() { 346 wm::FocusRules* ScreenManager::CreateFocusRules() {
257 return new AthenaFocusRules(); 347 return new AthenaFocusRules();
258 } 348 }
259 349
260 } // namespace athena 350 } // namespace athena
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698