Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}