switch (rawEvent->code) {
case REL_X:
mRelX = rawEvent->value;
+ mMoved = true;
break;
case REL_Y:
mRelY = rawEvent->value;
+ mMoved = true;
+ break;
+ }
+ } else if (rawEvent->type == EV_ABS) {
+ switch (rawEvent->code) {
+ case ABS_X:
+ mAbsX = rawEvent->value;
+ mMoved = true;
+ break;
+ case ABS_Y:
+ mAbsY = rawEvent->value;
+ mMoved = true;
break;
}
}
}
void CursorMotionAccumulator::finishSync() {
+ mMoved = false;
clearRelativeAxes();
}
// fall through.
case Parameters::MODE_POINTER:
mSource = AINPUT_SOURCE_MOUSE;
+ if (mParameters.hasAbsAxis) {
+ getAbsoluteAxisInfo(ABS_X, &mRawAbsXInfo);
+ getAbsoluteAxisInfo(ABS_Y, &mRawAbsYInfo);
+ }
mXPrecision = 1.0f;
mYPrecision = 1.0f;
mXScale = 1.0f;
}
if (!changes || (changes & InputReaderConfiguration::CHANGE_DISPLAY_INFO)) {
- if (mParameters.orientationAware && mParameters.hasAssociatedDisplay) {
+ if (mParameters.hasAssociatedDisplay) {
DisplayViewport v;
if (config->getDisplayViewport(ViewportType::VIEWPORT_INTERNAL, NULL, &v)) {
- mOrientation = v.orientation;
+ if (mParameters.orientationAware) {
+ mOrientation = v.orientation;
+ }
+ if (mParameters.hasAbsAxis) {
+ mXScale = float(v.logicalRight - v.logicalLeft)/(mRawAbsXInfo.maxValue - mRawAbsXInfo.minValue + 1);
+ mYScale = float(v.logicalBottom - v.logicalTop)/(mRawAbsYInfo.maxValue - mRawAbsYInfo.minValue + 1);
+ mXPrecision = 1.0f / mXScale;
+ mYPrecision = 1.0f / mYScale;
+ }
} else {
mOrientation = DISPLAY_ORIENTATION_0;
}
if (mParameters.mode == Parameters::MODE_POINTER || mParameters.orientationAware) {
mParameters.hasAssociatedDisplay = true;
}
+
+ mParameters.hasAbsAxis = false;
+ if (mParameters.mode == Parameters::MODE_POINTER) {
+ mParameters.hasAbsAxis = getDevice()->hasAbsoluteAxis(ABS_X) && getDevice()->hasAbsoluteAxis(ABS_Y) ? true : false;
+ }
}
void CursorInputMapper::dumpParameters(String8& dump) {
dump.appendFormat(INDENT4 "OrientationAware: %s\n",
toString(mParameters.orientationAware));
+ dump.appendFormat(INDENT4 "Absolute Axis: %s\n",
+ toString(mParameters.hasAbsAxis));
}
void CursorInputMapper::reset(nsecs_t when) {
}
}
+void CursorInputMapper::rotateAbsolute(float* absX, float* absY) {
+ float temp;
+ switch (mOrientation) {
+ case DISPLAY_ORIENTATION_90:
+ temp = *absX;
+ *absX = *absY;
+ *absY = ((mRawAbsXInfo.maxValue - mRawAbsXInfo.minValue) + 1) - temp;
+ break;
+
+ case DISPLAY_ORIENTATION_180:
+ *absX = ((mRawAbsXInfo.maxValue - mRawAbsXInfo.minValue) + 1) - *absX;
+ *absY = ((mRawAbsYInfo.maxValue - mRawAbsYInfo.minValue) + 1) - *absY;
+ break;
+
+ case DISPLAY_ORIENTATION_270:
+ temp = *absX;
+ *absX = ((mRawAbsYInfo.maxValue - mRawAbsYInfo.minValue) + 1) - *absY;
+ *absY = temp;
+ break;
+ }
+}
+
void CursorInputMapper::sync(nsecs_t when) {
int32_t lastButtonState = mButtonState;
int32_t currentButtonState = mCursorButtonAccumulator.getButtonState();
int32_t buttonsPressed = currentButtonState & ~lastButtonState;
int32_t buttonsReleased = lastButtonState & ~currentButtonState;
- float deltaX = mCursorMotionAccumulator.getRelativeX() * mXScale;
- float deltaY = mCursorMotionAccumulator.getRelativeY() * mYScale;
- bool moved = deltaX != 0 || deltaY != 0;
-
- // Rotate delta according to orientation if needed.
- if (mParameters.orientationAware && mParameters.hasAssociatedDisplay
- && (deltaX != 0.0f || deltaY != 0.0f)) {
- rotateDelta(mOrientation, &deltaX, &deltaY);
- }
-
- // Move the pointer.
+ bool moved = false;
PointerProperties pointerProperties;
pointerProperties.clear();
pointerProperties.id = 0;
PointerCoords pointerCoords;
pointerCoords.clear();
+ if (!mParameters.hasAbsAxis) {
+ float deltaX = mCursorMotionAccumulator.getRelativeX() * mXScale;
+ float deltaY = mCursorMotionAccumulator.getRelativeY() * mYScale;
+ moved = deltaX != 0 || deltaY != 0;
+
+ // Rotate delta according to orientation if needed.
+ if (mParameters.orientationAware && mParameters.hasAssociatedDisplay
+ && (deltaX != 0.0f || deltaY != 0.0f)) {
+ rotateDelta(mOrientation, &deltaX, &deltaY);
+ }
+ mPointerVelocityControl.move(when, &deltaX, &deltaY);
+ if (mPointerController != NULL) {
+ if (moved) {
+ mPointerController->move(deltaX, deltaY);
+ }
+ float x, y;
+ mPointerController->getPosition(&x, &y);
+ pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_X, x);
+ pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, y);
+ pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X, deltaX);
+ pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y, deltaY);
+ } else {
+ pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_X, deltaX);
+ pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, deltaY);
+ }
+ } else {
+ float absX = mCursorMotionAccumulator.getAbsoluteX() - mRawAbsXInfo.minValue;
+ float absY = mCursorMotionAccumulator.getAbsoluteY() - mRawAbsYInfo.minValue;
+ if (mParameters.orientationAware) {
+ rotateAbsolute(&absX, &absY);
+ }
+ absX = absX * mXScale;
+ absY = absY * mYScale;
+ moved = mCursorMotionAccumulator.hasMoved();
+ if (moved) {
+ mPointerController->setPosition(absX, absY);
+ }
+ pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_X, absX);
+ pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, absY);
+ }
+
float vscroll = mCursorScrollAccumulator.getRelativeVWheel();
float hscroll = mCursorScrollAccumulator.getRelativeHWheel();
bool scrolled = vscroll != 0 || hscroll != 0;
mWheelYVelocityControl.move(when, NULL, &vscroll);
mWheelXVelocityControl.move(when, &hscroll, NULL);
- mPointerVelocityControl.move(when, &deltaX, &deltaY);
-
int32_t displayId;
if (mSource == AINPUT_SOURCE_MOUSE) {
if (moved || scrolled || buttonsChanged) {
mPointerController->setPresentation(
PointerControllerInterface::PRESENTATION_POINTER);
- if (moved) {
- mPointerController->move(deltaX, deltaY);
- }
-
if (buttonsChanged) {
mPointerController->setButtonState(currentButtonState);
}
mPointerController->unfade(PointerControllerInterface::TRANSITION_IMMEDIATE);
}
-
- float x, y;
- mPointerController->getPosition(&x, &y);
- pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_X, x);
- pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, y);
- pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X, deltaX);
- pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y, deltaY);
displayId = ADISPLAY_ID_DEFAULT;
} else {
- pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_X, deltaX);
- pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, deltaY);
displayId = ADISPLAY_ID_NONE;
}