nsEventStatus GestureEventListener::HandleDoubleTap(const MultiTouchInput& aEvent) { TapGestureInput tapEvent(TapGestureInput::TAPGESTURE_DOUBLE, aEvent.mTime, aEvent.mTouches[0].mScreenPoint); return mAsyncPanZoomController->ReceiveInputEvent(tapEvent); }
nsEventStatus GestureEventListener::HandleSingleTapConfirmedEvent(const MultiTouchInput& aEvent) { TapGestureInput tapEvent(TapGestureInput::TAPGESTURE_CONFIRMED, aEvent.mTime, aEvent.mTouches[0].mScreenPoint); return mAsyncPanZoomController->ReceiveInputEvent(tapEvent); }
bool IMEView::sceneEvent(QEvent* event) { switch (event->type()) { case QEvent::GestureOverride: { // consume all gestures if we are handling touches QGestureEvent* ge = static_cast<QGestureEvent*>(event); QGesture* g = 0; if ((g = ge->gesture(Qt::TapGesture))) { if (acceptPoint(mapFromScene(ge->mapToGraphicsScene(g->hotSpot())))) { event->accept(); return true; } } else if ((g = ge->gesture(Qt::TapAndHoldGesture))) { if (acceptPoint(mapFromScene(ge->mapToGraphicsScene(g->hotSpot())))) { event->accept(); return true; } } else if ((g = ge->gesture(Qt::PinchGesture))) { if (acceptPoint(mapFromScene(ge->mapToGraphicsScene(g->hotSpot())))) { event->accept(); return true; } } else if ((g = ge->gesture((Qt::GestureType) SysMgrGestureFlick))) { if (acceptPoint(mapFromScene(ge->mapToGraphicsScene(g->hotSpot())))) { event->accept(); return true; } } else if ((g = ge->gesture((Qt::GestureType) SysMgrGestureSingleClick))) { if (acceptPoint(mapFromScene(ge->mapToGraphicsScene(g->hotSpot())))) { event->accept(); return true; } } else if ((g = ge->gesture((Qt::GestureType) SysMgrGestureSingleClick))) { if (acceptPoint(mapFromScene(ge->mapToGraphicsScene(g->hotSpot())))) { event->accept(); return true; } } } break; case QEvent::Gesture: { QGestureEvent* ge = static_cast<QGestureEvent*>(event); QGesture* g = ge->gesture(Qt::TapGesture); if (g && g->state() == Qt::GestureFinished) { tapEvent(static_cast<QTapGesture*>(g)); return true; } if (!g) { QGesture* g = ge->gesture((Qt::GestureType) SysMgrGestureScreenEdgeFlick); if (g && g->state() == Qt::GestureFinished) { screenEdgeFlickEvent(static_cast<ScreenEdgeFlickGesture*>(g)); return true; } } } break; case QEvent::TouchBegin: touchBegin(static_cast<QTouchEvent*>(event)); return event->isAccepted(); case QEvent::TouchUpdate: touchUpdate(static_cast<QTouchEvent*>(event)); return event->isAccepted(); case QEvent::TouchEnd: touchEnd(static_cast<QTouchEvent*>(event)); return event->isAccepted(); default: break; } return QGraphicsObject::sceneEvent(event); }
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); rv = mAsyncPanZoomController->HandleGestureEvent(tapEvent); if (rv == 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); rv = 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); rv = 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); rv = mAsyncPanZoomController->HandleGestureEvent(pinchEvent); } break; default: NS_WARNING("Unhandled state upon touch end"); SetState(GESTURE_NONE); break; } return rv; }
nsEventStatus GestureEventListener::HandleLongTapEvent(const MultiTouchInput& aEvent) { TapGestureInput tapEvent(TapGestureInput::TAPGESTURE_LONG, aEvent.mTime, aEvent.mTouches[0].mScreenPoint); return mAsyncPanZoomController->HandleInputEvent(tapEvent); }
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(); TapGestureInput tapEvent(TapGestureInput::TAPGESTURE_UP, mLastTouchInput.mTime, mLastTouchInput.mTimeStamp, 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.mTimeStamp, 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.mTimeStamp, 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, 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; }