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

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

Issue 322503005: Athena's FocusManager (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/input/public/input_manager.h" 8 #include "athena/input/public/input_manager.h"
8 #include "base/logging.h" 9 #include "base/logging.h"
9 #include "ui/aura/window.h" 10 #include "ui/aura/window.h"
10 #include "ui/base/accelerators/accelerator_manager.h" 11 #include "ui/base/accelerators/accelerator_manager.h"
11 #include "ui/events/event.h" 12 #include "ui/events/event.h"
12 #include "ui/events/event_target.h" 13 #include "ui/events/event_target.h"
14 #include "ui/views/focus/focus_manager.h"
15 #include "ui/views/focus/focus_manager_delegate.h"
16 #include "ui/views/focus/focus_manager_factory.h"
13 #include "ui/wm/core/accelerator_delegate.h" 17 #include "ui/wm/core/accelerator_delegate.h"
14 #include "ui/wm/core/accelerator_filter.h" 18 #include "ui/wm/core/accelerator_filter.h"
15 #include "ui/wm/core/nested_accelerator_controller.h" 19 #include "ui/wm/core/nested_accelerator_controller.h"
16 #include "ui/wm/core/nested_accelerator_delegate.h" 20 #include "ui/wm/core/nested_accelerator_delegate.h"
17 #include "ui/wm/public/dispatcher_client.h" 21 #include "ui/wm/public/dispatcher_client.h"
18 22
19 namespace athena { 23 namespace athena {
20 24
21 namespace { 25 namespace {
22 26
23 // Accelerators inside nested message loop are handled by 27 // Accelerators inside nested message loop are handled by
24 // wm::NestedAcceleratorController while accelerators in normal case are 28 // wm::NestedAcceleratorController while accelerators in normal case are
25 // handled by wm::AcceleratorFilter. These delegates act bridges in these 29 // handled by wm::AcceleratorFilter. These delegates act bridges in these
26 // two different environment so that AcceleratorManagerImpl can handle 30 // two different environment so that AcceleratorManagerImpl can handle
27 // accelerators in an uniform way. 31 // accelerators in an uniform way.
28 32
29 class NestedAcceleratorDelegate : public wm::NestedAcceleratorDelegate { 33 class NestedAcceleratorDelegate : public wm::NestedAcceleratorDelegate {
30 public: 34 public:
31 explicit NestedAcceleratorDelegate( 35 explicit NestedAcceleratorDelegate(
32 AcceleratorManagerImpl* accelerator_manager) 36 AcceleratorManagerImpl* accelerator_manager)
33 : accelerator_manager_(accelerator_manager) {} 37 : accelerator_manager_(accelerator_manager) {}
34 virtual ~NestedAcceleratorDelegate() {} 38 virtual ~NestedAcceleratorDelegate() {}
35 39
36 private: 40 private:
37 // wm::NestedAcceleratorDelegate: 41 // wm::NestedAcceleratorDelegate:
38 virtual Result ProcessAccelerator( 42 virtual Result ProcessAccelerator(
39 const ui::Accelerator& accelerator) OVERRIDE { 43 const ui::Accelerator& accelerator) OVERRIDE {
40 return accelerator_manager_->ProcessAccelerator(accelerator) 44 return accelerator_manager_->Process(accelerator) ? RESULT_PROCESSED
41 ? RESULT_PROCESSED 45 : RESULT_NOT_PROCESSED;
42 : RESULT_NOT_PROCESSED;
43 } 46 }
44 47
45 AcceleratorManagerImpl* accelerator_manager_; 48 AcceleratorManagerImpl* accelerator_manager_;
46 49
47 DISALLOW_COPY_AND_ASSIGN(NestedAcceleratorDelegate); 50 DISALLOW_COPY_AND_ASSIGN(NestedAcceleratorDelegate);
48 }; 51 };
49 52
50 class AcceleratorDelegate : public wm::AcceleratorDelegate { 53 class AcceleratorDelegate : public wm::AcceleratorDelegate {
51 public: 54 public:
52 explicit AcceleratorDelegate(AcceleratorManagerImpl* accelerator_manager) 55 explicit AcceleratorDelegate(AcceleratorManagerImpl* accelerator_manager)
53 : accelerator_manager_(accelerator_manager) {} 56 : accelerator_manager_(accelerator_manager) {}
54 virtual ~AcceleratorDelegate() {} 57 virtual ~AcceleratorDelegate() {}
55 58
56 private: 59 private:
57 // wm::AcceleratorDelegate: 60 // wm::AcceleratorDelegate:
58 virtual bool ProcessAccelerator(const ui::KeyEvent& event, 61 virtual bool ProcessAccelerator(const ui::KeyEvent& event,
59 const ui::Accelerator& accelerator, 62 const ui::Accelerator& accelerator,
60 KeyType key_type) OVERRIDE { 63 KeyType key_type) OVERRIDE {
61 aura::Window* target = static_cast<aura::Window*>(event.target()); 64 aura::Window* target = static_cast<aura::Window*>(event.target());
62 if (!target->IsRootWindow() && 65 if (!target->IsRootWindow() &&
63 !accelerator_manager_->IsReservedAccelerator(accelerator)) { 66 !accelerator_manager_->IsReserved(accelerator)) {
64 // TODO(oshima): do the same when the active window is in fullscreen. 67 // TODO(oshima): do the same when the active window is in fullscreen.
65 return false; 68 return false;
66 } 69 }
67 return accelerator_manager_->ProcessAccelerator(accelerator); 70 return accelerator_manager_->Process(accelerator);
68 } 71 }
69 72
70 AcceleratorManagerImpl* accelerator_manager_; 73 AcceleratorManagerImpl* accelerator_manager_;
71 DISALLOW_COPY_AND_ASSIGN(AcceleratorDelegate); 74 DISALLOW_COPY_AND_ASSIGN(AcceleratorDelegate);
72 }; 75 };
73 76
77 class FocusManagerDelegate : public views::FocusManagerDelegate {
Jun Mukai 2014/06/10 01:43:05 It seems like accelerator_manager_ in views::Focus
oshima 2014/06/10 05:18:10 Yes. If an browser window defines an accelerator,
78 public:
79 explicit FocusManagerDelegate(AcceleratorManagerImpl* accelerator_manager)
80 : accelerator_manager_(accelerator_manager) {}
81 virtual ~FocusManagerDelegate() {}
82
83 virtual bool ProcessAccelerator(const ui::Accelerator& accelerator) OVERRIDE {
84 return accelerator_manager_->Process(accelerator);
85 }
86
87 virtual ui::AcceleratorTarget* GetCurrentTargetForAccelerator(
88 const ui::Accelerator& accelerator) const OVERRIDE {
89 return accelerator_manager_->IsRegistered(accelerator)
90 ? accelerator_manager_
91 : NULL;
92 }
93
94 private:
95 AcceleratorManagerImpl* accelerator_manager_;
96
97 DISALLOW_COPY_AND_ASSIGN(FocusManagerDelegate);
98 };
99
100 // Key strokes must be sent to web contents to give them a chance to
101 // consume them unless they are reserved, and unhandled key events are
102 // sent back to focus manager asynchronously. This installs the athena's
103 // focus manager that handles athena shell's accelerators.
104 class FocusManagerFactory : public views::FocusManagerFactory {
105 public:
106 explicit FocusManagerFactory(AcceleratorManagerImpl* accelerator_manager)
107 : accelerator_manager_(accelerator_manager) {}
108 virtual ~FocusManagerFactory() {}
109
110 virtual views::FocusManager* CreateFocusManager(
111 views::Widget* widget,
112 bool desktop_widget) OVERRIDE {
113 return new views::FocusManager(
114 widget,
115 desktop_widget ? NULL : new FocusManagerDelegate(accelerator_manager_));
116 }
117
118 private:
119 AcceleratorManagerImpl* accelerator_manager_;
120
121 DISALLOW_COPY_AND_ASSIGN(FocusManagerFactory);
122 };
123
74 } // namespace 124 } // namespace
75 125
76 class AcceleratorManagerImpl::InternalData { 126 class AcceleratorManagerImpl::InternalData {
77 public: 127 public:
78 InternalData(int command_id, AcceleratorHandler* handler, int flags) 128 InternalData(int command_id, AcceleratorHandler* handler, int flags)
79 : command_id_(command_id), handler_(handler), flags_(flags) {} 129 : command_id_(command_id), handler_(handler), flags_(flags) {}
80 130
81 bool IsNonAutoRepeatable() const { return flags_ & AF_NON_AUTO_REPEATABLE; } 131 bool IsNonAutoRepeatable() const { return flags_ & AF_NON_AUTO_REPEATABLE; }
82 bool IsDebug() const { return flags_ & AF_DEBUG; } 132 bool IsDebug() const { return flags_ & AF_DEBUG; }
83 bool IsReserved() const { return flags_ & AF_RESERVED; } 133 bool IsReserved() const { return flags_ & AF_RESERVED; }
84 134
85 bool IsCommandEnabled() const { 135 bool IsCommandEnabled() const {
86 return handler_->IsCommandEnabled(command_id_); 136 return handler_->IsCommandEnabled(command_id_);
87 } 137 }
88 138
89 bool OnAcceleratorFired(const ui::Accelerator& accelerator) { 139 bool OnAcceleratorFired(const ui::Accelerator& accelerator) {
90 return handler_->OnAcceleratorFired(command_id_, accelerator); 140 return handler_->OnAcceleratorFired(command_id_, accelerator);
91 } 141 }
92 142
93 private: 143 private:
94 int command_id_; 144 int command_id_;
95 AcceleratorHandler* handler_; 145 AcceleratorHandler* handler_;
96 int flags_; 146 int flags_;
97 147
98 // This class is copyable by design. 148 // This class is copyable by design.
99 }; 149 };
100 150
101 AcceleratorManagerImpl::AcceleratorManagerImpl() 151 AcceleratorManagerImpl::AcceleratorManagerImpl()
102 : accelerator_manager_(new ui::AcceleratorManager) { 152 : accelerator_manager_(new ui::AcceleratorManager),
153 debug_accelerators_enabled_(switches::IsDebugAcceleratorsEnabled()) {
103 } 154 }
104 155
105 AcceleratorManagerImpl::~AcceleratorManagerImpl() { 156 AcceleratorManagerImpl::~AcceleratorManagerImpl() {
106 nested_accelerator_controller_.reset(); 157 nested_accelerator_controller_.reset();
107 accelerator_filter_.reset(); 158 accelerator_filter_.reset();
159 // Reset to use the default focus manager because the athena's
160 // FocusManager has the referene to this object.
Jun Mukai 2014/06/10 01:43:05 nit: reference
oshima 2014/06/10 05:18:10 Done.
161 views::FocusManagerFactory::Install(NULL);
108 } 162 }
109 163
110 void AcceleratorManagerImpl::Init() { 164 void AcceleratorManagerImpl::Init() {
165 views::FocusManagerFactory::Install(new FocusManagerFactory(this));
166
111 ui::EventTarget* toplevel = InputManager::Get()->GetTopmostEventTarget(); 167 ui::EventTarget* toplevel = InputManager::Get()->GetTopmostEventTarget();
112 nested_accelerator_controller_.reset( 168 nested_accelerator_controller_.reset(
113 new wm::NestedAcceleratorController(new NestedAcceleratorDelegate(this))); 169 new wm::NestedAcceleratorController(new NestedAcceleratorDelegate(this)));
114 170
115 scoped_ptr<wm::AcceleratorDelegate> accelerator_delegate( 171 scoped_ptr<wm::AcceleratorDelegate> accelerator_delegate(
116 new AcceleratorDelegate(this)); 172 new AcceleratorDelegate(this));
117 173
118 accelerator_filter_.reset( 174 accelerator_filter_.reset(
119 new wm::AcceleratorFilter(accelerator_delegate.Pass())); 175 new wm::AcceleratorFilter(accelerator_delegate.Pass()));
120 toplevel->AddPreTargetHandler(accelerator_filter_.get()); 176 toplevel->AddPreTargetHandler(accelerator_filter_.get());
121 } 177 }
122 178
123 void AcceleratorManagerImpl::OnRootWindowCreated(aura::Window* root_window) { 179 void AcceleratorManagerImpl::OnRootWindowCreated(aura::Window* root_window) {
124 aura::client::SetDispatcherClient(root_window, 180 aura::client::SetDispatcherClient(root_window,
125 nested_accelerator_controller_.get()); 181 nested_accelerator_controller_.get());
126 } 182 }
127 183
128 bool AcceleratorManagerImpl::IsReservedAccelerator( 184 bool AcceleratorManagerImpl::IsRegistered(
185 const ui::Accelerator& accelerator) const {
186 return accelerator_manager_->GetCurrentTarget(accelerator) != NULL;
187 }
188
189 bool AcceleratorManagerImpl::IsReserved(
129 const ui::Accelerator& accelerator) const { 190 const ui::Accelerator& accelerator) const {
130 std::map<ui::Accelerator, InternalData>::const_iterator iter = 191 std::map<ui::Accelerator, InternalData>::const_iterator iter =
131 accelerators_.find(accelerator); 192 accelerators_.find(accelerator);
132 if (iter == accelerators_.end()) 193 if (iter == accelerators_.end())
133 return false; 194 return false;
134 return iter->second.IsReserved(); 195 return iter->second.IsReserved();
135 } 196 }
136 197
137 bool AcceleratorManagerImpl::ProcessAccelerator( 198 bool AcceleratorManagerImpl::Process(const ui::Accelerator& accelerator) {
138 const ui::Accelerator& accelerator) {
139 return accelerator_manager_->Process(accelerator); 199 return accelerator_manager_->Process(accelerator);
140 } 200 }
141 201
142 void AcceleratorManagerImpl::RegisterAccelerators( 202 void AcceleratorManagerImpl::RegisterAccelerators(
143 const AcceleratorData accelerators[], 203 const AcceleratorData accelerators[],
144 size_t num_accelerators, 204 size_t num_accelerators,
145 AcceleratorHandler* handler) { 205 AcceleratorHandler* handler) {
146 for (size_t i = 0; i < num_accelerators; ++i) 206 for (size_t i = 0; i < num_accelerators; ++i)
147 RegisterAccelerator(accelerators[i], handler); 207 RegisterAccelerator(accelerators[i], handler);
148 } 208 }
149 209
150 void AcceleratorManagerImpl::EnableDebugAccelerators() { 210 void AcceleratorManagerImpl::SetDebugAcceleratorsEnabled(bool enabled) {
151 debug_accelerators_enabled_ = true; 211 debug_accelerators_enabled_ = enabled;
152 } 212 }
153 213
154 bool AcceleratorManagerImpl::AcceleratorPressed( 214 bool AcceleratorManagerImpl::AcceleratorPressed(
155 const ui::Accelerator& accelerator) { 215 const ui::Accelerator& accelerator) {
156 std::map<ui::Accelerator, InternalData>::iterator iter = 216 std::map<ui::Accelerator, InternalData>::iterator iter =
157 accelerators_.find(accelerator); 217 accelerators_.find(accelerator);
158 DCHECK(iter != accelerators_.end()); 218 DCHECK(iter != accelerators_.end());
159 if (iter == accelerators_.end()) 219 if (iter == accelerators_.end())
160 return false; 220 return false;
161 InternalData& data = iter->second; 221 InternalData& data = iter->second;
(...skipping 15 matching lines...) Expand all
177 accelerator_data.keyevent_flags); 237 accelerator_data.keyevent_flags);
178 accelerator.set_type(accelerator_data.trigger_event == TRIGGER_ON_PRESS 238 accelerator.set_type(accelerator_data.trigger_event == TRIGGER_ON_PRESS
179 ? ui::ET_KEY_PRESSED 239 ? ui::ET_KEY_PRESSED
180 : ui::ET_KEY_RELEASED); 240 : ui::ET_KEY_RELEASED);
181 accelerator_manager_->Register( 241 accelerator_manager_->Register(
182 accelerator, ui::AcceleratorManager::kNormalPriority, this); 242 accelerator, ui::AcceleratorManager::kNormalPriority, this);
183 accelerators_.insert( 243 accelerators_.insert(
184 std::make_pair(accelerator, 244 std::make_pair(accelerator,
185 InternalData(accelerator_data.command_id, 245 InternalData(accelerator_data.command_id,
186 handler, 246 handler,
187 accelerator_data.accelerator_flags))); 247 accelerator_data.accelerator_flags)));
Jun Mukai 2014/06/10 01:43:05 Not related to your CL, just an idea -- isn't it h
oshima 2014/06/10 05:18:11 ui::Accelerator has DCHECK to prevent it. (https:/
188 } 248 }
189 249
250 // static
251 AcceleratorManager* AcceleratorManager::Get() {
252 return InputManager::Get()->GetAcceleratorManager();
253 }
254
190 } // namespace athena 255 } // namespace athena
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698