OLD | NEW |
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 #include "ash/sticky_keys/sticky_keys_overlay.h" | 7 #include "ash/sticky_keys/sticky_keys_overlay.h" |
8 #include "base/debug/stack_trace.h" | 8 #include "base/debug/stack_trace.h" |
9 #include "ui/aura/window.h" | 9 #include "ui/aura/window.h" |
10 #include "ui/aura/window_tracker.h" | 10 #include "ui/aura/window_tracker.h" |
(...skipping 27 matching lines...) Expand all Loading... |
38 if (changed_down_flags) | 38 if (changed_down_flags) |
39 return ui::EVENT_REWRITE_REWRITTEN; | 39 return ui::EVENT_REWRITE_REWRITTEN; |
40 return ui::EVENT_REWRITE_CONTINUE; | 40 return ui::EVENT_REWRITE_CONTINUE; |
41 } | 41 } |
42 | 42 |
43 } // namespace | 43 } // namespace |
44 | 44 |
45 /////////////////////////////////////////////////////////////////////////////// | 45 /////////////////////////////////////////////////////////////////////////////// |
46 // StickyKeys | 46 // StickyKeys |
47 StickyKeysController::StickyKeysController() | 47 StickyKeysController::StickyKeysController() |
48 : enabled_(false), | 48 : enabled_(false), mod3_enabled_(false), altgr_enabled_(false) {} |
49 mod3_enabled_(false), | |
50 altgr_enabled_(false) { | |
51 } | |
52 | 49 |
53 StickyKeysController::~StickyKeysController() { | 50 StickyKeysController::~StickyKeysController() {} |
54 } | |
55 | 51 |
56 void StickyKeysController::Enable(bool enabled) { | 52 void StickyKeysController::Enable(bool enabled) { |
57 if (enabled_ != enabled) { | 53 if (enabled_ != enabled) { |
58 enabled_ = enabled; | 54 enabled_ = enabled; |
59 | 55 |
60 // Reset key handlers when activating sticky keys to ensure all | 56 // Reset key handlers when activating sticky keys to ensure all |
61 // the handlers' states are reset. | 57 // the handlers' states are reset. |
62 if (enabled_) { | 58 if (enabled_) { |
63 shift_sticky_key_.reset(new StickyKeysHandler(ui::EF_SHIFT_DOWN)); | 59 shift_sticky_key_.reset(new StickyKeysHandler(ui::EF_SHIFT_DOWN)); |
64 alt_sticky_key_.reset(new StickyKeysHandler(ui::EF_ALT_DOWN)); | 60 alt_sticky_key_.reset(new StickyKeysHandler(ui::EF_ALT_DOWN)); |
(...skipping 18 matching lines...) Expand all Loading... |
83 if (overlay_) { | 79 if (overlay_) { |
84 overlay_->SetModifierVisible(ui::EF_ALTGR_DOWN, altgr_enabled_); | 80 overlay_->SetModifierVisible(ui::EF_ALTGR_DOWN, altgr_enabled_); |
85 overlay_->SetModifierVisible(ui::EF_MOD3_DOWN, mod3_enabled_); | 81 overlay_->SetModifierVisible(ui::EF_MOD3_DOWN, mod3_enabled_); |
86 } | 82 } |
87 } | 83 } |
88 | 84 |
89 bool StickyKeysController::HandleKeyEvent(const ui::KeyEvent& event, | 85 bool StickyKeysController::HandleKeyEvent(const ui::KeyEvent& event, |
90 ui::KeyboardCode key_code, | 86 ui::KeyboardCode key_code, |
91 int* mod_down_flags, | 87 int* mod_down_flags, |
92 bool* released) { | 88 bool* released) { |
93 return shift_sticky_key_->HandleKeyEvent( | 89 return shift_sticky_key_->HandleKeyEvent(event, key_code, mod_down_flags, |
94 event, key_code, mod_down_flags, released) || | 90 released) || |
95 alt_sticky_key_->HandleKeyEvent( | 91 alt_sticky_key_->HandleKeyEvent(event, key_code, mod_down_flags, |
96 event, key_code, mod_down_flags, released) || | 92 released) || |
97 altgr_sticky_key_->HandleKeyEvent( | 93 altgr_sticky_key_->HandleKeyEvent(event, key_code, mod_down_flags, |
98 event, key_code, mod_down_flags, released) || | 94 released) || |
99 ctrl_sticky_key_->HandleKeyEvent( | 95 ctrl_sticky_key_->HandleKeyEvent(event, key_code, mod_down_flags, |
100 event, key_code, mod_down_flags, released) || | 96 released) || |
101 mod3_sticky_key_->HandleKeyEvent( | 97 mod3_sticky_key_->HandleKeyEvent(event, key_code, mod_down_flags, |
102 event, key_code, mod_down_flags, released) || | 98 released) || |
103 search_sticky_key_->HandleKeyEvent( | 99 search_sticky_key_->HandleKeyEvent(event, key_code, mod_down_flags, |
104 event, key_code, mod_down_flags, released); | 100 released); |
105 } | 101 } |
106 | 102 |
107 bool StickyKeysController::HandleMouseEvent(const ui::MouseEvent& event, | 103 bool StickyKeysController::HandleMouseEvent(const ui::MouseEvent& event, |
108 int* mod_down_flags, | 104 int* mod_down_flags, |
109 bool* released) { | 105 bool* released) { |
110 return shift_sticky_key_->HandleMouseEvent( | 106 return shift_sticky_key_->HandleMouseEvent(event, mod_down_flags, released) || |
111 event, mod_down_flags, released) || | 107 alt_sticky_key_->HandleMouseEvent(event, mod_down_flags, released) || |
112 alt_sticky_key_->HandleMouseEvent( | 108 altgr_sticky_key_->HandleMouseEvent(event, mod_down_flags, released) || |
113 event, mod_down_flags, released) || | 109 ctrl_sticky_key_->HandleMouseEvent(event, mod_down_flags, released) || |
114 altgr_sticky_key_->HandleMouseEvent( | 110 mod3_sticky_key_->HandleMouseEvent(event, mod_down_flags, released); |
115 event, mod_down_flags, released) || | |
116 ctrl_sticky_key_->HandleMouseEvent( | |
117 event, mod_down_flags, released) || | |
118 mod3_sticky_key_->HandleMouseEvent( | |
119 event, mod_down_flags, released); | |
120 } | 111 } |
121 | 112 |
122 bool StickyKeysController::HandleScrollEvent(const ui::ScrollEvent& event, | 113 bool StickyKeysController::HandleScrollEvent(const ui::ScrollEvent& event, |
123 int* mod_down_flags, | 114 int* mod_down_flags, |
124 bool* released) { | 115 bool* released) { |
125 return shift_sticky_key_->HandleScrollEvent( | 116 return shift_sticky_key_->HandleScrollEvent(event, mod_down_flags, |
126 event, mod_down_flags, released) || | 117 released) || |
127 alt_sticky_key_->HandleScrollEvent( | 118 alt_sticky_key_->HandleScrollEvent(event, mod_down_flags, released) || |
128 event, mod_down_flags, released) || | 119 altgr_sticky_key_->HandleScrollEvent(event, mod_down_flags, |
129 altgr_sticky_key_->HandleScrollEvent( | 120 released) || |
130 event, mod_down_flags, released) || | 121 ctrl_sticky_key_->HandleScrollEvent(event, mod_down_flags, released) || |
131 ctrl_sticky_key_->HandleScrollEvent( | 122 mod3_sticky_key_->HandleScrollEvent(event, mod_down_flags, released); |
132 event, mod_down_flags, released) || | |
133 mod3_sticky_key_->HandleScrollEvent( | |
134 event, mod_down_flags, released); | |
135 } | 123 } |
136 | 124 |
137 ui::EventRewriteStatus StickyKeysController::RewriteKeyEvent( | 125 ui::EventRewriteStatus StickyKeysController::RewriteKeyEvent( |
138 const ui::KeyEvent& event, | 126 const ui::KeyEvent& event, |
139 ui::KeyboardCode key_code, | 127 ui::KeyboardCode key_code, |
140 int* flags) { | 128 int* flags) { |
141 if (!enabled_) | 129 if (!enabled_) |
142 return ui::EVENT_REWRITE_CONTINUE; | 130 return ui::EVENT_REWRITE_CONTINUE; |
143 int mod_down_flags = 0; | 131 int mod_down_flags = 0; |
144 bool released = false; | 132 bool released = false; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 mod3_sticky_key_->GetModifierUpEvent(new_event) + | 170 mod3_sticky_key_->GetModifierUpEvent(new_event) + |
183 search_sticky_key_->GetModifierUpEvent(new_event); | 171 search_sticky_key_->GetModifierUpEvent(new_event); |
184 if (!new_event) | 172 if (!new_event) |
185 return ui::EVENT_REWRITE_CONTINUE; | 173 return ui::EVENT_REWRITE_CONTINUE; |
186 if (remaining) | 174 if (remaining) |
187 return ui::EVENT_REWRITE_DISPATCH_ANOTHER; | 175 return ui::EVENT_REWRITE_DISPATCH_ANOTHER; |
188 return ui::EVENT_REWRITE_REWRITTEN; | 176 return ui::EVENT_REWRITE_REWRITTEN; |
189 } | 177 } |
190 | 178 |
191 void StickyKeysController::UpdateOverlay() { | 179 void StickyKeysController::UpdateOverlay() { |
192 overlay_->SetModifierKeyState( | 180 overlay_->SetModifierKeyState(ui::EF_SHIFT_DOWN, |
193 ui::EF_SHIFT_DOWN, shift_sticky_key_->current_state()); | 181 shift_sticky_key_->current_state()); |
194 overlay_->SetModifierKeyState( | 182 overlay_->SetModifierKeyState(ui::EF_CONTROL_DOWN, |
195 ui::EF_CONTROL_DOWN, ctrl_sticky_key_->current_state()); | 183 ctrl_sticky_key_->current_state()); |
196 overlay_->SetModifierKeyState( | 184 overlay_->SetModifierKeyState(ui::EF_ALT_DOWN, |
197 ui::EF_ALT_DOWN, alt_sticky_key_->current_state()); | 185 alt_sticky_key_->current_state()); |
198 overlay_->SetModifierKeyState( | 186 overlay_->SetModifierKeyState(ui::EF_COMMAND_DOWN, |
199 ui::EF_COMMAND_DOWN, search_sticky_key_->current_state()); | 187 search_sticky_key_->current_state()); |
200 overlay_->SetModifierKeyState( | 188 overlay_->SetModifierKeyState(ui::EF_ALTGR_DOWN, |
201 ui::EF_ALTGR_DOWN, altgr_sticky_key_->current_state()); | 189 altgr_sticky_key_->current_state()); |
202 overlay_->SetModifierKeyState( | 190 overlay_->SetModifierKeyState(ui::EF_MOD3_DOWN, |
203 ui::EF_MOD3_DOWN, mod3_sticky_key_->current_state()); | 191 mod3_sticky_key_->current_state()); |
204 | 192 |
205 bool key_in_use = | 193 bool key_in_use = |
206 shift_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED || | 194 shift_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED || |
207 alt_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED || | 195 alt_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED || |
208 altgr_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED || | 196 altgr_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED || |
209 ctrl_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED || | 197 ctrl_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED || |
210 search_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED || | 198 search_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED || |
211 mod3_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED; | 199 mod3_sticky_key_->current_state() != STICKY_KEY_STATE_DISABLED; |
212 | 200 |
213 overlay_->Show(enabled_ && key_in_use); | 201 overlay_->Show(enabled_ && key_in_use); |
214 } | 202 } |
215 | 203 |
216 StickyKeysOverlay* StickyKeysController::GetOverlayForTest() { | 204 StickyKeysOverlay* StickyKeysController::GetOverlayForTest() { |
217 return overlay_.get(); | 205 return overlay_.get(); |
218 } | 206 } |
219 | 207 |
220 /////////////////////////////////////////////////////////////////////////////// | 208 /////////////////////////////////////////////////////////////////////////////// |
221 // StickyKeysHandler | 209 // StickyKeysHandler |
222 StickyKeysHandler::StickyKeysHandler(ui::EventFlags modifier_flag) | 210 StickyKeysHandler::StickyKeysHandler(ui::EventFlags modifier_flag) |
223 : modifier_flag_(modifier_flag), | 211 : modifier_flag_(modifier_flag), |
224 current_state_(STICKY_KEY_STATE_DISABLED), | 212 current_state_(STICKY_KEY_STATE_DISABLED), |
225 preparing_to_enable_(false), | 213 preparing_to_enable_(false), |
226 scroll_delta_(0) { | 214 scroll_delta_(0) {} |
227 } | |
228 | 215 |
229 StickyKeysHandler::~StickyKeysHandler() { | 216 StickyKeysHandler::~StickyKeysHandler() {} |
230 } | |
231 | 217 |
232 bool StickyKeysHandler::HandleKeyEvent(const ui::KeyEvent& event, | 218 bool StickyKeysHandler::HandleKeyEvent(const ui::KeyEvent& event, |
233 ui::KeyboardCode key_code, | 219 ui::KeyboardCode key_code, |
234 int* mod_down_flags, | 220 int* mod_down_flags, |
235 bool* released) { | 221 bool* released) { |
236 switch (current_state_) { | 222 switch (current_state_) { |
237 case STICKY_KEY_STATE_DISABLED: | 223 case STICKY_KEY_STATE_DISABLED: |
238 return HandleDisabledState(event, key_code); | 224 return HandleDisabledState(event, key_code); |
239 case STICKY_KEY_STATE_ENABLED: | 225 case STICKY_KEY_STATE_ENABLED: |
240 return HandleEnabledState(event, key_code, mod_down_flags, released); | 226 return HandleEnabledState(event, key_code, mod_down_flags, released); |
241 case STICKY_KEY_STATE_LOCKED: | 227 case STICKY_KEY_STATE_LOCKED: |
242 return HandleLockedState(event, key_code, mod_down_flags, released); | 228 return HandleLockedState(event, key_code, mod_down_flags, released); |
243 } | 229 } |
244 NOTREACHED(); | 230 NOTREACHED(); |
245 return false; | 231 return false; |
246 } | 232 } |
247 | 233 |
248 bool StickyKeysHandler::HandleMouseEvent( | 234 bool StickyKeysHandler::HandleMouseEvent(const ui::MouseEvent& event, |
249 const ui::MouseEvent& event, | 235 int* mod_down_flags, |
250 int* mod_down_flags, | 236 bool* released) { |
251 bool* released) { | |
252 if (ShouldModifyMouseEvent(event)) | 237 if (ShouldModifyMouseEvent(event)) |
253 preparing_to_enable_ = false; | 238 preparing_to_enable_ = false; |
254 | 239 |
255 if (current_state_ == STICKY_KEY_STATE_DISABLED || | 240 if (current_state_ == STICKY_KEY_STATE_DISABLED || |
256 !ShouldModifyMouseEvent(event)) { | 241 !ShouldModifyMouseEvent(event)) { |
257 return false; | 242 return false; |
258 } | 243 } |
259 DCHECK(current_state_ == STICKY_KEY_STATE_ENABLED || | 244 DCHECK(current_state_ == STICKY_KEY_STATE_ENABLED || |
260 current_state_ == STICKY_KEY_STATE_LOCKED); | 245 current_state_ == STICKY_KEY_STATE_LOCKED); |
261 | 246 |
262 *mod_down_flags |= modifier_flag_; | 247 *mod_down_flags |= modifier_flag_; |
263 // Only disable on the mouse released event in normal, non-locked mode. | 248 // Only disable on the mouse released event in normal, non-locked mode. |
264 if (current_state_ == STICKY_KEY_STATE_ENABLED && | 249 if (current_state_ == STICKY_KEY_STATE_ENABLED && |
265 event.type() != ui::ET_MOUSE_PRESSED) { | 250 event.type() != ui::ET_MOUSE_PRESSED) { |
266 current_state_ = STICKY_KEY_STATE_DISABLED; | 251 current_state_ = STICKY_KEY_STATE_DISABLED; |
267 *released = true; | 252 *released = true; |
268 return false; | 253 return false; |
269 } | 254 } |
270 | 255 |
271 return false; | 256 return false; |
272 } | 257 } |
273 | 258 |
274 bool StickyKeysHandler::HandleScrollEvent( | 259 bool StickyKeysHandler::HandleScrollEvent(const ui::ScrollEvent& event, |
275 const ui::ScrollEvent& event, | 260 int* mod_down_flags, |
276 int* mod_down_flags, | 261 bool* released) { |
277 bool* released) { | |
278 preparing_to_enable_ = false; | 262 preparing_to_enable_ = false; |
279 if (current_state_ == STICKY_KEY_STATE_DISABLED) | 263 if (current_state_ == STICKY_KEY_STATE_DISABLED) |
280 return false; | 264 return false; |
281 DCHECK(current_state_ == STICKY_KEY_STATE_ENABLED || | 265 DCHECK(current_state_ == STICKY_KEY_STATE_ENABLED || |
282 current_state_ == STICKY_KEY_STATE_LOCKED); | 266 current_state_ == STICKY_KEY_STATE_LOCKED); |
283 | 267 |
284 // 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 |
285 // 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. |
286 bool direction_changed = false; | 270 bool direction_changed = false; |
287 if (current_state_ == STICKY_KEY_STATE_ENABLED && | 271 if (current_state_ == STICKY_KEY_STATE_ENABLED && |
(...skipping 29 matching lines...) Expand all Loading... |
317 if (*new_event) | 301 if (*new_event) |
318 return 1; | 302 return 1; |
319 new_event->reset(modifier_up_event_.release()); | 303 new_event->reset(modifier_up_event_.release()); |
320 return 0; | 304 return 0; |
321 } | 305 } |
322 | 306 |
323 StickyKeysHandler::KeyEventType StickyKeysHandler::TranslateKeyEvent( | 307 StickyKeysHandler::KeyEventType StickyKeysHandler::TranslateKeyEvent( |
324 ui::EventType type, | 308 ui::EventType type, |
325 ui::KeyboardCode key_code) { | 309 ui::KeyboardCode key_code) { |
326 bool is_target_key = false; | 310 bool is_target_key = false; |
327 if (key_code == ui::VKEY_SHIFT || | 311 if (key_code == ui::VKEY_SHIFT || key_code == ui::VKEY_LSHIFT || |
328 key_code == ui::VKEY_LSHIFT || | |
329 key_code == ui::VKEY_RSHIFT) { | 312 key_code == ui::VKEY_RSHIFT) { |
330 is_target_key = (modifier_flag_ == ui::EF_SHIFT_DOWN); | 313 is_target_key = (modifier_flag_ == ui::EF_SHIFT_DOWN); |
331 } else if (key_code == ui::VKEY_CONTROL || | 314 } else if (key_code == ui::VKEY_CONTROL || key_code == ui::VKEY_LCONTROL || |
332 key_code == ui::VKEY_LCONTROL || | 315 key_code == ui::VKEY_RCONTROL) { |
333 key_code == ui::VKEY_RCONTROL) { | |
334 is_target_key = (modifier_flag_ == ui::EF_CONTROL_DOWN); | 316 is_target_key = (modifier_flag_ == ui::EF_CONTROL_DOWN); |
335 } else if (key_code == ui::VKEY_MENU || | 317 } else if (key_code == ui::VKEY_MENU || key_code == ui::VKEY_LMENU || |
336 key_code == ui::VKEY_LMENU || | 318 key_code == ui::VKEY_RMENU) { |
337 key_code == ui::VKEY_RMENU) { | |
338 is_target_key = (modifier_flag_ == ui::EF_ALT_DOWN); | 319 is_target_key = (modifier_flag_ == ui::EF_ALT_DOWN); |
339 } else if (key_code == ui::VKEY_ALTGR) { | 320 } else if (key_code == ui::VKEY_ALTGR) { |
340 is_target_key = (modifier_flag_ == ui::EF_ALTGR_DOWN); | 321 is_target_key = (modifier_flag_ == ui::EF_ALTGR_DOWN); |
341 } else if (key_code == ui::VKEY_OEM_8) { | 322 } else if (key_code == ui::VKEY_OEM_8) { |
342 is_target_key = (modifier_flag_ == ui::EF_MOD3_DOWN); | 323 is_target_key = (modifier_flag_ == ui::EF_MOD3_DOWN); |
343 } else if (key_code == ui::VKEY_LWIN) { | 324 } else if (key_code == ui::VKEY_LWIN) { |
344 is_target_key = (modifier_flag_ == ui::EF_COMMAND_DOWN); | 325 is_target_key = (modifier_flag_ == ui::EF_COMMAND_DOWN); |
345 } else { | 326 } else { |
346 return type == ui::ET_KEY_PRESSED ? | 327 return type == ui::ET_KEY_PRESSED ? NORMAL_KEY_DOWN : NORMAL_KEY_UP; |
347 NORMAL_KEY_DOWN : NORMAL_KEY_UP; | |
348 } | 328 } |
349 | 329 |
350 if (is_target_key) { | 330 if (is_target_key) { |
351 return type == ui::ET_KEY_PRESSED ? | 331 return type == ui::ET_KEY_PRESSED ? TARGET_MODIFIER_DOWN |
352 TARGET_MODIFIER_DOWN : TARGET_MODIFIER_UP; | 332 : TARGET_MODIFIER_UP; |
353 } | 333 } |
354 return type == ui::ET_KEY_PRESSED ? | 334 return type == ui::ET_KEY_PRESSED ? OTHER_MODIFIER_DOWN : OTHER_MODIFIER_UP; |
355 OTHER_MODIFIER_DOWN : OTHER_MODIFIER_UP; | |
356 } | 335 } |
357 | 336 |
358 bool StickyKeysHandler::HandleDisabledState(const ui::KeyEvent& event, | 337 bool StickyKeysHandler::HandleDisabledState(const ui::KeyEvent& event, |
359 ui::KeyboardCode key_code) { | 338 ui::KeyboardCode key_code) { |
360 switch (TranslateKeyEvent(event.type(), key_code)) { | 339 switch (TranslateKeyEvent(event.type(), key_code)) { |
361 case TARGET_MODIFIER_UP: | 340 case TARGET_MODIFIER_UP: |
362 if (preparing_to_enable_) { | 341 if (preparing_to_enable_) { |
363 preparing_to_enable_ = false; | 342 preparing_to_enable_ = false; |
364 scroll_delta_ = 0; | 343 scroll_delta_ = 0; |
365 current_state_ = STICKY_KEY_STATE_ENABLED; | 344 current_state_ = STICKY_KEY_STATE_ENABLED; |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
424 return false; | 403 return false; |
425 case OTHER_MODIFIER_DOWN: | 404 case OTHER_MODIFIER_DOWN: |
426 case OTHER_MODIFIER_UP: | 405 case OTHER_MODIFIER_UP: |
427 return false; | 406 return false; |
428 } | 407 } |
429 NOTREACHED(); | 408 NOTREACHED(); |
430 return false; | 409 return false; |
431 } | 410 } |
432 | 411 |
433 } // namespace ash | 412 } // namespace ash |
OLD | NEW |