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) { | |
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 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( | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |