| 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 ResetToNoFingersDown(); | 228 ResetToNoFingersDown(); |
| 229 } | 229 } |
| 230 return ui::EVENT_REWRITE_DISCARD; | 230 return ui::EVENT_REWRITE_DISCARD; |
| 231 } else if (type == ui::ET_TOUCH_MOVED){ |
| 232 return ui::EVENT_REWRITE_DISCARD; |
| 231 } | 233 } |
| 232 NOTREACHED() << "Unexpected event type received."; | 234 NOTREACHED() << "Unexpected event type received: " << event.name(); |
| 233 return ui::EVENT_REWRITE_CONTINUE; | 235 return ui::EVENT_REWRITE_CONTINUE; |
| 234 } | 236 } |
| 235 | 237 |
| 236 ui::EventRewriteStatus TouchExplorationController::InDoubleTapPressed( | 238 ui::EventRewriteStatus TouchExplorationController::InDoubleTapPressed( |
| 237 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event) { | 239 const ui::TouchEvent& event, scoped_ptr<ui::Event>* rewritten_event) { |
| 238 const ui::EventType type = event.type(); | 240 const ui::EventType type = event.type(); |
| 239 if (type == ui::ET_TOUCH_PRESSED) { | 241 if (type == ui::ET_TOUCH_PRESSED) { |
| 240 return ui::EVENT_REWRITE_DISCARD; | 242 return ui::EVENT_REWRITE_DISCARD; |
| 241 } else if (type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED) { | 243 } else if (type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED) { |
| 242 if (current_touch_ids_.size() != 0) | 244 if (current_touch_ids_.size() != 0) |
| 243 return EVENT_REWRITE_DISCARD; | 245 return EVENT_REWRITE_DISCARD; |
| 244 | 246 |
| 245 // Rewrite release at location of last touch exploration with the same | 247 // Rewrite release at location of last touch exploration with the same |
| 246 // id as the prevoius press. | 248 // id as the prevoius press. |
| 247 rewritten_event->reset( | 249 rewritten_event->reset( |
| 248 new ui::TouchEvent(ui::ET_TOUCH_RELEASED, | 250 new ui::TouchEvent(ui::ET_TOUCH_RELEASED, |
| 249 last_touch_exploration_->location(), | 251 last_touch_exploration_->location(), |
| 250 initial_press_->touch_id(), | 252 initial_press_->touch_id(), |
| 251 event.time_stamp())); | 253 event.time_stamp())); |
| 252 (*rewritten_event)->set_flags(event.flags()); | 254 (*rewritten_event)->set_flags(event.flags()); |
| 253 ResetToNoFingersDown(); | 255 ResetToNoFingersDown(); |
| 254 return ui::EVENT_REWRITE_REWRITTEN; | 256 return ui::EVENT_REWRITE_REWRITTEN; |
| 255 } else if (type == ui::ET_TOUCH_MOVED) { | 257 } else if (type == ui::ET_TOUCH_MOVED) { |
| 256 return ui::EVENT_REWRITE_DISCARD; | 258 return ui::EVENT_REWRITE_DISCARD; |
| 257 } | 259 } |
| 258 NOTREACHED() << "Unexpected event type received."; | 260 NOTREACHED() << "Unexpected event type received: " << event.name(); |
| 259 return ui::EVENT_REWRITE_CONTINUE; | 261 return ui::EVENT_REWRITE_CONTINUE; |
| 260 } | 262 } |
| 261 | 263 |
| 262 ui::EventRewriteStatus TouchExplorationController::InTouchExploration( | 264 ui::EventRewriteStatus TouchExplorationController::InTouchExploration( |
| 263 const ui::TouchEvent& event, | 265 const ui::TouchEvent& event, |
| 264 scoped_ptr<ui::Event>* rewritten_event) { | 266 scoped_ptr<ui::Event>* rewritten_event) { |
| 265 const ui::EventType type = event.type(); | 267 const ui::EventType type = event.type(); |
| 266 if (type == ui::ET_TOUCH_PRESSED) { | 268 if (type == ui::ET_TOUCH_PRESSED) { |
| 267 // Handle split-tap. | 269 // Handle split-tap. |
| 268 initial_press_.reset(new TouchEvent(event)); | 270 initial_press_.reset(new TouchEvent(event)); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 279 return ui::EVENT_REWRITE_REWRITTEN; | 281 return ui::EVENT_REWRITE_REWRITTEN; |
| 280 } else if (type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED) { | 282 } else if (type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED) { |
| 281 initial_press_.reset(new TouchEvent(event)); | 283 initial_press_.reset(new TouchEvent(event)); |
| 282 tap_timer_.Start(FROM_HERE, | 284 tap_timer_.Start(FROM_HERE, |
| 283 gesture_detector_config_.double_tap_timeout, | 285 gesture_detector_config_.double_tap_timeout, |
| 284 this, | 286 this, |
| 285 &TouchExplorationController::OnTapTimerFired); | 287 &TouchExplorationController::OnTapTimerFired); |
| 286 state_ = TOUCH_EXPLORE_RELEASED; | 288 state_ = TOUCH_EXPLORE_RELEASED; |
| 287 VLOG_STATE(); | 289 VLOG_STATE(); |
| 288 } else if (type != ui::ET_TOUCH_MOVED) { | 290 } else if (type != ui::ET_TOUCH_MOVED) { |
| 289 NOTREACHED() << "Unexpected event type received."; | 291 NOTREACHED() << "Unexpected event type received: " << event.name(); |
| 290 return ui::EVENT_REWRITE_CONTINUE; | 292 return ui::EVENT_REWRITE_CONTINUE; |
| 291 } | 293 } |
| 292 | 294 |
| 293 // Rewrite as a mouse-move event. | 295 // Rewrite as a mouse-move event. |
| 294 *rewritten_event = CreateMouseMoveEvent(event.location(), event.flags()); | 296 *rewritten_event = CreateMouseMoveEvent(event.location(), event.flags()); |
| 295 last_touch_exploration_.reset(new TouchEvent(event)); | 297 last_touch_exploration_.reset(new TouchEvent(event)); |
| 296 return ui::EVENT_REWRITE_REWRITTEN; | 298 return ui::EVENT_REWRITE_REWRITTEN; |
| 297 } | 299 } |
| 298 | 300 |
| 299 | 301 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 345 if (event.touch_id() == last_two_to_one_->touch_id()) { | 347 if (event.touch_id() == last_two_to_one_->touch_id()) { |
| 346 last_two_to_one_.reset(new TouchEvent(event)); | 348 last_two_to_one_.reset(new TouchEvent(event)); |
| 347 rewritten_event->reset(new ui::TouchEvent(ui::ET_TOUCH_MOVED, | 349 rewritten_event->reset(new ui::TouchEvent(ui::ET_TOUCH_MOVED, |
| 348 event.location(), | 350 event.location(), |
| 349 event.touch_id(), | 351 event.touch_id(), |
| 350 event.time_stamp())); | 352 event.time_stamp())); |
| 351 (*rewritten_event)->set_flags(event.flags()); | 353 (*rewritten_event)->set_flags(event.flags()); |
| 352 return ui::EVENT_REWRITE_REWRITTEN; | 354 return ui::EVENT_REWRITE_REWRITTEN; |
| 353 } | 355 } |
| 354 } | 356 } |
| 355 NOTREACHED() << "Unexpected event type received"; | 357 NOTREACHED() << "Unexpected event type received: " << event.name(); |
| 356 return ui::EVENT_REWRITE_CONTINUE; | 358 return ui::EVENT_REWRITE_CONTINUE; |
| 357 } | 359 } |
| 358 | 360 |
| 359 ui::EventRewriteStatus TouchExplorationController::InPassthrough( | 361 ui::EventRewriteStatus TouchExplorationController::InPassthrough( |
| 360 const ui::TouchEvent& event, | 362 const ui::TouchEvent& event, |
| 361 scoped_ptr<ui::Event>* rewritten_event) { | 363 scoped_ptr<ui::Event>* rewritten_event) { |
| 362 ui::EventType type = event.type(); | 364 ui::EventType type = event.type(); |
| 363 | 365 |
| 364 if (!(type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED || | 366 if (!(type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED || |
| 365 type == ui::ET_TOUCH_MOVED || type == ui::ET_TOUCH_PRESSED)) { | 367 type == ui::ET_TOUCH_MOVED || type == ui::ET_TOUCH_PRESSED)) { |
| 366 NOTREACHED() << "Unexpected event type received."; | 368 NOTREACHED() << "Unexpected event type received: " << event.name(); |
| 367 return ui::EVENT_REWRITE_CONTINUE; | 369 return ui::EVENT_REWRITE_CONTINUE; |
| 368 } | 370 } |
| 369 | 371 |
| 370 rewritten_event->reset(new ui::TouchEvent( | 372 rewritten_event->reset(new ui::TouchEvent( |
| 371 type, event.location(), event.touch_id(), event.time_stamp())); | 373 type, event.location(), event.touch_id(), event.time_stamp())); |
| 372 (*rewritten_event)->set_flags(event.flags()); | 374 (*rewritten_event)->set_flags(event.flags()); |
| 373 | 375 |
| 374 if (current_touch_ids_.size() == 0) { | 376 if (current_touch_ids_.size() == 0) { |
| 375 ResetToNoFingersDown(); | 377 ResetToNoFingersDown(); |
| 376 } | 378 } |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 408 rewritten_event->reset( | 410 rewritten_event->reset( |
| 409 new ui::TouchEvent(ui::ET_TOUCH_RELEASED, | 411 new ui::TouchEvent(ui::ET_TOUCH_RELEASED, |
| 410 last_touch_exploration_->location(), | 412 last_touch_exploration_->location(), |
| 411 initial_press_->touch_id(), | 413 initial_press_->touch_id(), |
| 412 event.time_stamp())); | 414 event.time_stamp())); |
| 413 (*rewritten_event)->set_flags(event.flags()); | 415 (*rewritten_event)->set_flags(event.flags()); |
| 414 state_ = TOUCH_EXPLORATION; | 416 state_ = TOUCH_EXPLORATION; |
| 415 VLOG_STATE(); | 417 VLOG_STATE(); |
| 416 return ui::EVENT_REWRITE_REWRITTEN; | 418 return ui::EVENT_REWRITE_REWRITTEN; |
| 417 } | 419 } |
| 418 NOTREACHED() << "Unexpected event type received."; | 420 NOTREACHED() << "Unexpected event type received: " << event.name(); |
| 419 return ui::EVENT_REWRITE_CONTINUE; | 421 return ui::EVENT_REWRITE_CONTINUE; |
| 420 } | 422 } |
| 421 | 423 |
| 422 ui::EventRewriteStatus TouchExplorationController::InWaitForRelease( | 424 ui::EventRewriteStatus TouchExplorationController::InWaitForRelease( |
| 423 const ui::TouchEvent& event, | 425 const ui::TouchEvent& event, |
| 424 scoped_ptr<ui::Event>* rewritten_event) { | 426 scoped_ptr<ui::Event>* rewritten_event) { |
| 425 ui::EventType type = event.type(); | 427 ui::EventType type = event.type(); |
| 426 if (!(type == ui::ET_TOUCH_PRESSED || type == ui::ET_TOUCH_MOVED || | 428 if (!(type == ui::ET_TOUCH_PRESSED || type == ui::ET_TOUCH_MOVED || |
| 427 type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED)) { | 429 type == ui::ET_TOUCH_RELEASED || type == ui::ET_TOUCH_CANCELLED)) { |
| 428 NOTREACHED() << "Unexpected event type received."; | 430 NOTREACHED() << "Unexpected event type received: " << event.name(); |
| 429 return ui::EVENT_REWRITE_CONTINUE; | 431 return ui::EVENT_REWRITE_CONTINUE; |
| 430 } | 432 } |
| 431 if (current_touch_ids_.size() == 0) { | 433 if (current_touch_ids_.size() == 0) { |
| 432 state_ = NO_FINGERS_DOWN; | 434 state_ = NO_FINGERS_DOWN; |
| 433 ResetToNoFingersDown(); | 435 ResetToNoFingersDown(); |
| 434 } | 436 } |
| 435 return EVENT_REWRITE_DISCARD; | 437 return EVENT_REWRITE_DISCARD; |
| 436 } | 438 } |
| 437 | 439 |
| 438 void TouchExplorationController::OnTapTimerFired() { | 440 void TouchExplorationController::OnTapTimerFired() { |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 552 return "TWO_TO_ONE_FINGER"; | 554 return "TWO_TO_ONE_FINGER"; |
| 553 case PASSTHROUGH: | 555 case PASSTHROUGH: |
| 554 return "PASSTHROUGH"; | 556 return "PASSTHROUGH"; |
| 555 case WAIT_FOR_RELEASE: | 557 case WAIT_FOR_RELEASE: |
| 556 return "WAIT_FOR_RELEASE"; | 558 return "WAIT_FOR_RELEASE"; |
| 557 } | 559 } |
| 558 return "Not a state"; | 560 return "Not a state"; |
| 559 } | 561 } |
| 560 | 562 |
| 561 } // namespace ui | 563 } // namespace ui |
| OLD | NEW |