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

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

Powered by Google App Engine
This is Rietveld 408576698