nsEventStatus GestureEventListener::HandleInputTouchSingleStart() { switch (mState) { case GESTURE_NONE: SetState(GESTURE_FIRST_SINGLE_TOUCH_DOWN); mTouchStartPosition = mLastTouchInput.mTouches[0].mLocalScreenPoint; CreateLongTapTimeoutTask(); CreateMaxTapTimeoutTask(); break; case GESTURE_FIRST_SINGLE_TOUCH_UP: SetState(GESTURE_SECOND_SINGLE_TOUCH_DOWN); break; default: NS_WARNING("Unhandled state upon single touch start"); SetState(GESTURE_NONE); break; } return nsEventStatus_eIgnore; }
nsEventStatus GestureEventListener::HandleInputTouchEnd() { // We intentionally do not pass apzc return statuses up since // it may cause apzc stay in the touching state even after // gestures are completed (please see Bug 1013378 for reference). nsEventStatus rv = nsEventStatus_eIgnore; switch (mState) { case GESTURE_NONE: // GEL doesn't have a dedicated state for PANNING handled in APZC thus ignore. break; case GESTURE_FIRST_SINGLE_TOUCH_DOWN: { CancelLongTapTimeoutTask(); CancelMaxTapTimeoutTask(); nsEventStatus tapupStatus = mAsyncPanZoomController->HandleGestureEvent( CreateTapEvent(mLastTouchInput, TapGestureInput::TAPGESTURE_UP)); if (tapupStatus == nsEventStatus_eIgnore) { SetState(GESTURE_FIRST_SINGLE_TOUCH_UP); CreateMaxTapTimeoutTask(); } else { // We sent the tapup into content without waiting for a double tap SetState(GESTURE_NONE); } break; } case GESTURE_SECOND_SINGLE_TOUCH_DOWN: { CancelMaxTapTimeoutTask(); SetState(GESTURE_NONE); mAsyncPanZoomController->HandleGestureEvent( CreateTapEvent(mLastTouchInput, TapGestureInput::TAPGESTURE_DOUBLE)); break; } case GESTURE_FIRST_SINGLE_TOUCH_MAX_TAP_DOWN: CancelLongTapTimeoutTask(); SetState(GESTURE_NONE); TriggerSingleTapConfirmedEvent(); break; case GESTURE_LONG_TOUCH_DOWN: { SetState(GESTURE_NONE); mAsyncPanZoomController->HandleGestureEvent( CreateTapEvent(mLastTouchInput, TapGestureInput::TAPGESTURE_LONG_UP)); break; } case GESTURE_MULTI_TOUCH_DOWN: if (mTouches.Length() < 2) { SetState(GESTURE_NONE); } break; case GESTURE_PINCH: if (mTouches.Length() < 2) { SetState(GESTURE_NONE); PinchGestureInput pinchEvent(PinchGestureInput::PINCHGESTURE_END, mLastTouchInput.mTime, mLastTouchInput.mTimeStamp, ScreenPoint(), 1.0f, 1.0f, mLastTouchInput.modifiers); mAsyncPanZoomController->HandleGestureEvent(pinchEvent); } rv = nsEventStatus_eConsumeNoDefault; break; default: NS_WARNING("Unhandled state upon touch end"); SetState(GESTURE_NONE); break; } return rv; }
nsEventStatus GestureEventListener::HandleInputTouchEnd() { nsEventStatus rv = nsEventStatus_eIgnore; switch (mState) { case GESTURE_NONE: // GEL doesn't have a dedicated state for PANNING handled in APZC thus ignore. break; case GESTURE_FIRST_SINGLE_TOUCH_DOWN: { CancelLongTapTimeoutTask(); CancelMaxTapTimeoutTask(); TapGestureInput tapEvent(TapGestureInput::TAPGESTURE_UP, mLastTouchInput.mTime, mLastTouchInput.mTouches[0].mScreenPoint, mLastTouchInput.modifiers); nsEventStatus tapupStatus = mAsyncPanZoomController->HandleGestureEvent(tapEvent); if (tapupStatus == nsEventStatus_eIgnore) { SetState(GESTURE_FIRST_SINGLE_TOUCH_UP); CreateMaxTapTimeoutTask(); } else { // We sent the tapup into content without waiting for a double tap SetState(GESTURE_NONE); } break; } case GESTURE_SECOND_SINGLE_TOUCH_DOWN: { CancelMaxTapTimeoutTask(); SetState(GESTURE_NONE); TapGestureInput tapEvent(TapGestureInput::TAPGESTURE_DOUBLE, mLastTouchInput.mTime, mLastTouchInput.mTouches[0].mScreenPoint, mLastTouchInput.modifiers); mAsyncPanZoomController->HandleGestureEvent(tapEvent); break; } case GESTURE_FIRST_SINGLE_TOUCH_MAX_TAP_DOWN: CancelLongTapTimeoutTask(); SetState(GESTURE_NONE); TriggerSingleTapConfirmedEvent(); break; case GESTURE_LONG_TOUCH_DOWN: { SetState(GESTURE_NONE); TapGestureInput tapEvent(TapGestureInput::TAPGESTURE_LONG_UP, mLastTouchInput.mTime, mLastTouchInput.mTouches[0].mScreenPoint, mLastTouchInput.modifiers); mAsyncPanZoomController->HandleGestureEvent(tapEvent); break; } case GESTURE_MULTI_TOUCH_DOWN: if (mTouches.Length() < 2) { SetState(GESTURE_NONE); } break; case GESTURE_PINCH: if (mTouches.Length() < 2) { SetState(GESTURE_NONE); PinchGestureInput pinchEvent(PinchGestureInput::PINCHGESTURE_END, mLastTouchInput.mTime, ScreenPoint(), 1.0f, 1.0f, mLastTouchInput.modifiers); mAsyncPanZoomController->HandleGestureEvent(pinchEvent); } rv = nsEventStatus_eConsumeNoDefault; break; default: NS_WARNING("Unhandled state upon touch end"); SetState(GESTURE_NONE); break; } return rv; }