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

Side by Side Diff: ash/sticky_keys/sticky_keys_controller.cc

Issue 137373003: Show overlay displaying the state of all sticky keys when it is enabled. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Unit tests for overlay Created 6 years, 11 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
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "ash/sticky_keys/sticky_keys_controller.h" 5 #include "ash/sticky_keys/sticky_keys_controller.h"
6 6
7 #if defined(USE_X11) 7 #if defined(USE_X11)
8 #include <X11/extensions/XInput2.h> 8 #include <X11/extensions/XInput2.h>
9 #include <X11/Xlib.h> 9 #include <X11/Xlib.h>
10 #undef RootWindow 10 #undef RootWindow
11 #endif 11 #endif
12 12
13 #include "ash/sticky_keys/sticky_keys_overlay.h"
13 #include "base/basictypes.h" 14 #include "base/basictypes.h"
14 #include "base/debug/stack_trace.h" 15 #include "base/debug/stack_trace.h"
15 #include "ui/aura/root_window.h" 16 #include "ui/aura/root_window.h"
16 #include "ui/aura/window.h" 17 #include "ui/aura/window.h"
17 #include "ui/aura/window_tracker.h" 18 #include "ui/aura/window_tracker.h"
18 #include "ui/events/event.h" 19 #include "ui/events/event.h"
19 #include "ui/events/keycodes/keyboard_code_conversion.h" 20 #include "ui/events/keycodes/keyboard_code_conversion.h"
20 21
21 namespace ash { 22 namespace ash {
22 23
23 namespace { 24 namespace {
24 25
26 ui::EventFlags EventFlagForModifier(StickyKeyModifier modifier) {
27 switch (modifier) {
James Cook 2014/01/15 22:53:53 It's unfortunate you need to have your own set of
Tim Song 2014/01/16 00:01:59 It would certainly be cleaner and I think a bit mo
James Cook 2014/01/16 00:46:20 So do you want to make that change in this patch?
Tim Song 2014/01/16 01:59:45 Let's do this in a separate patch. I removed the m
28 case STICKY_KEY_SHIFT:
29 return ui::EF_SHIFT_DOWN;
30 case STICKY_KEY_ALT:
31 return ui::EF_ALT_DOWN;
32 case STICKY_KEY_CONTROL:
33 return ui::EF_CONTROL_DOWN;
34 case STICKY_KEY_SEARCH:
35 return ui::EF_NONE;
36 }
37 return ui::EF_NONE;
38 }
39
25 // Returns true if the type of mouse event should be modified by sticky keys. 40 // Returns true if the type of mouse event should be modified by sticky keys.
26 bool ShouldModifyMouseEvent(ui::MouseEvent* event) { 41 bool ShouldModifyMouseEvent(ui::MouseEvent* event) {
27 ui::EventType type = event->type(); 42 ui::EventType type = event->type();
28 return type == ui::ET_MOUSE_PRESSED || type == ui::ET_MOUSE_RELEASED || 43 return type == ui::ET_MOUSE_PRESSED || type == ui::ET_MOUSE_RELEASED ||
29 type == ui::ET_MOUSEWHEEL; 44 type == ui::ET_MOUSEWHEEL;
30 } 45 }
31 46
32 // An implementation of StickyKeysHandler::StickyKeysHandlerDelegate. 47 // An implementation of StickyKeysHandler::StickyKeysHandlerDelegate.
33 class StickyKeysHandlerDelegateImpl : 48 class StickyKeysHandlerDelegateImpl :
34 public StickyKeysHandler::StickyKeysHandlerDelegate { 49 public StickyKeysHandler::StickyKeysHandlerDelegate {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 DCHECK(target); 97 DCHECK(target);
83 target->GetDispatcher()->AsWindowTreeHostDelegate() 98 target->GetDispatcher()->AsWindowTreeHostDelegate()
84 ->OnHostScrollEvent(event); 99 ->OnHostScrollEvent(event);
85 } 100 }
86 101
87 } // namespace 102 } // namespace
88 103
89 /////////////////////////////////////////////////////////////////////////////// 104 ///////////////////////////////////////////////////////////////////////////////
90 // StickyKeys 105 // StickyKeys
91 StickyKeysController::StickyKeysController() 106 StickyKeysController::StickyKeysController()
92 : enabled_(false), 107 : enabled_(false) {
93 shift_sticky_key_(
94 new StickyKeysHandler(ui::EF_SHIFT_DOWN,
95 new StickyKeysHandlerDelegateImpl())),
96 alt_sticky_key_(
97 new StickyKeysHandler(ui::EF_ALT_DOWN,
98 new StickyKeysHandlerDelegateImpl())),
99 ctrl_sticky_key_(
100 new StickyKeysHandler(ui::EF_CONTROL_DOWN,
101 new StickyKeysHandlerDelegateImpl())) {
102 } 108 }
103 109
104 StickyKeysController::~StickyKeysController() { 110 StickyKeysController::~StickyKeysController() {
105 } 111 }
106 112
107 void StickyKeysController::Enable(bool enabled) { 113 void StickyKeysController::Enable(bool enabled) {
108 if (enabled_ != enabled) { 114 if (enabled_ != enabled) {
109 enabled_ = enabled; 115 enabled_ = enabled;
110 116
111 // Reset key handlers when activating sticky keys to ensure all 117 // Reset key handlers when activating sticky keys to ensure all
112 // the handlers' states are reset. 118 // the handlers' states are reset.
113 if (enabled_) { 119 if (enabled_) {
114 shift_sticky_key_.reset( 120 shift_sticky_key_.reset(
115 new StickyKeysHandler(ui::EF_SHIFT_DOWN, 121 new StickyKeysHandler(STICKY_KEY_SHIFT,
116 new StickyKeysHandlerDelegateImpl())); 122 new StickyKeysHandlerDelegateImpl()));
117 alt_sticky_key_.reset( 123 alt_sticky_key_.reset(
118 new StickyKeysHandler(ui::EF_ALT_DOWN, 124 new StickyKeysHandler(STICKY_KEY_ALT,
119 new StickyKeysHandlerDelegateImpl())); 125 new StickyKeysHandlerDelegateImpl()));
120 ctrl_sticky_key_.reset( 126 ctrl_sticky_key_.reset(
121 new StickyKeysHandler(ui::EF_CONTROL_DOWN, 127 new StickyKeysHandler(STICKY_KEY_CONTROL,
122 new StickyKeysHandlerDelegateImpl())); 128 new StickyKeysHandlerDelegateImpl()));
129
130 overlay_.reset(new StickyKeysOverlay());
131 } else if (overlay_.get()) {
132 overlay_->Show(false);
123 } 133 }
124 } 134 }
125 } 135 }
126 136
127 bool StickyKeysController::HandleKeyEvent(ui::KeyEvent* event) { 137 bool StickyKeysController::HandleKeyEvent(ui::KeyEvent* event) {
128 return shift_sticky_key_->HandleKeyEvent(event) || 138 return shift_sticky_key_->HandleKeyEvent(event) ||
129 alt_sticky_key_->HandleKeyEvent(event) || 139 alt_sticky_key_->HandleKeyEvent(event) ||
130 ctrl_sticky_key_->HandleKeyEvent(event); 140 ctrl_sticky_key_->HandleKeyEvent(event);
131 } 141 }
132 142
133 bool StickyKeysController::HandleMouseEvent(ui::MouseEvent* event) { 143 bool StickyKeysController::HandleMouseEvent(ui::MouseEvent* event) {
134 return shift_sticky_key_->HandleMouseEvent(event) || 144 return shift_sticky_key_->HandleMouseEvent(event) ||
135 alt_sticky_key_->HandleMouseEvent(event) || 145 alt_sticky_key_->HandleMouseEvent(event) ||
136 ctrl_sticky_key_->HandleMouseEvent(event); 146 ctrl_sticky_key_->HandleMouseEvent(event);
137 } 147 }
138 148
139 bool StickyKeysController::HandleScrollEvent(ui::ScrollEvent* event) { 149 bool StickyKeysController::HandleScrollEvent(ui::ScrollEvent* event) {
140 return shift_sticky_key_->HandleScrollEvent(event) || 150 return shift_sticky_key_->HandleScrollEvent(event) ||
141 alt_sticky_key_->HandleScrollEvent(event) || 151 alt_sticky_key_->HandleScrollEvent(event) ||
142 ctrl_sticky_key_->HandleScrollEvent(event); 152 ctrl_sticky_key_->HandleScrollEvent(event);
143 } 153 }
144 154
145 void StickyKeysController::OnKeyEvent(ui::KeyEvent* event) { 155 void StickyKeysController::OnKeyEvent(ui::KeyEvent* event) {
146 // Do not consume a translated key event which is generated by an IME. 156 // Do not consume a translated key event which is generated by an IME.
147 if (event->type() == ui::ET_TRANSLATED_KEY_PRESS || 157 if (event->type() == ui::ET_TRANSLATED_KEY_PRESS ||
148 event->type() == ui::ET_TRANSLATED_KEY_RELEASE) { 158 event->type() == ui::ET_TRANSLATED_KEY_RELEASE) {
149 return; 159 return;
150 } 160 }
151 161
152 if (enabled_ && HandleKeyEvent(event)) 162 if (enabled_) {
153 event->StopPropagation(); 163 if (HandleKeyEvent(event))
164 event->StopPropagation();
165 UpdateOverlay();
166 }
154 } 167 }
155 168
156 void StickyKeysController::OnMouseEvent(ui::MouseEvent* event) { 169 void StickyKeysController::OnMouseEvent(ui::MouseEvent* event) {
157 if (enabled_ && HandleMouseEvent(event)) 170 if (enabled_) {
158 event->StopPropagation(); 171 if (HandleMouseEvent(event))
172 event->StopPropagation();
173 UpdateOverlay();
174 }
159 } 175 }
160 176
161 void StickyKeysController::OnScrollEvent(ui::ScrollEvent* event) { 177 void StickyKeysController::OnScrollEvent(ui::ScrollEvent* event) {
162 if (enabled_ && HandleScrollEvent(event)) 178 if (enabled_) {
163 event->StopPropagation(); 179 if (HandleScrollEvent(event))
180 event->StopPropagation();
181 UpdateOverlay();
182 }
183 }
184
185 void StickyKeysController::UpdateOverlay() {
186 overlay_->SetModifierKeyState(
187 STICKY_KEY_SHIFT, shift_sticky_key_->current_state());
188 overlay_->SetModifierKeyState(
189 STICKY_KEY_CONTROL, ctrl_sticky_key_->current_state());
190 overlay_->SetModifierKeyState(
191 STICKY_KEY_ALT, alt_sticky_key_->current_state());
192
193 bool key_in_use =
194 shift_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED ||
195 alt_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED ||
196 ctrl_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED;
197
198 overlay_->Show(enabled_ && key_in_use);
199 }
200
201 StickyKeysOverlay* StickyKeysController::GetOverlayForTest() {
202 return overlay_.get();
164 } 203 }
165 204
166 /////////////////////////////////////////////////////////////////////////////// 205 ///////////////////////////////////////////////////////////////////////////////
167 // StickyKeysHandler 206 // StickyKeysHandler
168 StickyKeysHandler::StickyKeysHandler(ui::EventFlags target_modifier_flag, 207 StickyKeysHandler::StickyKeysHandler(StickyKeyModifier modifier,
169 StickyKeysHandlerDelegate* delegate) 208 StickyKeysHandlerDelegate* delegate)
170 : modifier_flag_(target_modifier_flag), 209 : modifier_(modifier),
171 current_state_(DISABLED), 210 modifier_flag_(EventFlagForModifier(modifier_)),
211 current_state_(STICKY_KEY_STATE_DISABLED),
172 event_from_myself_(false), 212 event_from_myself_(false),
173 preparing_to_enable_(false), 213 preparing_to_enable_(false),
174 scroll_delta_(0), 214 scroll_delta_(0),
175 delegate_(delegate) { 215 delegate_(delegate) {
176 } 216 }
177 217
178 StickyKeysHandler::~StickyKeysHandler() { 218 StickyKeysHandler::~StickyKeysHandler() {
179 } 219 }
180 220
181 StickyKeysHandler::StickyKeysHandlerDelegate::StickyKeysHandlerDelegate() { 221 StickyKeysHandler::StickyKeysHandlerDelegate::StickyKeysHandlerDelegate() {
182 } 222 }
183 223
184 StickyKeysHandler::StickyKeysHandlerDelegate::~StickyKeysHandlerDelegate() { 224 StickyKeysHandler::StickyKeysHandlerDelegate::~StickyKeysHandlerDelegate() {
185 } 225 }
186 226
187 bool StickyKeysHandler::HandleKeyEvent(ui::KeyEvent* event) { 227 bool StickyKeysHandler::HandleKeyEvent(ui::KeyEvent* event) {
188 if (event_from_myself_) 228 if (event_from_myself_)
189 return false; // Do not handle self-generated key event. 229 return false; // Do not handle self-generated key event.
190 switch (current_state_) { 230 switch (current_state_) {
191 case DISABLED: 231 case STICKY_KEY_STATE_DISABLED:
192 return HandleDisabledState(event); 232 return HandleDisabledState(event);
193 case ENABLED: 233 case STICKY_KEY_STATE_ENABLED:
194 return HandleEnabledState(event); 234 return HandleEnabledState(event);
195 case LOCKED: 235 case STICKY_KEY_STATE_LOCKED:
196 return HandleLockedState(event); 236 return HandleLockedState(event);
197 } 237 }
198 NOTREACHED(); 238 NOTREACHED();
199 return false; 239 return false;
200 } 240 }
201 241
202 bool StickyKeysHandler::HandleMouseEvent(ui::MouseEvent* event) { 242 bool StickyKeysHandler::HandleMouseEvent(ui::MouseEvent* event) {
203 if (ShouldModifyMouseEvent(event)) 243 if (ShouldModifyMouseEvent(event))
204 preparing_to_enable_ = false; 244 preparing_to_enable_ = false;
205 245
206 if (event_from_myself_ || current_state_ == DISABLED 246 if (event_from_myself_ || current_state_ == STICKY_KEY_STATE_DISABLED
207 || !ShouldModifyMouseEvent(event)) { 247 || !ShouldModifyMouseEvent(event)) {
208 return false; 248 return false;
209 } 249 }
210 DCHECK(current_state_ == ENABLED || current_state_ == LOCKED); 250 DCHECK(current_state_ == STICKY_KEY_STATE_ENABLED ||
251 current_state_ == STICKY_KEY_STATE_LOCKED);
211 252
212 AppendModifier(event); 253 AppendModifier(event);
213 // Only disable on the mouse released event in normal, non-locked mode. 254 // Only disable on the mouse released event in normal, non-locked mode.
214 if (current_state_ == ENABLED && event->type() != ui::ET_MOUSE_PRESSED) { 255 if (current_state_ == STICKY_KEY_STATE_ENABLED &&
215 current_state_ = DISABLED; 256 event->type() != ui::ET_MOUSE_PRESSED) {
257 current_state_ = STICKY_KEY_STATE_DISABLED;
216 DispatchEventAndReleaseModifier(event); 258 DispatchEventAndReleaseModifier(event);
217 return true; 259 return true;
218 } 260 }
219 261
220 return false; 262 return false;
221 } 263 }
222 264
223 bool StickyKeysHandler::HandleScrollEvent(ui::ScrollEvent* event) { 265 bool StickyKeysHandler::HandleScrollEvent(ui::ScrollEvent* event) {
224 preparing_to_enable_ = false; 266 preparing_to_enable_ = false;
225 if (event_from_myself_ || current_state_ == DISABLED) 267 if (event_from_myself_ || current_state_ == STICKY_KEY_STATE_DISABLED)
226 return false; 268 return false;
227 DCHECK(current_state_ == ENABLED || current_state_ == LOCKED); 269 DCHECK(current_state_ == STICKY_KEY_STATE_ENABLED ||
270 current_state_ == STICKY_KEY_STATE_LOCKED);
228 271
229 // We detect a direction change if the current |scroll_delta_| is assigned 272 // We detect a direction change if the current |scroll_delta_| is assigned
230 // and the offset of the current scroll event has the opposing sign. 273 // and the offset of the current scroll event has the opposing sign.
231 bool direction_changed = false; 274 bool direction_changed = false;
232 if (current_state_ == ENABLED && event->type() == ui::ET_SCROLL) { 275 if (current_state_ == STICKY_KEY_STATE_ENABLED &&
276 event->type() == ui::ET_SCROLL) {
233 int offset = event->y_offset(); 277 int offset = event->y_offset();
234 if (scroll_delta_) 278 if (scroll_delta_)
235 direction_changed = offset * scroll_delta_ <= 0; 279 direction_changed = offset * scroll_delta_ <= 0;
236 scroll_delta_ = offset; 280 scroll_delta_ = offset;
237 } 281 }
238 282
239 if (!direction_changed) 283 if (!direction_changed)
240 AppendModifier(event); 284 AppendModifier(event);
241 285
242 // We want to modify all the scroll events in the scroll sequence, which ends 286 // We want to modify all the scroll events in the scroll sequence, which ends
243 // with a fling start event. We also stop when the scroll sequence changes 287 // with a fling start event. We also stop when the scroll sequence changes
244 // direction. 288 // direction.
245 if (current_state_ == ENABLED && 289 if (current_state_ == STICKY_KEY_STATE_ENABLED &&
246 (event->type() == ui::ET_SCROLL_FLING_START || direction_changed)) { 290 (event->type() == ui::ET_SCROLL_FLING_START || direction_changed)) {
247 current_state_ = DISABLED; 291 current_state_ = STICKY_KEY_STATE_DISABLED;
248 scroll_delta_ = 0; 292 scroll_delta_ = 0;
249 DispatchEventAndReleaseModifier(event); 293 DispatchEventAndReleaseModifier(event);
250 return true; 294 return true;
251 } 295 }
252 296
253 return false; 297 return false;
254 } 298 }
255 299
256 StickyKeysHandler::KeyEventType 300 StickyKeysHandler::KeyEventType
257 StickyKeysHandler::TranslateKeyEvent(ui::KeyEvent* event) { 301 StickyKeysHandler::TranslateKeyEvent(ui::KeyEvent* event) {
258 bool is_target_key = false; 302 bool is_target_key = false;
259 if (event->key_code() == ui::VKEY_SHIFT || 303 if (event->key_code() == ui::VKEY_SHIFT ||
260 event->key_code() == ui::VKEY_LSHIFT || 304 event->key_code() == ui::VKEY_LSHIFT ||
261 event->key_code() == ui::VKEY_RSHIFT) { 305 event->key_code() == ui::VKEY_RSHIFT) {
262 is_target_key = (modifier_flag_ == ui::EF_SHIFT_DOWN); 306 is_target_key = (modifier_ == STICKY_KEY_SHIFT);
263 } else if (event->key_code() == ui::VKEY_CONTROL || 307 } else if (event->key_code() == ui::VKEY_CONTROL ||
264 event->key_code() == ui::VKEY_LCONTROL || 308 event->key_code() == ui::VKEY_LCONTROL ||
265 event->key_code() == ui::VKEY_RCONTROL) { 309 event->key_code() == ui::VKEY_RCONTROL) {
266 is_target_key = (modifier_flag_ == ui::EF_CONTROL_DOWN); 310 is_target_key = (modifier_ == STICKY_KEY_CONTROL);
267 } else if (event->key_code() == ui::VKEY_MENU || 311 } else if (event->key_code() == ui::VKEY_MENU ||
268 event->key_code() == ui::VKEY_LMENU || 312 event->key_code() == ui::VKEY_LMENU ||
269 event->key_code() == ui::VKEY_RMENU) { 313 event->key_code() == ui::VKEY_RMENU) {
270 is_target_key = (modifier_flag_ == ui::EF_ALT_DOWN); 314 is_target_key = (modifier_ == STICKY_KEY_ALT);
271 } else { 315 } else {
272 return event->type() == ui::ET_KEY_PRESSED ? 316 return event->type() == ui::ET_KEY_PRESSED ?
273 NORMAL_KEY_DOWN : NORMAL_KEY_UP; 317 NORMAL_KEY_DOWN : NORMAL_KEY_UP;
274 } 318 }
275 319
276 if (is_target_key) { 320 if (is_target_key) {
277 return event->type() == ui::ET_KEY_PRESSED ? 321 return event->type() == ui::ET_KEY_PRESSED ?
278 TARGET_MODIFIER_DOWN : TARGET_MODIFIER_UP; 322 TARGET_MODIFIER_DOWN : TARGET_MODIFIER_UP;
279 } 323 }
280 return event->type() == ui::ET_KEY_PRESSED ? 324 return event->type() == ui::ET_KEY_PRESSED ?
281 OTHER_MODIFIER_DOWN : OTHER_MODIFIER_UP; 325 OTHER_MODIFIER_DOWN : OTHER_MODIFIER_UP;
282 } 326 }
283 327
284 bool StickyKeysHandler::HandleDisabledState(ui::KeyEvent* event) { 328 bool StickyKeysHandler::HandleDisabledState(ui::KeyEvent* event) {
285 switch (TranslateKeyEvent(event)) { 329 switch (TranslateKeyEvent(event)) {
286 case TARGET_MODIFIER_UP: 330 case TARGET_MODIFIER_UP:
287 if (preparing_to_enable_) { 331 if (preparing_to_enable_) {
288 preparing_to_enable_ = false; 332 preparing_to_enable_ = false;
289 scroll_delta_ = 0; 333 scroll_delta_ = 0;
290 current_state_ = ENABLED; 334 current_state_ = STICKY_KEY_STATE_ENABLED;
291 modifier_up_event_.reset(new ui::KeyEvent(*event)); 335 modifier_up_event_.reset(new ui::KeyEvent(*event));
292 return true; 336 return true;
293 } 337 }
294 return false; 338 return false;
295 case TARGET_MODIFIER_DOWN: 339 case TARGET_MODIFIER_DOWN:
296 preparing_to_enable_ = true; 340 preparing_to_enable_ = true;
297 return false; 341 return false;
298 case NORMAL_KEY_DOWN: 342 case NORMAL_KEY_DOWN:
299 preparing_to_enable_ = false; 343 preparing_to_enable_ = false;
300 return false; 344 return false;
301 case NORMAL_KEY_UP: 345 case NORMAL_KEY_UP:
302 case OTHER_MODIFIER_DOWN: 346 case OTHER_MODIFIER_DOWN:
303 case OTHER_MODIFIER_UP: 347 case OTHER_MODIFIER_UP:
304 return false; 348 return false;
305 } 349 }
306 NOTREACHED(); 350 NOTREACHED();
307 return false; 351 return false;
308 } 352 }
309 353
310 bool StickyKeysHandler::HandleEnabledState(ui::KeyEvent* event) { 354 bool StickyKeysHandler::HandleEnabledState(ui::KeyEvent* event) {
311 switch (TranslateKeyEvent(event)) { 355 switch (TranslateKeyEvent(event)) {
312 case NORMAL_KEY_UP: 356 case NORMAL_KEY_UP:
313 case TARGET_MODIFIER_DOWN: 357 case TARGET_MODIFIER_DOWN:
314 return true; 358 return true;
315 case TARGET_MODIFIER_UP: 359 case TARGET_MODIFIER_UP:
316 current_state_ = LOCKED; 360 current_state_ = STICKY_KEY_STATE_LOCKED;
317 modifier_up_event_.reset(); 361 modifier_up_event_.reset();
318 return true; 362 return true;
319 case NORMAL_KEY_DOWN: { 363 case NORMAL_KEY_DOWN: {
320 current_state_ = DISABLED; 364 current_state_ = STICKY_KEY_STATE_DISABLED;
321 AppendModifier(event); 365 AppendModifier(event);
322 DispatchEventAndReleaseModifier(event); 366 DispatchEventAndReleaseModifier(event);
323 return true; 367 return true;
324 } 368 }
325 case OTHER_MODIFIER_DOWN: 369 case OTHER_MODIFIER_DOWN:
326 case OTHER_MODIFIER_UP: 370 case OTHER_MODIFIER_UP:
327 return false; 371 return false;
328 } 372 }
329 NOTREACHED(); 373 NOTREACHED();
330 return false; 374 return false;
331 } 375 }
332 376
333 bool StickyKeysHandler::HandleLockedState(ui::KeyEvent* event) { 377 bool StickyKeysHandler::HandleLockedState(ui::KeyEvent* event) {
334 switch (TranslateKeyEvent(event)) { 378 switch (TranslateKeyEvent(event)) {
335 case TARGET_MODIFIER_DOWN: 379 case TARGET_MODIFIER_DOWN:
336 return true; 380 return true;
337 case TARGET_MODIFIER_UP: 381 case TARGET_MODIFIER_UP:
338 current_state_ = DISABLED; 382 current_state_ = STICKY_KEY_STATE_DISABLED;
339 return false; 383 return false;
340 case NORMAL_KEY_DOWN: 384 case NORMAL_KEY_DOWN:
341 case NORMAL_KEY_UP: 385 case NORMAL_KEY_UP:
342 AppendModifier(event); 386 AppendModifier(event);
343 return false; 387 return false;
344 case OTHER_MODIFIER_DOWN: 388 case OTHER_MODIFIER_DOWN:
345 case OTHER_MODIFIER_UP: 389 case OTHER_MODIFIER_UP:
346 return false; 390 return false;
347 } 391 }
348 NOTREACHED(); 392 NOTREACHED();
(...skipping 26 matching lines...) Expand all
375 // The action triggered above may have destroyed the event target, in which 419 // The action triggered above may have destroyed the event target, in which
376 // case we will dispatch the modifier up event to the root window instead. 420 // case we will dispatch the modifier up event to the root window instead.
377 aura::Window* modifier_up_target = 421 aura::Window* modifier_up_target =
378 window_tracker.Contains(target) ? target : root_window; 422 window_tracker.Contains(target) ? target : root_window;
379 delegate_->DispatchKeyEvent(modifier_up_event_.get(), modifier_up_target); 423 delegate_->DispatchKeyEvent(modifier_up_event_.get(), modifier_up_target);
380 event_from_myself_ = false; 424 event_from_myself_ = false;
381 } 425 }
382 426
383 void StickyKeysHandler::AppendNativeEventMask(unsigned int* state) { 427 void StickyKeysHandler::AppendNativeEventMask(unsigned int* state) {
384 unsigned int& state_ref = *state; 428 unsigned int& state_ref = *state;
385 switch (modifier_flag_) { 429 switch (modifier_) {
386 case ui::EF_CONTROL_DOWN: 430 case STICKY_KEY_CONTROL:
387 state_ref |= ControlMask; 431 state_ref |= ControlMask;
388 break; 432 break;
389 case ui::EF_ALT_DOWN: 433 case STICKY_KEY_ALT:
390 state_ref |= Mod1Mask; 434 state_ref |= Mod1Mask;
391 break; 435 break;
392 case ui::EF_SHIFT_DOWN: 436 case STICKY_KEY_SHIFT:
393 state_ref |= ShiftMask; 437 state_ref |= ShiftMask;
394 break; 438 break;
439 case STICKY_KEY_SEARCH:
440 break;
395 default: 441 default:
396 NOTREACHED(); 442 NOTREACHED();
397 } 443 }
398 } 444 }
399 445
400 void StickyKeysHandler::AppendModifier(ui::KeyEvent* event) { 446 void StickyKeysHandler::AppendModifier(ui::KeyEvent* event) {
401 #if defined(USE_X11) 447 #if defined(USE_X11)
402 XEvent* xev = event->native_event(); 448 XEvent* xev = event->native_event();
403 if (xev) { 449 if (xev) {
404 XKeyEvent* xkey = &(xev->xkey); 450 XKeyEvent* xkey = &(xev->xkey);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 &xievent->mods.effective)); 483 &xievent->mods.effective));
438 } 484 }
439 } 485 }
440 #elif defined(USE_OZONE) 486 #elif defined(USE_OZONE)
441 NOTIMPLEMENTED() << "Modifier key is not handled"; 487 NOTIMPLEMENTED() << "Modifier key is not handled";
442 #endif 488 #endif
443 event->set_flags(event->flags() | modifier_flag_); 489 event->set_flags(event->flags() | modifier_flag_);
444 } 490 }
445 491
446 } // namespace ash 492 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698