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 #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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |