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

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: 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) {
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(
James Cook 2014/01/14 00:59:03 You don't update for the SEARCH key?
Tim Song 2014/01/14 03:01:10 Support for the search key hasn't been implemented
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);
164 } 199 }
165 200
166 /////////////////////////////////////////////////////////////////////////////// 201 ///////////////////////////////////////////////////////////////////////////////
167 // StickyKeysHandler 202 // StickyKeysHandler
168 StickyKeysHandler::StickyKeysHandler(ui::EventFlags target_modifier_flag, 203 StickyKeysHandler::StickyKeysHandler(StickyKeyModifier modifier,
169 StickyKeysHandlerDelegate* delegate) 204 StickyKeysHandlerDelegate* delegate)
170 : modifier_flag_(target_modifier_flag), 205 : modifier_(modifier),
171 current_state_(DISABLED), 206 modifier_flag_(EventFlagForModifier(modifier_)),
207 current_state_(STICKY_KEY_STATE_DISABLED),
172 event_from_myself_(false), 208 event_from_myself_(false),
173 preparing_to_enable_(false), 209 preparing_to_enable_(false),
174 scroll_delta_(0), 210 scroll_delta_(0),
175 delegate_(delegate) { 211 delegate_(delegate) {
176 } 212 }
177 213
178 StickyKeysHandler::~StickyKeysHandler() { 214 StickyKeysHandler::~StickyKeysHandler() {
179 } 215 }
180 216
181 StickyKeysHandler::StickyKeysHandlerDelegate::StickyKeysHandlerDelegate() { 217 StickyKeysHandler::StickyKeysHandlerDelegate::StickyKeysHandlerDelegate() {
182 } 218 }
183 219
184 StickyKeysHandler::StickyKeysHandlerDelegate::~StickyKeysHandlerDelegate() { 220 StickyKeysHandler::StickyKeysHandlerDelegate::~StickyKeysHandlerDelegate() {
185 } 221 }
186 222
187 bool StickyKeysHandler::HandleKeyEvent(ui::KeyEvent* event) { 223 bool StickyKeysHandler::HandleKeyEvent(ui::KeyEvent* event) {
188 if (event_from_myself_) 224 if (event_from_myself_)
189 return false; // Do not handle self-generated key event. 225 return false; // Do not handle self-generated key event.
190 switch (current_state_) { 226 switch (current_state_) {
191 case DISABLED: 227 case STICKY_KEY_STATE_DISABLED:
192 return HandleDisabledState(event); 228 return HandleDisabledState(event);
193 case ENABLED: 229 case STICKY_KEY_STATE_ENABLED:
194 return HandleEnabledState(event); 230 return HandleEnabledState(event);
195 case LOCKED: 231 case STICKY_KEY_STATE_LOCKED:
196 return HandleLockedState(event); 232 return HandleLockedState(event);
197 } 233 }
198 NOTREACHED(); 234 NOTREACHED();
199 return false; 235 return false;
200 } 236 }
201 237
202 bool StickyKeysHandler::HandleMouseEvent(ui::MouseEvent* event) { 238 bool StickyKeysHandler::HandleMouseEvent(ui::MouseEvent* event) {
203 if (ShouldModifyMouseEvent(event)) 239 if (ShouldModifyMouseEvent(event))
204 preparing_to_enable_ = false; 240 preparing_to_enable_ = false;
205 241
206 if (event_from_myself_ || current_state_ == DISABLED 242 if (event_from_myself_ || current_state_ == STICKY_KEY_STATE_DISABLED
207 || !ShouldModifyMouseEvent(event)) { 243 || !ShouldModifyMouseEvent(event)) {
208 return false; 244 return false;
209 } 245 }
210 DCHECK(current_state_ == ENABLED || current_state_ == LOCKED); 246 DCHECK(current_state_ == STICKY_KEY_STATE_ENABLED ||
247 current_state_ == STICKY_KEY_STATE_LOCKED);
211 248
212 AppendModifier(event); 249 AppendModifier(event);
213 // Only disable on the mouse released event in normal, non-locked mode. 250 // Only disable on the mouse released event in normal, non-locked mode.
214 if (current_state_ == ENABLED && event->type() != ui::ET_MOUSE_PRESSED) { 251 if (current_state_ == STICKY_KEY_STATE_ENABLED &&
215 current_state_ = DISABLED; 252 event->type() != ui::ET_MOUSE_PRESSED) {
253 current_state_ = STICKY_KEY_STATE_DISABLED;
216 DispatchEventAndReleaseModifier(event); 254 DispatchEventAndReleaseModifier(event);
217 return true; 255 return true;
218 } 256 }
219 257
220 return false; 258 return false;
221 } 259 }
222 260
223 bool StickyKeysHandler::HandleScrollEvent(ui::ScrollEvent* event) { 261 bool StickyKeysHandler::HandleScrollEvent(ui::ScrollEvent* event) {
224 preparing_to_enable_ = false; 262 preparing_to_enable_ = false;
225 if (event_from_myself_ || current_state_ == DISABLED) 263 if (event_from_myself_ || current_state_ == STICKY_KEY_STATE_DISABLED)
226 return false; 264 return false;
227 DCHECK(current_state_ == ENABLED || current_state_ == LOCKED); 265 DCHECK(current_state_ == STICKY_KEY_STATE_ENABLED ||
266 current_state_ == STICKY_KEY_STATE_LOCKED);
228 267
229 // We detect a direction change if the current |scroll_delta_| is assigned 268 // 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. 269 // and the offset of the current scroll event has the opposing sign.
231 bool direction_changed = false; 270 bool direction_changed = false;
232 if (current_state_ == ENABLED && event->type() == ui::ET_SCROLL) { 271 if (current_state_ == STICKY_KEY_STATE_ENABLED &&
272 event->type() == ui::ET_SCROLL) {
233 int offset = event->y_offset(); 273 int offset = event->y_offset();
234 if (scroll_delta_) 274 if (scroll_delta_)
235 direction_changed = offset * scroll_delta_ <= 0; 275 direction_changed = offset * scroll_delta_ <= 0;
236 scroll_delta_ = offset; 276 scroll_delta_ = offset;
237 } 277 }
238 278
239 if (!direction_changed) 279 if (!direction_changed)
240 AppendModifier(event); 280 AppendModifier(event);
241 281
242 // We want to modify all the scroll events in the scroll sequence, which ends 282 // 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 283 // with a fling start event. We also stop when the scroll sequence changes
244 // direction. 284 // direction.
245 if (current_state_ == ENABLED && 285 if (current_state_ == STICKY_KEY_STATE_ENABLED &&
246 (event->type() == ui::ET_SCROLL_FLING_START || direction_changed)) { 286 (event->type() == ui::ET_SCROLL_FLING_START || direction_changed)) {
247 current_state_ = DISABLED; 287 current_state_ = STICKY_KEY_STATE_DISABLED;
248 scroll_delta_ = 0; 288 scroll_delta_ = 0;
249 DispatchEventAndReleaseModifier(event); 289 DispatchEventAndReleaseModifier(event);
250 return true; 290 return true;
251 } 291 }
252 292
253 return false; 293 return false;
254 } 294 }
255 295
256 StickyKeysHandler::KeyEventType 296 StickyKeysHandler::KeyEventType
257 StickyKeysHandler::TranslateKeyEvent(ui::KeyEvent* event) { 297 StickyKeysHandler::TranslateKeyEvent(ui::KeyEvent* event) {
258 bool is_target_key = false; 298 bool is_target_key = false;
259 if (event->key_code() == ui::VKEY_SHIFT || 299 if (event->key_code() == ui::VKEY_SHIFT ||
260 event->key_code() == ui::VKEY_LSHIFT || 300 event->key_code() == ui::VKEY_LSHIFT ||
261 event->key_code() == ui::VKEY_RSHIFT) { 301 event->key_code() == ui::VKEY_RSHIFT) {
262 is_target_key = (modifier_flag_ == ui::EF_SHIFT_DOWN); 302 is_target_key = (modifier_ == STICKY_KEY_SHIFT);
263 } else if (event->key_code() == ui::VKEY_CONTROL || 303 } else if (event->key_code() == ui::VKEY_CONTROL ||
264 event->key_code() == ui::VKEY_LCONTROL || 304 event->key_code() == ui::VKEY_LCONTROL ||
265 event->key_code() == ui::VKEY_RCONTROL) { 305 event->key_code() == ui::VKEY_RCONTROL) {
266 is_target_key = (modifier_flag_ == ui::EF_CONTROL_DOWN); 306 is_target_key = (modifier_ == STICKY_KEY_CONTROL);
267 } else if (event->key_code() == ui::VKEY_MENU || 307 } else if (event->key_code() == ui::VKEY_MENU ||
268 event->key_code() == ui::VKEY_LMENU || 308 event->key_code() == ui::VKEY_LMENU ||
269 event->key_code() == ui::VKEY_RMENU) { 309 event->key_code() == ui::VKEY_RMENU) {
270 is_target_key = (modifier_flag_ == ui::EF_ALT_DOWN); 310 is_target_key = (modifier_ == STICKY_KEY_ALT);
271 } else { 311 } else {
272 return event->type() == ui::ET_KEY_PRESSED ? 312 return event->type() == ui::ET_KEY_PRESSED ?
273 NORMAL_KEY_DOWN : NORMAL_KEY_UP; 313 NORMAL_KEY_DOWN : NORMAL_KEY_UP;
274 } 314 }
275 315
276 if (is_target_key) { 316 if (is_target_key) {
277 return event->type() == ui::ET_KEY_PRESSED ? 317 return event->type() == ui::ET_KEY_PRESSED ?
278 TARGET_MODIFIER_DOWN : TARGET_MODIFIER_UP; 318 TARGET_MODIFIER_DOWN : TARGET_MODIFIER_UP;
279 } 319 }
280 return event->type() == ui::ET_KEY_PRESSED ? 320 return event->type() == ui::ET_KEY_PRESSED ?
281 OTHER_MODIFIER_DOWN : OTHER_MODIFIER_UP; 321 OTHER_MODIFIER_DOWN : OTHER_MODIFIER_UP;
282 } 322 }
283 323
284 bool StickyKeysHandler::HandleDisabledState(ui::KeyEvent* event) { 324 bool StickyKeysHandler::HandleDisabledState(ui::KeyEvent* event) {
285 switch (TranslateKeyEvent(event)) { 325 switch (TranslateKeyEvent(event)) {
286 case TARGET_MODIFIER_UP: 326 case TARGET_MODIFIER_UP:
287 if (preparing_to_enable_) { 327 if (preparing_to_enable_) {
288 preparing_to_enable_ = false; 328 preparing_to_enable_ = false;
289 scroll_delta_ = 0; 329 scroll_delta_ = 0;
290 current_state_ = ENABLED; 330 current_state_ = STICKY_KEY_STATE_ENABLED;
291 modifier_up_event_.reset(new ui::KeyEvent(*event)); 331 modifier_up_event_.reset(new ui::KeyEvent(*event));
292 return true; 332 return true;
293 } 333 }
294 return false; 334 return false;
295 case TARGET_MODIFIER_DOWN: 335 case TARGET_MODIFIER_DOWN:
296 preparing_to_enable_ = true; 336 preparing_to_enable_ = true;
297 return false; 337 return false;
298 case NORMAL_KEY_DOWN: 338 case NORMAL_KEY_DOWN:
299 preparing_to_enable_ = false; 339 preparing_to_enable_ = false;
300 return false; 340 return false;
301 case NORMAL_KEY_UP: 341 case NORMAL_KEY_UP:
302 case OTHER_MODIFIER_DOWN: 342 case OTHER_MODIFIER_DOWN:
303 case OTHER_MODIFIER_UP: 343 case OTHER_MODIFIER_UP:
304 return false; 344 return false;
305 } 345 }
306 NOTREACHED(); 346 NOTREACHED();
307 return false; 347 return false;
308 } 348 }
309 349
310 bool StickyKeysHandler::HandleEnabledState(ui::KeyEvent* event) { 350 bool StickyKeysHandler::HandleEnabledState(ui::KeyEvent* event) {
311 switch (TranslateKeyEvent(event)) { 351 switch (TranslateKeyEvent(event)) {
312 case NORMAL_KEY_UP: 352 case NORMAL_KEY_UP:
313 case TARGET_MODIFIER_DOWN: 353 case TARGET_MODIFIER_DOWN:
314 return true; 354 return true;
315 case TARGET_MODIFIER_UP: 355 case TARGET_MODIFIER_UP:
316 current_state_ = LOCKED; 356 current_state_ = STICKY_KEY_STATE_LOCKED;
317 modifier_up_event_.reset(); 357 modifier_up_event_.reset();
318 return true; 358 return true;
319 case NORMAL_KEY_DOWN: { 359 case NORMAL_KEY_DOWN: {
320 current_state_ = DISABLED; 360 current_state_ = STICKY_KEY_STATE_DISABLED;
321 AppendModifier(event); 361 AppendModifier(event);
322 DispatchEventAndReleaseModifier(event); 362 DispatchEventAndReleaseModifier(event);
323 return true; 363 return true;
324 } 364 }
325 case OTHER_MODIFIER_DOWN: 365 case OTHER_MODIFIER_DOWN:
326 case OTHER_MODIFIER_UP: 366 case OTHER_MODIFIER_UP:
327 return false; 367 return false;
328 } 368 }
329 NOTREACHED(); 369 NOTREACHED();
330 return false; 370 return false;
331 } 371 }
332 372
333 bool StickyKeysHandler::HandleLockedState(ui::KeyEvent* event) { 373 bool StickyKeysHandler::HandleLockedState(ui::KeyEvent* event) {
334 switch (TranslateKeyEvent(event)) { 374 switch (TranslateKeyEvent(event)) {
335 case TARGET_MODIFIER_DOWN: 375 case TARGET_MODIFIER_DOWN:
336 return true; 376 return true;
337 case TARGET_MODIFIER_UP: 377 case TARGET_MODIFIER_UP:
338 current_state_ = DISABLED; 378 current_state_ = STICKY_KEY_STATE_DISABLED;
339 return false; 379 return false;
340 case NORMAL_KEY_DOWN: 380 case NORMAL_KEY_DOWN:
341 case NORMAL_KEY_UP: 381 case NORMAL_KEY_UP:
342 AppendModifier(event); 382 AppendModifier(event);
343 return false; 383 return false;
344 case OTHER_MODIFIER_DOWN: 384 case OTHER_MODIFIER_DOWN:
345 case OTHER_MODIFIER_UP: 385 case OTHER_MODIFIER_UP:
346 return false; 386 return false;
347 } 387 }
348 NOTREACHED(); 388 NOTREACHED();
(...skipping 26 matching lines...) Expand all
375 // The action triggered above may have destroyed the event target, in which 415 // 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. 416 // case we will dispatch the modifier up event to the root window instead.
377 aura::Window* modifier_up_target = 417 aura::Window* modifier_up_target =
378 window_tracker.Contains(target) ? target : root_window; 418 window_tracker.Contains(target) ? target : root_window;
379 delegate_->DispatchKeyEvent(modifier_up_event_.get(), modifier_up_target); 419 delegate_->DispatchKeyEvent(modifier_up_event_.get(), modifier_up_target);
380 event_from_myself_ = false; 420 event_from_myself_ = false;
381 } 421 }
382 422
383 void StickyKeysHandler::AppendNativeEventMask(unsigned int* state) { 423 void StickyKeysHandler::AppendNativeEventMask(unsigned int* state) {
384 unsigned int& state_ref = *state; 424 unsigned int& state_ref = *state;
385 switch (modifier_flag_) { 425 switch (modifier_) {
386 case ui::EF_CONTROL_DOWN: 426 case STICKY_KEY_CONTROL:
387 state_ref |= ControlMask; 427 state_ref |= ControlMask;
388 break; 428 break;
389 case ui::EF_ALT_DOWN: 429 case STICKY_KEY_ALT:
390 state_ref |= Mod1Mask; 430 state_ref |= Mod1Mask;
391 break; 431 break;
392 case ui::EF_SHIFT_DOWN: 432 case STICKY_KEY_SHIFT:
393 state_ref |= ShiftMask; 433 state_ref |= ShiftMask;
394 break; 434 break;
435 case STICKY_KEY_SEARCH:
436 break;
395 default: 437 default:
396 NOTREACHED(); 438 NOTREACHED();
397 } 439 }
398 } 440 }
399 441
400 void StickyKeysHandler::AppendModifier(ui::KeyEvent* event) { 442 void StickyKeysHandler::AppendModifier(ui::KeyEvent* event) {
401 #if defined(USE_X11) 443 #if defined(USE_X11)
402 XEvent* xev = event->native_event(); 444 XEvent* xev = event->native_event();
403 if (xev) { 445 if (xev) {
404 XKeyEvent* xkey = &(xev->xkey); 446 XKeyEvent* xkey = &(xev->xkey);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 &xievent->mods.effective)); 479 &xievent->mods.effective));
438 } 480 }
439 } 481 }
440 #elif defined(USE_OZONE) 482 #elif defined(USE_OZONE)
441 NOTIMPLEMENTED() << "Modifier key is not handled"; 483 NOTIMPLEMENTED() << "Modifier key is not handled";
442 #endif 484 #endif
443 event->set_flags(event->flags() | modifier_flag_); 485 event->set_flags(event->flags() | modifier_flag_);
444 } 486 }
445 487
446 } // namespace ash 488 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698