| 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/wm/sticky_keys.h" | 5 #include "ash/wm/sticky_keys.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 |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 } | 165 } |
| 166 | 166 |
| 167 /////////////////////////////////////////////////////////////////////////////// | 167 /////////////////////////////////////////////////////////////////////////////// |
| 168 // StickyKeysHandler | 168 // StickyKeysHandler |
| 169 StickyKeysHandler::StickyKeysHandler(ui::EventFlags target_modifier_flag, | 169 StickyKeysHandler::StickyKeysHandler(ui::EventFlags target_modifier_flag, |
| 170 StickyKeysHandlerDelegate* delegate) | 170 StickyKeysHandlerDelegate* delegate) |
| 171 : modifier_flag_(target_modifier_flag), | 171 : modifier_flag_(target_modifier_flag), |
| 172 current_state_(DISABLED), | 172 current_state_(DISABLED), |
| 173 event_from_myself_(false), | 173 event_from_myself_(false), |
| 174 preparing_to_enable_(false), | 174 preparing_to_enable_(false), |
| 175 scroll_delta_(0), |
| 175 delegate_(delegate) { | 176 delegate_(delegate) { |
| 176 } | 177 } |
| 177 | 178 |
| 178 StickyKeysHandler::~StickyKeysHandler() { | 179 StickyKeysHandler::~StickyKeysHandler() { |
| 179 } | 180 } |
| 180 | 181 |
| 181 StickyKeysHandler::StickyKeysHandlerDelegate::StickyKeysHandlerDelegate() { | 182 StickyKeysHandler::StickyKeysHandlerDelegate::StickyKeysHandlerDelegate() { |
| 182 } | 183 } |
| 183 | 184 |
| 184 StickyKeysHandler::StickyKeysHandlerDelegate::~StickyKeysHandlerDelegate() { | 185 StickyKeysHandler::StickyKeysHandlerDelegate::~StickyKeysHandlerDelegate() { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 return true; | 217 return true; |
| 217 } | 218 } |
| 218 | 219 |
| 219 return false; | 220 return false; |
| 220 } | 221 } |
| 221 | 222 |
| 222 bool StickyKeysHandler::HandleScrollEvent(ui::ScrollEvent* event) { | 223 bool StickyKeysHandler::HandleScrollEvent(ui::ScrollEvent* event) { |
| 223 if (event_from_myself_ || current_state_ == DISABLED) | 224 if (event_from_myself_ || current_state_ == DISABLED) |
| 224 return false; | 225 return false; |
| 225 DCHECK(current_state_ == ENABLED || current_state_ == LOCKED); | 226 DCHECK(current_state_ == ENABLED || current_state_ == LOCKED); |
| 227 preparing_to_enable_ = false; |
| 226 | 228 |
| 227 preparing_to_enable_ = false; | 229 // We detect a direction change if the current |scroll_delta_| is assigned |
| 228 AppendModifier(event); | 230 // and the offset of the current scroll event has the opposing sign. |
| 229 if (current_state_ == ENABLED) { | 231 bool direction_changed = false; |
| 232 if (current_state_ == ENABLED && event->type() == ui::ET_SCROLL) { |
| 233 int offset = event->y_offset(); |
| 234 if (scroll_delta_) |
| 235 direction_changed = offset * scroll_delta_ <= 0; |
| 236 scroll_delta_ = offset; |
| 237 } |
| 238 |
| 239 if (!direction_changed) |
| 240 AppendModifier(event); |
| 241 |
| 242 // 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 |
| 244 // direction. |
| 245 if (current_state_ == ENABLED && |
| 246 (event->type() == ui::ET_SCROLL_FLING_START || direction_changed)) { |
| 230 current_state_ = DISABLED; | 247 current_state_ = DISABLED; |
| 248 scroll_delta_ = 0; |
| 231 DispatchEventAndReleaseModifier(event); | 249 DispatchEventAndReleaseModifier(event); |
| 232 return true; | 250 return true; |
| 233 } | 251 } |
| 234 | 252 |
| 235 return false; | 253 return false; |
| 236 } | 254 } |
| 237 | 255 |
| 238 StickyKeysHandler::KeyEventType | 256 StickyKeysHandler::KeyEventType |
| 239 StickyKeysHandler::TranslateKeyEvent(ui::KeyEvent* event) { | 257 StickyKeysHandler::TranslateKeyEvent(ui::KeyEvent* event) { |
| 240 bool is_target_key = false; | 258 bool is_target_key = false; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 261 } | 279 } |
| 262 return event->type() == ui::ET_KEY_PRESSED ? | 280 return event->type() == ui::ET_KEY_PRESSED ? |
| 263 OTHER_MODIFIER_DOWN : OTHER_MODIFIER_UP; | 281 OTHER_MODIFIER_DOWN : OTHER_MODIFIER_UP; |
| 264 } | 282 } |
| 265 | 283 |
| 266 bool StickyKeysHandler::HandleDisabledState(ui::KeyEvent* event) { | 284 bool StickyKeysHandler::HandleDisabledState(ui::KeyEvent* event) { |
| 267 switch (TranslateKeyEvent(event)) { | 285 switch (TranslateKeyEvent(event)) { |
| 268 case TARGET_MODIFIER_UP: | 286 case TARGET_MODIFIER_UP: |
| 269 if (preparing_to_enable_) { | 287 if (preparing_to_enable_) { |
| 270 preparing_to_enable_ = false; | 288 preparing_to_enable_ = false; |
| 289 scroll_delta_ = 0; |
| 271 current_state_ = ENABLED; | 290 current_state_ = ENABLED; |
| 272 modifier_up_event_.reset(event->Copy()); | 291 modifier_up_event_.reset(event->Copy()); |
| 273 return true; | 292 return true; |
| 274 } | 293 } |
| 275 return false; | 294 return false; |
| 276 case TARGET_MODIFIER_DOWN: | 295 case TARGET_MODIFIER_DOWN: |
| 277 preparing_to_enable_ = true; | 296 preparing_to_enable_ = true; |
| 278 return false; | 297 return false; |
| 279 case NORMAL_KEY_DOWN: | 298 case NORMAL_KEY_DOWN: |
| 280 preparing_to_enable_ = false; | 299 preparing_to_enable_ = false; |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 418 &xievent->mods.effective)); | 437 &xievent->mods.effective)); |
| 419 } | 438 } |
| 420 } | 439 } |
| 421 #elif defined(USE_OZONE) | 440 #elif defined(USE_OZONE) |
| 422 NOTIMPLEMENTED() << "Modifier key is not handled"; | 441 NOTIMPLEMENTED() << "Modifier key is not handled"; |
| 423 #endif | 442 #endif |
| 424 event->set_flags(event->flags() | modifier_flag_); | 443 event->set_flags(event->flags() | modifier_flag_); |
| 425 } | 444 } |
| 426 | 445 |
| 427 } // namespace ash | 446 } // namespace ash |
| OLD | NEW |