Chromium Code Reviews| 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 { | |
|
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 Loading... | |
| 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 |
| OLD | NEW |