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

Side by Side Diff: athena/input/accelerator_manager_impl.cc

Issue 332443005: Enable accelerators on web activity window (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 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/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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698