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

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

Issue 305873002: InputManager/AcceleratorManager for athena (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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "athena/input/accelerator_manager_impl.h"
6
7 #include "athena/input/public/input_manager.h"
8 #include "base/logging.h"
9 #include "ui/aura/window.h"
10 #include "ui/base/accelerators/accelerator_manager.h"
11 #include "ui/events/event.h"
12 #include "ui/events/event_target.h"
13 #include "ui/wm/core/accelerator_delegate.h"
14 #include "ui/wm/core/accelerator_filter.h"
15 #include "ui/wm/core/nested_accelerator_controller.h"
16 #include "ui/wm/core/nested_accelerator_delegate.h"
17 #include "ui/wm/public/dispatcher_client.h"
18
19 namespace athena {
20
21 namespace {
22
23 class NestedAcceleratorDelegate : public wm::NestedAcceleratorDelegate {
24 public:
25 NestedAcceleratorDelegate(AcceleratorManagerImpl* accelerator_manager)
sadrul 2014/06/04 22:57:53 explicit
oshima 2014/06/04 23:35:55 Done.
26 : accelerator_manager_(accelerator_manager) {}
27 virtual ~NestedAcceleratorDelegate() {}
28
29 private:
30 // wm::NestedAcceleratorDelegate:
31 virtual Result ProcessAccelerator(
32 const ui::Accelerator& accelerator) OVERRIDE {
33 return accelerator_manager_->ProcessAccelerator(accelerator)
34 ? RESULT_PROCESSED
35 : RESULT_NOT_PROCESSED;
36 }
37
38 AcceleratorManagerImpl* accelerator_manager_;
39
40 DISALLOW_COPY_AND_ASSIGN(NestedAcceleratorDelegate);
41 };
42
43 class AcceleratorDelegate : public wm::AcceleratorDelegate {
44 public:
45 AcceleratorDelegate(AcceleratorManagerImpl* accelerator_manager)
sadrul 2014/06/04 22:57:53 ditto
oshima 2014/06/04 23:35:55 Done.
46 : accelerator_manager_(accelerator_manager) {}
47 virtual ~AcceleratorDelegate() {}
48
49 private:
50 virtual void PreProcessAccelerator(
sadrul 2014/06/04 22:57:53 // wm::AcceleratorDelegate:
51 const ui::Accelerator& accelerator) OVERRIDE {}
52 virtual bool ProcessAccelerator(const ui::KeyEvent& event,
53 const ui::Accelerator& accelerator,
54 KeyType key_type) OVERRIDE {
55 aura::Window* target = static_cast<aura::Window*>(event.target());
56 if (!target->IsRootWindow() &&
57 !accelerator_manager_->IsReservedAccelerator(accelerator)) {
58 // TODO(oshima): do the same when the active window is in fullscreen.
59 return false;
60 }
61 return accelerator_manager_->ProcessAccelerator(accelerator);
62 }
63
64 AcceleratorManagerImpl* accelerator_manager_;
65 DISALLOW_COPY_AND_ASSIGN(AcceleratorDelegate);
66 };
67
68 } // namespace
69
70 class AcceleratorManagerImpl::InternalData {
71 public:
72 InternalData(int command_id, AcceleratorHandler* handler, int flags)
73 : command_id_(command_id), handler_(handler), flags_(flags) {}
74
75 bool IsAutoRepeatable() const { return flags_ & AF_NON_AUTO_REPEATABLE; }
76 bool IsDebug() const { return flags_ & AF_DEBUG; }
77 bool IsReserved() const { return flags_ & AF_RESERVED; }
78
79 bool IsCommandEnabled() const {
80 return handler_->IsCommandEnabled(command_id_);
81 }
82
83 bool OnAcceleratorFired(const ui::Accelerator& accelerator) {
84 return handler_->OnAcceleratorFired(command_id_, accelerator);
85 }
86
87 private:
88 int command_id_;
89 AcceleratorHandler* handler_;
90 int flags_;
91
92 // This class is copyable by design.
93 };
94
95 AcceleratorManagerImpl::AcceleratorManagerImpl()
96 : accelerator_manager_(new ui::AcceleratorManager) {
97 }
98
99 AcceleratorManagerImpl::~AcceleratorManagerImpl() {
100 nested_accelerator_controller_.reset();
101 accelerator_filter_.reset();
102 }
103
104 void AcceleratorManagerImpl::Init() {
105 ui::EventTarget* toplevel = InputManager::Get()->GetToplevelEventTarget();
106 nested_accelerator_controller_.reset(
107 new wm::NestedAcceleratorController(new NestedAcceleratorDelegate(this)));
108
109 scoped_ptr<wm::AcceleratorDelegate> accelerator_delegate(
110 new AcceleratorDelegate(this));
111
112 accelerator_filter_.reset(
113 new wm::AcceleratorFilter(accelerator_delegate.Pass()));
114 toplevel->AddPreTargetHandler(accelerator_filter_.get());
115 }
116
117 void AcceleratorManagerImpl::OnRootWindowCreated(aura::Window* root_window) {
118 aura::client::SetDispatcherClient(root_window,
119 nested_accelerator_controller_.get());
sadrul 2014/06/04 22:57:53 Is |nested_...| supposed to be active only for nes
oshima 2014/06/04 23:35:55 Yes.
120 }
121
122 bool AcceleratorManagerImpl::IsReservedAccelerator(
123 const ui::Accelerator& accelerator) const {
124 std::map<ui::Accelerator, InternalData>::const_iterator iter =
125 accelerators_.find(accelerator);
126 if (iter == accelerators_.end())
127 return false;
128 return iter->second.IsReserved();
129 }
130
131 bool AcceleratorManagerImpl::ProcessAccelerator(
132 const ui::Accelerator& accelerator) {
133 return accelerator_manager_->Process(accelerator);
134 }
135
136 void AcceleratorManagerImpl::RegisterAccelerators(
137 const AcceleratorData accelerators[],
138 size_t num_accelerators,
139 AcceleratorHandler* handler) {
140 for (size_t i = 0; i < num_accelerators; ++i)
141 RegisterAccelerator(accelerators[i], handler);
142 }
143
144 void AcceleratorManagerImpl::EnableDebugAccelerators() {
145 debug_accelerators_enabled_ = true;
146 }
147
148 bool AcceleratorManagerImpl::AcceleratorPressed(
149 const ui::Accelerator& accelerator) {
150 std::map<ui::Accelerator, InternalData>::iterator iter =
151 accelerators_.find(accelerator);
152 DCHECK(iter != accelerators_.end());
153 if (iter == accelerators_.end())
154 return false;
155 InternalData& data = iter->second;
156 if (data.IsDebug() && !debug_accelerators_enabled_)
157 return false;
158 return data.IsCommandEnabled() ? data.OnAcceleratorFired(accelerator) : false;
159 }
160
161 bool AcceleratorManagerImpl::CanHandleAccelerators() const {
162 return true;
163 }
164
165 void AcceleratorManagerImpl::RegisterAccelerator(
166 const AcceleratorData& accelerator_data,
167 AcceleratorHandler* handler) {
168 ui::Accelerator accelerator(accelerator_data.keycode,
169 accelerator_data.keyevent_flags);
170 accelerator.set_type(accelerator_data.trigger_event == TRIGGER_ON_PRESS
171 ? ui::ET_KEY_PRESSED
172 : ui::ET_KEY_RELEASED);
173 accelerator_manager_->Register(
174 accelerator, ui::AcceleratorManager::kNormalPriority, this);
175 accelerators_.insert(
176 std::make_pair(accelerator,
177 InternalData(accelerator_data.command_id,
178 handler,
179 accelerator_data.accelerator_flags)));
180 }
181
182 } // namespace athena
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698