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

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: rebase 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
« no previous file with comments | « athena/input/accelerator_manager_impl.h ('k') | athena/input/accelerator_manager_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 // Accelerators inside nested message loop are handled by
24 // wm::NestedAcceleratorController while accelerators in normal case are
25 // handled by wm::AcceleratorFilter. These delegates act bridges in these
26 // two different environment so that AcceleratorManagerImpl can handle
27 // accelerators in an uniform way.
28
29 class NestedAcceleratorDelegate : public wm::NestedAcceleratorDelegate {
30 public:
31 explicit NestedAcceleratorDelegate(
32 AcceleratorManagerImpl* accelerator_manager)
33 : accelerator_manager_(accelerator_manager) {}
34 virtual ~NestedAcceleratorDelegate() {}
35
36 private:
37 // wm::NestedAcceleratorDelegate:
38 virtual Result ProcessAccelerator(
39 const ui::Accelerator& accelerator) OVERRIDE {
40 return accelerator_manager_->ProcessAccelerator(accelerator)
41 ? RESULT_PROCESSED
42 : RESULT_NOT_PROCESSED;
43 }
44
45 AcceleratorManagerImpl* accelerator_manager_;
46
47 DISALLOW_COPY_AND_ASSIGN(NestedAcceleratorDelegate);
48 };
49
50 class AcceleratorDelegate : public wm::AcceleratorDelegate {
51 public:
52 explicit AcceleratorDelegate(AcceleratorManagerImpl* accelerator_manager)
53 : accelerator_manager_(accelerator_manager) {}
54 virtual ~AcceleratorDelegate() {}
55
56 private:
57 // wm::AcceleratorDelegate:
58 virtual bool ProcessAccelerator(const ui::KeyEvent& event,
59 const ui::Accelerator& accelerator,
60 KeyType key_type) OVERRIDE {
61 aura::Window* target = static_cast<aura::Window*>(event.target());
62 if (!target->IsRootWindow() &&
63 !accelerator_manager_->IsReservedAccelerator(accelerator)) {
64 // TODO(oshima): do the same when the active window is in fullscreen.
65 return false;
66 }
67 return accelerator_manager_->ProcessAccelerator(accelerator);
68 }
69
70 AcceleratorManagerImpl* accelerator_manager_;
71 DISALLOW_COPY_AND_ASSIGN(AcceleratorDelegate);
72 };
73
74 } // namespace
75
76 class AcceleratorManagerImpl::InternalData {
77 public:
78 InternalData(int command_id, AcceleratorHandler* handler, int flags)
79 : command_id_(command_id), handler_(handler), flags_(flags) {}
80
81 bool IsNonAutoRepeatable() const { return flags_ & AF_NON_AUTO_REPEATABLE; }
82 bool IsDebug() const { return flags_ & AF_DEBUG; }
83 bool IsReserved() const { return flags_ & AF_RESERVED; }
84
85 bool IsCommandEnabled() const {
86 return handler_->IsCommandEnabled(command_id_);
87 }
88
89 bool OnAcceleratorFired(const ui::Accelerator& accelerator) {
90 return handler_->OnAcceleratorFired(command_id_, accelerator);
91 }
92
93 private:
94 int command_id_;
95 AcceleratorHandler* handler_;
96 int flags_;
97
98 // This class is copyable by design.
99 };
100
101 AcceleratorManagerImpl::AcceleratorManagerImpl()
102 : accelerator_manager_(new ui::AcceleratorManager) {
103 }
104
105 AcceleratorManagerImpl::~AcceleratorManagerImpl() {
106 nested_accelerator_controller_.reset();
107 accelerator_filter_.reset();
108 }
109
110 void AcceleratorManagerImpl::Init() {
111 ui::EventTarget* toplevel = InputManager::Get()->GetTopmostEventTarget();
112 nested_accelerator_controller_.reset(
113 new wm::NestedAcceleratorController(new NestedAcceleratorDelegate(this)));
114
115 scoped_ptr<wm::AcceleratorDelegate> accelerator_delegate(
116 new AcceleratorDelegate(this));
117
118 accelerator_filter_.reset(
119 new wm::AcceleratorFilter(accelerator_delegate.Pass()));
120 toplevel->AddPreTargetHandler(accelerator_filter_.get());
121 }
122
123 void AcceleratorManagerImpl::OnRootWindowCreated(aura::Window* root_window) {
124 aura::client::SetDispatcherClient(root_window,
125 nested_accelerator_controller_.get());
126 }
127
128 bool AcceleratorManagerImpl::IsReservedAccelerator(
129 const ui::Accelerator& accelerator) const {
130 std::map<ui::Accelerator, InternalData>::const_iterator iter =
131 accelerators_.find(accelerator);
132 if (iter == accelerators_.end())
133 return false;
134 return iter->second.IsReserved();
135 }
136
137 bool AcceleratorManagerImpl::ProcessAccelerator(
138 const ui::Accelerator& accelerator) {
139 return accelerator_manager_->Process(accelerator);
140 }
141
142 void AcceleratorManagerImpl::RegisterAccelerators(
143 const AcceleratorData accelerators[],
144 size_t num_accelerators,
145 AcceleratorHandler* handler) {
146 for (size_t i = 0; i < num_accelerators; ++i)
147 RegisterAccelerator(accelerators[i], handler);
148 }
149
150 void AcceleratorManagerImpl::EnableDebugAccelerators() {
151 debug_accelerators_enabled_ = true;
152 }
153
154 bool AcceleratorManagerImpl::AcceleratorPressed(
155 const ui::Accelerator& accelerator) {
156 std::map<ui::Accelerator, InternalData>::iterator iter =
157 accelerators_.find(accelerator);
158 DCHECK(iter != accelerators_.end());
159 if (iter == accelerators_.end())
160 return false;
161 InternalData& data = iter->second;
162 if (data.IsDebug() && !debug_accelerators_enabled_)
163 return false;
164 if (accelerator.IsRepeat() && data.IsNonAutoRepeatable())
165 return false;
166 return data.IsCommandEnabled() ? data.OnAcceleratorFired(accelerator) : false;
167 }
168
169 bool AcceleratorManagerImpl::CanHandleAccelerators() const {
170 return true;
171 }
172
173 void AcceleratorManagerImpl::RegisterAccelerator(
174 const AcceleratorData& accelerator_data,
175 AcceleratorHandler* handler) {
176 ui::Accelerator accelerator(accelerator_data.keycode,
177 accelerator_data.keyevent_flags);
178 accelerator.set_type(accelerator_data.trigger_event == TRIGGER_ON_PRESS
179 ? ui::ET_KEY_PRESSED
180 : ui::ET_KEY_RELEASED);
181 accelerator_manager_->Register(
182 accelerator, ui::AcceleratorManager::kNormalPriority, this);
183 accelerators_.insert(
184 std::make_pair(accelerator,
185 InternalData(accelerator_data.command_id,
186 handler,
187 accelerator_data.accelerator_flags)));
188 }
189
190 } // namespace athena
OLDNEW
« no previous file with comments | « athena/input/accelerator_manager_impl.h ('k') | athena/input/accelerator_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698