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/input/accelerator_manager_impl.h" | 5 #include "athena/input/accelerator_manager_impl.h" |
6 | 6 |
7 #include "athena/common/switches.h" | 7 #include "athena/common/switches.h" |
8 #include "athena/input/public/input_manager.h" | 8 #include "athena/input/public/input_manager.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "ui/aura/window.h" | 10 #include "ui/aura/window.h" |
11 #include "ui/base/accelerators/accelerator_manager.h" | 11 #include "ui/base/accelerators/accelerator_manager.h" |
12 #include "ui/events/event.h" | 12 #include "ui/events/event.h" |
13 #include "ui/events/event_target.h" | 13 #include "ui/events/event_target.h" |
14 #include "ui/views/focus/focus_manager.h" | 14 #include "ui/views/focus/focus_manager.h" |
15 #include "ui/views/focus/focus_manager_delegate.h" | 15 #include "ui/views/focus/focus_manager_delegate.h" |
16 #include "ui/views/focus/focus_manager_factory.h" | 16 #include "ui/views/focus/focus_manager_factory.h" |
17 #include "ui/wm/core/accelerator_delegate.h" | 17 #include "ui/wm/core/accelerator_delegate.h" |
18 #include "ui/wm/core/accelerator_filter.h" | 18 #include "ui/wm/core/accelerator_filter.h" |
19 #include "ui/wm/core/nested_accelerator_controller.h" | 19 #include "ui/wm/core/nested_accelerator_controller.h" |
20 #include "ui/wm/core/nested_accelerator_delegate.h" | 20 #include "ui/wm/core/nested_accelerator_delegate.h" |
21 #include "ui/wm/public/dispatcher_client.h" | 21 #include "ui/wm/public/dispatcher_client.h" |
22 | 22 |
23 namespace athena { | 23 namespace athena { |
24 | 24 |
| 25 // This wrapper interface provides a common interface that handles global |
| 26 // accelerators as well as local accelerators. |
| 27 class AcceleratorManagerImpl::AcceleratorWrapper { |
| 28 public: |
| 29 virtual ~AcceleratorWrapper() {} |
| 30 virtual void Register(const ui::Accelerator& accelerator, |
| 31 ui::AcceleratorTarget* target) = 0; |
| 32 virtual bool Process(const ui::Accelerator& accelerator) = 0; |
| 33 virtual ui::AcceleratorTarget* GetCurrentTarget( |
| 34 const ui::Accelerator& accelertor) const = 0; |
| 35 }; |
| 36 |
25 namespace { | 37 namespace { |
26 | 38 |
27 // Accelerators inside nested message loop are handled by | 39 // Accelerators inside nested message loop are handled by |
28 // wm::NestedAcceleratorController while accelerators in normal case are | 40 // wm::NestedAcceleratorController while accelerators in normal case are |
29 // handled by wm::AcceleratorFilter. These delegates act bridges in these | 41 // handled by wm::AcceleratorFilter. These delegates act bridges in these |
30 // two different environment so that AcceleratorManagerImpl can handle | 42 // two different environment so that AcceleratorManagerImpl can handle |
31 // accelerators in an uniform way. | 43 // accelerators in an uniform way. |
32 | 44 |
33 class NestedAcceleratorDelegate : public wm::NestedAcceleratorDelegate { | 45 class NestedAcceleratorDelegate : public wm::NestedAcceleratorDelegate { |
34 public: | 46 public: |
(...skipping 21 matching lines...) Expand all Loading... |
56 : accelerator_manager_(accelerator_manager) {} | 68 : accelerator_manager_(accelerator_manager) {} |
57 virtual ~AcceleratorDelegate() {} | 69 virtual ~AcceleratorDelegate() {} |
58 | 70 |
59 private: | 71 private: |
60 // wm::AcceleratorDelegate: | 72 // wm::AcceleratorDelegate: |
61 virtual bool ProcessAccelerator(const ui::KeyEvent& event, | 73 virtual bool ProcessAccelerator(const ui::KeyEvent& event, |
62 const ui::Accelerator& accelerator, | 74 const ui::Accelerator& accelerator, |
63 KeyType key_type) OVERRIDE { | 75 KeyType key_type) OVERRIDE { |
64 aura::Window* target = static_cast<aura::Window*>(event.target()); | 76 aura::Window* target = static_cast<aura::Window*>(event.target()); |
65 if (!target->IsRootWindow() && | 77 if (!target->IsRootWindow() && |
66 !accelerator_manager_->IsReserved(accelerator)) { | 78 !accelerator_manager_->IsRegistered(accelerator, AF_RESERVED)) { |
67 // TODO(oshima): do the same when the active window is in fullscreen. | 79 // TODO(oshima): do the same when the active window is in fullscreen. |
68 return false; | 80 return false; |
69 } | 81 } |
70 return accelerator_manager_->Process(accelerator); | 82 return accelerator_manager_->Process(accelerator); |
71 } | 83 } |
72 | 84 |
73 AcceleratorManagerImpl* accelerator_manager_; | 85 AcceleratorManagerImpl* accelerator_manager_; |
74 DISALLOW_COPY_AND_ASSIGN(AcceleratorDelegate); | 86 DISALLOW_COPY_AND_ASSIGN(AcceleratorDelegate); |
75 }; | 87 }; |
76 | 88 |
77 class FocusManagerDelegate : public views::FocusManagerDelegate { | 89 class FocusManagerDelegate : public views::FocusManagerDelegate { |
78 public: | 90 public: |
79 explicit FocusManagerDelegate(AcceleratorManagerImpl* accelerator_manager) | 91 explicit FocusManagerDelegate(AcceleratorManagerImpl* accelerator_manager) |
80 : accelerator_manager_(accelerator_manager) {} | 92 : accelerator_manager_(accelerator_manager) {} |
81 virtual ~FocusManagerDelegate() {} | 93 virtual ~FocusManagerDelegate() {} |
82 | 94 |
83 virtual bool ProcessAccelerator(const ui::Accelerator& accelerator) OVERRIDE { | 95 virtual bool ProcessAccelerator(const ui::Accelerator& accelerator) OVERRIDE { |
84 return accelerator_manager_->Process(accelerator); | 96 return accelerator_manager_->Process(accelerator); |
85 } | 97 } |
86 | 98 |
87 virtual ui::AcceleratorTarget* GetCurrentTargetForAccelerator( | 99 virtual ui::AcceleratorTarget* GetCurrentTargetForAccelerator( |
88 const ui::Accelerator& accelerator) const OVERRIDE { | 100 const ui::Accelerator& accelerator) const OVERRIDE { |
89 return accelerator_manager_->IsRegistered(accelerator) | 101 return accelerator_manager_->IsRegistered(accelerator, AF_NONE) |
90 ? accelerator_manager_ | 102 ? accelerator_manager_ |
91 : NULL; | 103 : NULL; |
92 } | 104 } |
93 | 105 |
94 private: | 106 private: |
95 AcceleratorManagerImpl* accelerator_manager_; | 107 AcceleratorManagerImpl* accelerator_manager_; |
96 | 108 |
97 DISALLOW_COPY_AND_ASSIGN(FocusManagerDelegate); | 109 DISALLOW_COPY_AND_ASSIGN(FocusManagerDelegate); |
98 }; | 110 }; |
99 | 111 |
(...skipping 14 matching lines...) Expand all Loading... |
114 widget, | 126 widget, |
115 desktop_widget ? NULL : new FocusManagerDelegate(accelerator_manager_)); | 127 desktop_widget ? NULL : new FocusManagerDelegate(accelerator_manager_)); |
116 } | 128 } |
117 | 129 |
118 private: | 130 private: |
119 AcceleratorManagerImpl* accelerator_manager_; | 131 AcceleratorManagerImpl* accelerator_manager_; |
120 | 132 |
121 DISALLOW_COPY_AND_ASSIGN(FocusManagerFactory); | 133 DISALLOW_COPY_AND_ASSIGN(FocusManagerFactory); |
122 }; | 134 }; |
123 | 135 |
| 136 class UIAcceleratorManagerWrapper |
| 137 : public AcceleratorManagerImpl::AcceleratorWrapper { |
| 138 public: |
| 139 UIAcceleratorManagerWrapper() |
| 140 : ui_accelerator_manager_(new ui::AcceleratorManager) {} |
| 141 virtual ~UIAcceleratorManagerWrapper() {} |
| 142 |
| 143 virtual void Register(const ui::Accelerator& accelerator, |
| 144 ui::AcceleratorTarget* target) OVERRIDE { |
| 145 return ui_accelerator_manager_->Register( |
| 146 accelerator, ui::AcceleratorManager::kNormalPriority, target); |
| 147 } |
| 148 |
| 149 virtual bool Process(const ui::Accelerator& accelerator) OVERRIDE { |
| 150 return ui_accelerator_manager_->Process(accelerator); |
| 151 } |
| 152 |
| 153 virtual ui::AcceleratorTarget* GetCurrentTarget( |
| 154 const ui::Accelerator& accelerator) const OVERRIDE { |
| 155 return ui_accelerator_manager_->GetCurrentTarget(accelerator); |
| 156 } |
| 157 |
| 158 private: |
| 159 scoped_ptr<ui::AcceleratorManager> ui_accelerator_manager_; |
| 160 |
| 161 DISALLOW_COPY_AND_ASSIGN(UIAcceleratorManagerWrapper); |
| 162 }; |
| 163 |
| 164 class FocusManagerWrapper : public AcceleratorManagerImpl::AcceleratorWrapper { |
| 165 public: |
| 166 explicit FocusManagerWrapper(views::FocusManager* focus_manager) |
| 167 : focus_manager_(focus_manager) {} |
| 168 virtual ~FocusManagerWrapper() {} |
| 169 |
| 170 virtual void Register(const ui::Accelerator& accelerator, |
| 171 ui::AcceleratorTarget* target) OVERRIDE { |
| 172 return focus_manager_->RegisterAccelerator( |
| 173 accelerator, ui::AcceleratorManager::kNormalPriority, target); |
| 174 } |
| 175 |
| 176 virtual bool Process(const ui::Accelerator& accelerator) OVERRIDE { |
| 177 NOTREACHED(); |
| 178 return true; |
| 179 } |
| 180 |
| 181 virtual ui::AcceleratorTarget* GetCurrentTarget( |
| 182 const ui::Accelerator& accelerator) const OVERRIDE { |
| 183 return focus_manager_->GetCurrentTargetForAccelerator(accelerator); |
| 184 } |
| 185 |
| 186 private: |
| 187 views::FocusManager* focus_manager_; |
| 188 |
| 189 DISALLOW_COPY_AND_ASSIGN(FocusManagerWrapper); |
| 190 }; |
| 191 |
124 } // namespace | 192 } // namespace |
125 | 193 |
126 class AcceleratorManagerImpl::InternalData { | 194 class AcceleratorManagerImpl::InternalData { |
127 public: | 195 public: |
128 InternalData(int command_id, AcceleratorHandler* handler, int flags) | 196 InternalData(int command_id, AcceleratorHandler* handler, int flags) |
129 : command_id_(command_id), handler_(handler), flags_(flags) {} | 197 : command_id_(command_id), handler_(handler), flags_(flags) {} |
130 | 198 |
131 bool IsNonAutoRepeatable() const { return flags_ & AF_NON_AUTO_REPEATABLE; } | 199 bool IsNonAutoRepeatable() const { return flags_ & AF_NON_AUTO_REPEATABLE; } |
132 bool IsDebug() const { return flags_ & AF_DEBUG; } | 200 bool IsDebug() const { return flags_ & AF_DEBUG; } |
133 bool IsReserved() const { return flags_ & AF_RESERVED; } | 201 int flags() const { return flags_; } |
134 | 202 |
135 bool IsCommandEnabled() const { | 203 bool IsCommandEnabled() const { |
136 return handler_->IsCommandEnabled(command_id_); | 204 return handler_->IsCommandEnabled(command_id_); |
137 } | 205 } |
138 | 206 |
139 bool OnAcceleratorFired(const ui::Accelerator& accelerator) { | 207 bool OnAcceleratorFired(const ui::Accelerator& accelerator) { |
140 return handler_->OnAcceleratorFired(command_id_, accelerator); | 208 return handler_->OnAcceleratorFired(command_id_, accelerator); |
141 } | 209 } |
142 | 210 |
143 private: | 211 private: |
144 int command_id_; | 212 int command_id_; |
145 AcceleratorHandler* handler_; | 213 AcceleratorHandler* handler_; |
146 int flags_; | 214 int flags_; |
147 | 215 |
148 // This class is copyable by design. | 216 // This class is copyable by design. |
149 }; | 217 }; |
150 | 218 |
151 AcceleratorManagerImpl::AcceleratorManagerImpl() | 219 // static |
152 : accelerator_manager_(new ui::AcceleratorManager), | 220 AcceleratorManagerImpl* |
153 debug_accelerators_enabled_(switches::IsDebugAcceleratorsEnabled()) { | 221 AcceleratorManagerImpl::CreateGlobalAcceleratorManager() { |
| 222 return new AcceleratorManagerImpl(new UIAcceleratorManagerWrapper()); |
| 223 } |
| 224 |
| 225 scoped_ptr<AcceleratorManager> AcceleratorManagerImpl::CreateForFocusManager( |
| 226 views::FocusManager* focus_manager) { |
| 227 return scoped_ptr<AcceleratorManager>( |
| 228 new AcceleratorManagerImpl(new FocusManagerWrapper(focus_manager))) |
| 229 .Pass(); |
154 } | 230 } |
155 | 231 |
156 AcceleratorManagerImpl::~AcceleratorManagerImpl() { | 232 AcceleratorManagerImpl::~AcceleratorManagerImpl() { |
157 nested_accelerator_controller_.reset(); | 233 nested_accelerator_controller_.reset(); |
158 accelerator_filter_.reset(); | 234 accelerator_filter_.reset(); |
159 // Reset to use the default focus manager because the athena's | 235 // Reset to use the default focus manager because the athena's |
160 // FocusManager has the reference to this object. | 236 // FocusManager has the reference to this object. |
161 views::FocusManagerFactory::Install(NULL); | 237 views::FocusManagerFactory::Install(NULL); |
162 } | 238 } |
163 | 239 |
(...skipping 10 matching lines...) Expand all Loading... |
174 accelerator_filter_.reset( | 250 accelerator_filter_.reset( |
175 new wm::AcceleratorFilter(accelerator_delegate.Pass())); | 251 new wm::AcceleratorFilter(accelerator_delegate.Pass())); |
176 toplevel->AddPreTargetHandler(accelerator_filter_.get()); | 252 toplevel->AddPreTargetHandler(accelerator_filter_.get()); |
177 } | 253 } |
178 | 254 |
179 void AcceleratorManagerImpl::OnRootWindowCreated(aura::Window* root_window) { | 255 void AcceleratorManagerImpl::OnRootWindowCreated(aura::Window* root_window) { |
180 aura::client::SetDispatcherClient(root_window, | 256 aura::client::SetDispatcherClient(root_window, |
181 nested_accelerator_controller_.get()); | 257 nested_accelerator_controller_.get()); |
182 } | 258 } |
183 | 259 |
184 bool AcceleratorManagerImpl::IsRegistered( | 260 bool AcceleratorManagerImpl::Process(const ui::Accelerator& accelerator) { |
185 const ui::Accelerator& accelerator) const { | 261 return accelerator_wrapper_->Process(accelerator); |
186 return accelerator_manager_->GetCurrentTarget(accelerator) != NULL; | |
187 } | 262 } |
188 | 263 |
189 bool AcceleratorManagerImpl::IsReserved( | 264 bool AcceleratorManagerImpl::IsRegistered(const ui::Accelerator& accelerator, |
190 const ui::Accelerator& accelerator) const { | 265 int flags) const { |
191 std::map<ui::Accelerator, InternalData>::const_iterator iter = | 266 std::map<ui::Accelerator, InternalData>::const_iterator iter = |
192 accelerators_.find(accelerator); | 267 accelerators_.find(accelerator); |
193 if (iter == accelerators_.end()) | 268 if (iter == accelerators_.end()) |
194 return false; | 269 return false; |
195 return iter->second.IsReserved(); | 270 DCHECK(accelerator_wrapper_->GetCurrentTarget(accelerator)); |
| 271 return flags == AF_NONE || iter->second.flags() & flags; |
196 } | 272 } |
197 | 273 |
198 bool AcceleratorManagerImpl::Process(const ui::Accelerator& accelerator) { | 274 AcceleratorManagerImpl::AcceleratorManagerImpl( |
199 return accelerator_manager_->Process(accelerator); | 275 AcceleratorWrapper* accelerator_wrapper) |
| 276 : accelerator_wrapper_(accelerator_wrapper), |
| 277 debug_accelerators_enabled_(switches::IsDebugAcceleratorsEnabled()) { |
200 } | 278 } |
201 | 279 |
202 void AcceleratorManagerImpl::RegisterAccelerators( | 280 void AcceleratorManagerImpl::RegisterAccelerators( |
203 const AcceleratorData accelerators[], | 281 const AcceleratorData accelerators[], |
204 size_t num_accelerators, | 282 size_t num_accelerators, |
205 AcceleratorHandler* handler) { | 283 AcceleratorHandler* handler) { |
206 for (size_t i = 0; i < num_accelerators; ++i) | 284 for (size_t i = 0; i < num_accelerators; ++i) |
207 RegisterAccelerator(accelerators[i], handler); | 285 RegisterAccelerator(accelerators[i], handler); |
208 } | 286 } |
209 | 287 |
(...skipping 21 matching lines...) Expand all Loading... |
231 } | 309 } |
232 | 310 |
233 void AcceleratorManagerImpl::RegisterAccelerator( | 311 void AcceleratorManagerImpl::RegisterAccelerator( |
234 const AcceleratorData& accelerator_data, | 312 const AcceleratorData& accelerator_data, |
235 AcceleratorHandler* handler) { | 313 AcceleratorHandler* handler) { |
236 ui::Accelerator accelerator(accelerator_data.keycode, | 314 ui::Accelerator accelerator(accelerator_data.keycode, |
237 accelerator_data.keyevent_flags); | 315 accelerator_data.keyevent_flags); |
238 accelerator.set_type(accelerator_data.trigger_event == TRIGGER_ON_PRESS | 316 accelerator.set_type(accelerator_data.trigger_event == TRIGGER_ON_PRESS |
239 ? ui::ET_KEY_PRESSED | 317 ? ui::ET_KEY_PRESSED |
240 : ui::ET_KEY_RELEASED); | 318 : ui::ET_KEY_RELEASED); |
241 accelerator_manager_->Register( | 319 accelerator_wrapper_->Register(accelerator, this); |
242 accelerator, ui::AcceleratorManager::kNormalPriority, this); | |
243 accelerators_.insert( | 320 accelerators_.insert( |
244 std::make_pair(accelerator, | 321 std::make_pair(accelerator, |
245 InternalData(accelerator_data.command_id, | 322 InternalData(accelerator_data.command_id, |
246 handler, | 323 handler, |
247 accelerator_data.accelerator_flags))); | 324 accelerator_data.accelerator_flags))); |
248 } | 325 } |
249 | 326 |
250 // static | 327 // static |
251 AcceleratorManager* AcceleratorManager::Get() { | 328 AcceleratorManager* AcceleratorManager::Get() { |
252 return InputManager::Get()->GetAcceleratorManager(); | 329 return InputManager::Get()->GetAcceleratorManager(); |
253 } | 330 } |
254 | 331 |
| 332 // static |
| 333 scoped_ptr<AcceleratorManager> AcceleratorManager::CreateForFocusManager( |
| 334 views::FocusManager* focus_manager) { |
| 335 return AcceleratorManagerImpl::CreateForFocusManager(focus_manager).Pass(); |
| 336 } |
| 337 |
255 } // namespace athena | 338 } // namespace athena |
OLD | NEW |