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/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 { |
| 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 reference to this object. |
| 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 18 matching lines...) Expand all Loading... |
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))); |
188 } | 248 } |
189 | 249 |
| 250 // static |
| 251 AcceleratorManager* AcceleratorManager::Get() { |
| 252 return InputManager::Get()->GetAcceleratorManager(); |
| 253 } |
| 254 |
190 } // namespace athena | 255 } // namespace athena |
OLD | NEW |