| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "ui/chromeos/touch_exploration_controller.h" | 5 #include "ui/chromeos/touch_exploration_controller.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/strings/string_number_conversions.h" | 8 #include "base/strings/string_number_conversions.h" |
| 9 #include "ui/aura/client/cursor_client.h" | 9 #include "ui/aura/client/cursor_client.h" |
| 10 #include "ui/aura/window.h" | 10 #include "ui/aura/window.h" |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 bool TouchExplorationController::IsInNoFingersDownStateForTesting() const { | 47 bool TouchExplorationController::IsInNoFingersDownStateForTesting() const { |
| 48 return state_ == NO_FINGERS_DOWN; | 48 return state_ == NO_FINGERS_DOWN; |
| 49 } | 49 } |
| 50 | 50 |
| 51 ui::EventRewriteStatus TouchExplorationController::RewriteEvent( | 51 ui::EventRewriteStatus TouchExplorationController::RewriteEvent( |
| 52 const ui::Event& event, | 52 const ui::Event& event, |
| 53 scoped_ptr<ui::Event>* rewritten_event) { | 53 scoped_ptr<ui::Event>* rewritten_event) { |
| 54 if (!event.IsTouchEvent()) { | 54 if (!event.IsTouchEvent()) { |
| 55 if (event.IsKeyEvent()) { | 55 if (event.IsKeyEvent()) { |
| 56 const ui::KeyEvent& key_event = static_cast<const ui::KeyEvent&>(event); | 56 const ui::KeyEvent& key_event = static_cast<const ui::KeyEvent&>(event); |
| 57 VLOG(0) << "\nKeyboard event: " << key_event.name() << "\n" | 57 VLOG(0) << "\nKeyboard event: " << key_event.name() |
| 58 << " Key code: " << key_event.key_code() | 58 << "\n Key code: " << key_event.key_code() |
| 59 << ", Flags: " << key_event.flags() | 59 << ", Flags: " << key_event.flags() |
| 60 << ", Is char: " << key_event.is_char(); | 60 << ", Is char: " << key_event.is_char(); |
| 61 } | 61 } |
| 62 if(event.IsGestureEvent()){ | 62 if(event.IsGestureEvent()){ |
| 63 VLOG(0) << "\n Gesture event " << event.name(); | 63 VLOG(0) << "\n Gesture event " << event.name(); |
| 64 } | 64 } |
| 65 return ui::EVENT_REWRITE_CONTINUE; | 65 return ui::EVENT_REWRITE_CONTINUE; |
| 66 } | 66 } |
| 67 const ui::TouchEvent& touch_event = static_cast<const ui::TouchEvent&>(event); | 67 const ui::TouchEvent& touch_event = static_cast<const ui::TouchEvent&>(event); |
| 68 | 68 |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 initial_press_.reset(new TouchEvent(event)); | 149 initial_press_.reset(new TouchEvent(event)); |
| 150 last_unused_finger_event_.reset(new TouchEvent(event)); | 150 last_unused_finger_event_.reset(new TouchEvent(event)); |
| 151 tap_timer_.Start(FROM_HERE, | 151 tap_timer_.Start(FROM_HERE, |
| 152 gesture_detector_config_.double_tap_timeout, | 152 gesture_detector_config_.double_tap_timeout, |
| 153 this, | 153 this, |
| 154 &TouchExplorationController::OnTapTimerFired); | 154 &TouchExplorationController::OnTapTimerFired); |
| 155 state_ = SINGLE_TAP_PRESSED; | 155 state_ = SINGLE_TAP_PRESSED; |
| 156 VLOG_STATE(); | 156 VLOG_STATE(); |
| 157 return ui::EVENT_REWRITE_DISCARD; | 157 return ui::EVENT_REWRITE_DISCARD; |
| 158 } | 158 } |
| 159 NOTREACHED() << "Unexpected event type received."; | 159 NOTREACHED() << "Unexpected event type received: " << event.name();; |
| 160 return ui::EVENT_REWRITE_CONTINUE; | 160 return ui::EVENT_REWRITE_CONTINUE; |
| 161 } | 161 } |
| 162 | 162 |
| 163 ui::EventRewriteStatus TouchExplorationController::InSingleTapPressed( | 163 ui::EventRewriteStatus TouchExplorationController::InSingleTapPressed( |
| 164 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event) { | 164 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event) { |
| 165 const ui::EventType type = event.type(); | 165 const ui::EventType type = event.type(); |
| 166 | 166 |
| 167 if (type == ui::ET_TOUCH_PRESSED) { | 167 if (type == ui::ET_TOUCH_PRESSED) { |
| 168 // Adding a second finger within the timeout period switches to | 168 // Adding a second finger within the timeout period switches to |
| 169 // passing through every event from the second finger and none form the | 169 // passing through every event from the second finger and none form the |
| (...skipping 19 matching lines...) Expand all Loading... |
| 189 // high enough, and touch exploration if the velocity is lower. | 189 // high enough, and touch exploration if the velocity is lower. |
| 190 float delta = (event.location() - initial_press_->location()).Length(); | 190 float delta = (event.location() - initial_press_->location()).Length(); |
| 191 if (delta > gesture_detector_config_.touch_slop) { | 191 if (delta > gesture_detector_config_.touch_slop) { |
| 192 EnterTouchToMouseMode(); | 192 EnterTouchToMouseMode(); |
| 193 state_ = TOUCH_EXPLORATION; | 193 state_ = TOUCH_EXPLORATION; |
| 194 VLOG_STATE(); | 194 VLOG_STATE(); |
| 195 return InTouchExploration(event, rewritten_event); | 195 return InTouchExploration(event, rewritten_event); |
| 196 } | 196 } |
| 197 return EVENT_REWRITE_DISCARD; | 197 return EVENT_REWRITE_DISCARD; |
| 198 } | 198 } |
| 199 NOTREACHED() << "Unexpected event type received."; | 199 NOTREACHED() << "Unexpected event type received: " << event.name();; |
| 200 return ui::EVENT_REWRITE_CONTINUE; | 200 return ui::EVENT_REWRITE_CONTINUE; |
| 201 } | 201 } |
| 202 | 202 |
| 203 ui::EventRewriteStatus | 203 ui::EventRewriteStatus |
| 204 TouchExplorationController::InSingleTapOrTouchExploreReleased( | 204 TouchExplorationController::InSingleTapOrTouchExploreReleased( |
| 205 const ui::TouchEvent& event, | 205 const ui::TouchEvent& event, |
| 206 scoped_ptr<ui::Event>* rewritten_event) { | 206 scoped_ptr<ui::Event>* rewritten_event) { |
| 207 const ui::EventType type = event.type(); | 207 const ui::EventType type = event.type(); |
| 208 if (type == ui::ET_TOUCH_PRESSED) { | 208 if (type == ui::ET_TOUCH_PRESSED) { |
| 209 // This is the second tap in a double-tap (or double tap-hold). | 209 // This is the second tap in a double-tap (or double tap-hold). |
| (...skipping 11 matching lines...) Expand all Loading... |
| 221 state_ = DOUBLE_TAP_PRESSED; | 221 state_ = DOUBLE_TAP_PRESSED; |
| 222 VLOG_STATE(); | 222 VLOG_STATE(); |
| 223 return ui::EVENT_REWRITE_REWRITTEN; | 223 return ui::EVENT_REWRITE_REWRITTEN; |
| 224 } else if (type == ui::ET_TOUCH_RELEASED && !last_touch_exploration_) { | 224 } else if (type == ui::ET_TOUCH_RELEASED && !last_touch_exploration_) { |
| 225 // If the previous press was discarded, we need to also handle its | 225 // If the previous press was discarded, we need to also handle its |
| 226 // release. | 226 // release. |
| 227 if (current_touch_ids_.size() == 0) { | 227 if (current_touch_ids_.size() == 0) { |
| 228 state_ = NO_FINGERS_DOWN; | 228 state_ = NO_FINGERS_DOWN; |
| 229 } | 229 } |
| 230 return ui::EVENT_REWRITE_DISCARD; | 230 return ui::EVENT_REWRITE_DISCARD; |
| 231 } else if (type == ui::ET_TOUCH_MOVED){ |
| 232 LOG(WARNING) << "TOUCH_MOVED in InSingleTapOrTouchExploreReleased" |
| 233 << " though there should not be any fingers down."; |
| 234 return ui::EVENT_REWRITE_DISCARD; |
| 231 } | 235 } |
| 232 NOTREACHED() << "Unexpected event type received.";; | 236 NOTREACHED() << "Unexpected event type received: " << event.name(); |
| 233 return ui::EVENT_REWRITE_CONTINUE; | 237 return ui::EVENT_REWRITE_CONTINUE; |
| 234 } | 238 } |
| 235 | 239 |
| 236 ui::EventRewriteStatus TouchExplorationController::InDoubleTapPressed( | 240 ui::EventRewriteStatus TouchExplorationController::InDoubleTapPressed( |
| 237 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event) { | 241 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event) { |
| 238 const ui::EventType type = event.type(); | 242 const ui::EventType type = event.type(); |
| 239 if (type == ui::ET_TOUCH_PRESSED) { | 243 if (type == ui::ET_TOUCH_PRESSED) { |
| 240 return ui::EVENT_REWRITE_DISCARD; | 244 return ui::EVENT_REWRITE_DISCARD; |
| 241 } else if (type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED) { | 245 } else if (type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED) { |
| 242 if (current_touch_ids_.size() != 0) | 246 if (current_touch_ids_.size() != 0) |
| 243 return EVENT_REWRITE_DISCARD; | 247 return EVENT_REWRITE_DISCARD; |
| 244 | 248 |
| 245 // Rewrite release at location of last touch exploration with the same | 249 // Rewrite release at location of last touch exploration with the same |
| 246 // id as the prevoius press. | 250 // id as the prevoius press. |
| 247 rewritten_event->reset( | 251 rewritten_event->reset( |
| 248 new ui::TouchEvent(ui::ET_TOUCH_RELEASED, | 252 new ui::TouchEvent(ui::ET_TOUCH_RELEASED, |
| 249 last_touch_exploration_->location(), | 253 last_touch_exploration_->location(), |
| 250 initial_press_->touch_id(), | 254 initial_press_->touch_id(), |
| 251 event.time_stamp())); | 255 event.time_stamp())); |
| 252 (*rewritten_event)->set_flags(event.flags()); | 256 (*rewritten_event)->set_flags(event.flags()); |
| 253 ResetToNoFingersDown(); | 257 ResetToNoFingersDown(); |
| 254 return ui::EVENT_REWRITE_REWRITTEN; | 258 return ui::EVENT_REWRITE_REWRITTEN; |
| 255 } else if (type == ui::ET_TOUCH_MOVED) { | 259 } else if (type == ui::ET_TOUCH_MOVED) { |
| 256 return ui::EVENT_REWRITE_DISCARD; | 260 return ui::EVENT_REWRITE_DISCARD; |
| 257 } | 261 } |
| 258 NOTREACHED() << "Unexpected event type received."; | 262 NOTREACHED() << "Unexpected event type received: " << event.name(); |
| 259 return ui::EVENT_REWRITE_CONTINUE; | 263 return ui::EVENT_REWRITE_CONTINUE; |
| 260 } | 264 } |
| 261 | 265 |
| 262 ui::EventRewriteStatus TouchExplorationController::InTouchExploration( | 266 ui::EventRewriteStatus TouchExplorationController::InTouchExploration( |
| 263 const ui::TouchEvent& event, | 267 const ui::TouchEvent& event, |
| 264 scoped_ptr<ui::Event>* rewritten_event) { | 268 scoped_ptr<ui::Event>* rewritten_event) { |
| 265 const ui::EventType type = event.type(); | 269 const ui::EventType type = event.type(); |
| 266 if (type == ui::ET_TOUCH_PRESSED) { | 270 if (type == ui::ET_TOUCH_PRESSED) { |
| 267 // Handle split-tap. | 271 // Handle split-tap. |
| 268 initial_press_.reset(new TouchEvent(event)); | 272 initial_press_.reset(new TouchEvent(event)); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 279 return ui::EVENT_REWRITE_REWRITTEN; | 283 return ui::EVENT_REWRITE_REWRITTEN; |
| 280 } else if (type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED) { | 284 } else if (type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED) { |
| 281 initial_press_.reset(new TouchEvent(event)); | 285 initial_press_.reset(new TouchEvent(event)); |
| 282 tap_timer_.Start(FROM_HERE, | 286 tap_timer_.Start(FROM_HERE, |
| 283 gesture_detector_config_.double_tap_timeout, | 287 gesture_detector_config_.double_tap_timeout, |
| 284 this, | 288 this, |
| 285 &TouchExplorationController::OnTapTimerFired); | 289 &TouchExplorationController::OnTapTimerFired); |
| 286 state_ = TOUCH_EXPLORE_RELEASED; | 290 state_ = TOUCH_EXPLORE_RELEASED; |
| 287 VLOG_STATE(); | 291 VLOG_STATE(); |
| 288 } else if (type != ui::ET_TOUCH_MOVED) { | 292 } else if (type != ui::ET_TOUCH_MOVED) { |
| 289 NOTREACHED() << "Unexpected event type received."; | 293 NOTREACHED() << "Unexpected event type received: " << event.name(); |
| 290 return ui::EVENT_REWRITE_CONTINUE; | 294 return ui::EVENT_REWRITE_CONTINUE; |
| 291 } | 295 } |
| 292 | 296 |
| 293 // Rewrite as a mouse-move event. | 297 // Rewrite as a mouse-move event. |
| 294 *rewritten_event = CreateMouseMoveEvent(event.location(), event.flags()); | 298 *rewritten_event = CreateMouseMoveEvent(event.location(), event.flags()); |
| 295 last_touch_exploration_.reset(new TouchEvent(event)); | 299 last_touch_exploration_.reset(new TouchEvent(event)); |
| 296 return ui::EVENT_REWRITE_REWRITTEN; | 300 return ui::EVENT_REWRITE_REWRITTEN; |
| 297 } | 301 } |
| 298 | 302 |
| 299 | 303 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 345 if (event.touch_id() == last_two_to_one_->touch_id()) { | 349 if (event.touch_id() == last_two_to_one_->touch_id()) { |
| 346 last_two_to_one_.reset(new TouchEvent(event)); | 350 last_two_to_one_.reset(new TouchEvent(event)); |
| 347 rewritten_event->reset(new ui::TouchEvent(ui::ET_TOUCH_MOVED, | 351 rewritten_event->reset(new ui::TouchEvent(ui::ET_TOUCH_MOVED, |
| 348 event.location(), | 352 event.location(), |
| 349 event.touch_id(), | 353 event.touch_id(), |
| 350 event.time_stamp())); | 354 event.time_stamp())); |
| 351 (*rewritten_event)->set_flags(event.flags()); | 355 (*rewritten_event)->set_flags(event.flags()); |
| 352 return ui::EVENT_REWRITE_REWRITTEN; | 356 return ui::EVENT_REWRITE_REWRITTEN; |
| 353 } | 357 } |
| 354 } | 358 } |
| 355 NOTREACHED() << "Unexpected event type received"; | 359 NOTREACHED() << "Unexpected event type received: " << event.name(); |
| 356 return ui::EVENT_REWRITE_CONTINUE; | 360 return ui::EVENT_REWRITE_CONTINUE; |
| 357 } | 361 } |
| 358 | 362 |
| 359 ui::EventRewriteStatus TouchExplorationController::InPassthrough( | 363 ui::EventRewriteStatus TouchExplorationController::InPassthrough( |
| 360 const ui::TouchEvent& event, | 364 const ui::TouchEvent& event, |
| 361 scoped_ptr<ui::Event>* rewritten_event) { | 365 scoped_ptr<ui::Event>* rewritten_event) { |
| 362 ui::EventType type = event.type(); | 366 ui::EventType type = event.type(); |
| 363 | 367 |
| 364 if (!(type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED || | 368 if (!(type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED || |
| 365 type == ui::ET_TOUCH_MOVED || type == ui::ET_TOUCH_PRESSED)) { | 369 type == ui::ET_TOUCH_MOVED || type == ui::ET_TOUCH_PRESSED)) { |
| 366 NOTREACHED() << "Unexpected event type received."; | 370 NOTREACHED() << "Unexpected event type received: " << event.name(); |
| 367 return ui::EVENT_REWRITE_CONTINUE; | 371 return ui::EVENT_REWRITE_CONTINUE; |
| 368 } | 372 } |
| 369 | 373 |
| 370 rewritten_event->reset(new ui::TouchEvent( | 374 rewritten_event->reset(new ui::TouchEvent( |
| 371 type, event.location(), event.touch_id(), event.time_stamp())); | 375 type, event.location(), event.touch_id(), event.time_stamp())); |
| 372 (*rewritten_event)->set_flags(event.flags()); | 376 (*rewritten_event)->set_flags(event.flags()); |
| 373 | 377 |
| 374 if (current_touch_ids_.size() == 0) { | 378 if (current_touch_ids_.size() == 0) { |
| 375 ResetToNoFingersDown(); | 379 ResetToNoFingersDown(); |
| 376 } | 380 } |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 408 rewritten_event->reset( | 412 rewritten_event->reset( |
| 409 new ui::TouchEvent(ui::ET_TOUCH_RELEASED, | 413 new ui::TouchEvent(ui::ET_TOUCH_RELEASED, |
| 410 last_touch_exploration_->location(), | 414 last_touch_exploration_->location(), |
| 411 initial_press_->touch_id(), | 415 initial_press_->touch_id(), |
| 412 event.time_stamp())); | 416 event.time_stamp())); |
| 413 (*rewritten_event)->set_flags(event.flags()); | 417 (*rewritten_event)->set_flags(event.flags()); |
| 414 state_ = TOUCH_EXPLORATION; | 418 state_ = TOUCH_EXPLORATION; |
| 415 VLOG_STATE(); | 419 VLOG_STATE(); |
| 416 return ui::EVENT_REWRITE_REWRITTEN; | 420 return ui::EVENT_REWRITE_REWRITTEN; |
| 417 } | 421 } |
| 418 NOTREACHED() << "Unexpected event type received."; | 422 NOTREACHED() << "Unexpected event type received: " << event.name(); |
| 419 return ui::EVENT_REWRITE_CONTINUE; | 423 return ui::EVENT_REWRITE_CONTINUE; |
| 420 } | 424 } |
| 421 | 425 |
| 422 ui::EventRewriteStatus TouchExplorationController::InWaitForRelease( | 426 ui::EventRewriteStatus TouchExplorationController::InWaitForRelease( |
| 423 const ui::TouchEvent& event, | 427 const ui::TouchEvent& event, |
| 424 scoped_ptr<ui::Event>* rewritten_event) { | 428 scoped_ptr<ui::Event>* rewritten_event) { |
| 425 ui::EventType type = event.type(); | 429 ui::EventType type = event.type(); |
| 426 if (!(type == ui::ET_TOUCH_PRESSED || type == ui::ET_TOUCH_MOVED || | 430 if (!(type == ui::ET_TOUCH_PRESSED || type == ui::ET_TOUCH_MOVED || |
| 427 type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED)) { | 431 type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED)) { |
| 428 NOTREACHED() << "Unexpected event type received."; | 432 NOTREACHED() << "Unexpected event type received: " << event.name(); |
| 429 return ui::EVENT_REWRITE_CONTINUE; | 433 return ui::EVENT_REWRITE_CONTINUE; |
| 430 } | 434 } |
| 431 if (current_touch_ids_.size() == 0) { | 435 if (current_touch_ids_.size() == 0) { |
| 432 state_ = NO_FINGERS_DOWN; | 436 state_ = NO_FINGERS_DOWN; |
| 433 ResetToNoFingersDown(); | 437 ResetToNoFingersDown(); |
| 434 } | 438 } |
| 435 return EVENT_REWRITE_DISCARD; | 439 return EVENT_REWRITE_DISCARD; |
| 436 } | 440 } |
| 437 | 441 |
| 438 void TouchExplorationController::OnTapTimerFired() { | 442 void TouchExplorationController::OnTapTimerFired() { |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 552 return "TWO_TO_ONE_FINGER"; | 556 return "TWO_TO_ONE_FINGER"; |
| 553 case PASSTHROUGH: | 557 case PASSTHROUGH: |
| 554 return "PASSTHROUGH"; | 558 return "PASSTHROUGH"; |
| 555 case WAIT_FOR_RELEASE: | 559 case WAIT_FOR_RELEASE: |
| 556 return "WAIT_FOR_RELEASE"; | 560 return "WAIT_FOR_RELEASE"; |
| 557 } | 561 } |
| 558 return "Not a state"; | 562 return "Not a state"; |
| 559 } | 563 } |
| 560 | 564 |
| 561 } // namespace ui | 565 } // namespace ui |
| OLD | NEW |