Chromium Code Reviews| 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 |