Add setCursorPosition.
When source is updated we need to update their values. Also renamed
mX/YCursorPosition to mRawX/YCursorPosition to indicate it stores raw
values (w/o applying offset).
Bug: 134788085
Test: atest libinput_tests
Change-Id: I1533d79a7542291974ff572d3aeaf9924e3f0751
diff --git a/include/input/Input.h b/include/input/Input.h
index ad8c233..cbd1a41 100644
--- a/include/input/Input.h
+++ b/include/input/Input.h
@@ -469,14 +469,16 @@
inline float getYPrecision() const { return mYPrecision; }
- inline float getRawXCursorPosition() const { return mXCursorPosition; }
+ inline float getRawXCursorPosition() const { return mRawXCursorPosition; }
float getXCursorPosition() const;
- inline float getRawYCursorPosition() const { return mYCursorPosition; }
+ inline float getRawYCursorPosition() const { return mRawYCursorPosition; }
float getYCursorPosition() const;
+ void setCursorPosition(float x, float y);
+
static inline bool isValidCursorPosition(float x, float y) { return !isnan(x) && !isnan(y); }
inline nsecs_t getDownTime() const { return mDownTime; }
@@ -623,8 +625,8 @@
void initialize(int32_t deviceId, int32_t source, int32_t displayId, int32_t action,
int32_t actionButton, int32_t flags, int32_t edgeFlags, int32_t metaState,
int32_t buttonState, MotionClassification classification, float xOffset,
- float yOffset, float xPrecision, float yPrecision, float mXCursorPosition,
- float mYCursorPosition, nsecs_t downTime, nsecs_t eventTime,
+ float yOffset, float xPrecision, float yPrecision, float rawXCursorPosition,
+ float rawYCursorPosition, nsecs_t downTime, nsecs_t eventTime,
size_t pointerCount, const PointerProperties* pointerProperties,
const PointerCoords* pointerCoords);
@@ -676,8 +678,8 @@
float mYOffset;
float mXPrecision;
float mYPrecision;
- float mXCursorPosition;
- float mYCursorPosition;
+ float mRawXCursorPosition;
+ float mRawYCursorPosition;
nsecs_t mDownTime;
Vector<PointerProperties> mPointerProperties;
Vector<nsecs_t> mSampleEventTimes;
diff --git a/libs/input/Input.cpp b/libs/input/Input.cpp
index dc4978b..34b305e 100644
--- a/libs/input/Input.cpp
+++ b/libs/input/Input.cpp
@@ -238,8 +238,8 @@
int32_t actionButton, int32_t flags, int32_t edgeFlags,
int32_t metaState, int32_t buttonState,
MotionClassification classification, float xOffset, float yOffset,
- float xPrecision, float yPrecision, float xCursorPosition,
- float yCursorPosition, nsecs_t downTime, nsecs_t eventTime,
+ float xPrecision, float yPrecision, float rawXCursorPosition,
+ float rawYCursorPosition, nsecs_t downTime, nsecs_t eventTime,
size_t pointerCount, const PointerProperties* pointerProperties,
const PointerCoords* pointerCoords) {
InputEvent::initialize(deviceId, source, displayId);
@@ -254,8 +254,8 @@
mYOffset = yOffset;
mXPrecision = xPrecision;
mYPrecision = yPrecision;
- mXCursorPosition = xCursorPosition;
- mYCursorPosition = yCursorPosition;
+ mRawXCursorPosition = rawXCursorPosition;
+ mRawYCursorPosition = rawYCursorPosition;
mDownTime = downTime;
mPointerProperties.clear();
mPointerProperties.appendArray(pointerProperties, pointerCount);
@@ -277,8 +277,8 @@
mYOffset = other->mYOffset;
mXPrecision = other->mXPrecision;
mYPrecision = other->mYPrecision;
- mXCursorPosition = other->mXCursorPosition;
- mYCursorPosition = other->mYCursorPosition;
+ mRawXCursorPosition = other->mRawXCursorPosition;
+ mRawYCursorPosition = other->mRawYCursorPosition;
mDownTime = other->mDownTime;
mPointerProperties = other->mPointerProperties;
@@ -313,6 +313,11 @@
return rawY + mYOffset;
}
+void MotionEvent::setCursorPosition(float x, float y) {
+ mRawXCursorPosition = x - mXOffset;
+ mRawYCursorPosition = y - mYOffset;
+}
+
const PointerCoords* MotionEvent::getRawPointerCoords(size_t pointerIndex) const {
return &mSamplePointerCoords[getHistorySize() * getPointerCount() + pointerIndex];
}
@@ -433,12 +438,12 @@
transformPoint(matrix, 0, 0, &originX, &originY);
// Apply the transformation to cursor position.
- if (isValidCursorPosition(mXCursorPosition, mYCursorPosition)) {
- float x = mXCursorPosition + oldXOffset;
- float y = mYCursorPosition + oldYOffset;
+ if (isValidCursorPosition(mRawXCursorPosition, mRawYCursorPosition)) {
+ float x = mRawXCursorPosition + oldXOffset;
+ float y = mRawYCursorPosition + oldYOffset;
transformPoint(matrix, x, y, &x, &y);
- mXCursorPosition = x - mXOffset;
- mYCursorPosition = y - mYOffset;
+ mRawXCursorPosition = x - mXOffset;
+ mRawYCursorPosition = y - mYOffset;
}
// Apply the transformation to all samples.
@@ -480,8 +485,8 @@
mYOffset = parcel->readFloat();
mXPrecision = parcel->readFloat();
mYPrecision = parcel->readFloat();
- mXCursorPosition = parcel->readFloat();
- mYCursorPosition = parcel->readFloat();
+ mRawXCursorPosition = parcel->readFloat();
+ mRawYCursorPosition = parcel->readFloat();
mDownTime = parcel->readInt64();
mPointerProperties.clear();
@@ -533,8 +538,8 @@
parcel->writeFloat(mYOffset);
parcel->writeFloat(mXPrecision);
parcel->writeFloat(mYPrecision);
- parcel->writeFloat(mXCursorPosition);
- parcel->writeFloat(mYCursorPosition);
+ parcel->writeFloat(mRawXCursorPosition);
+ parcel->writeFloat(mRawYCursorPosition);
parcel->writeInt64(mDownTime);
for (size_t i = 0; i < pointerCount; i++) {
diff --git a/libs/input/tests/InputEvent_test.cpp b/libs/input/tests/InputEvent_test.cpp
index b879de6..b90857c 100644
--- a/libs/input/tests/InputEvent_test.cpp
+++ b/libs/input/tests/InputEvent_test.cpp
@@ -665,4 +665,14 @@
ASSERT_EQ(600, event.getYCursorPosition());
}
+TEST_F(MotionEventTest, SetCursorPosition) {
+ MotionEvent event;
+ initializeEventWithHistory(&event);
+ event.setSource(AINPUT_SOURCE_MOUSE);
+
+ event.setCursorPosition(3, 4);
+ ASSERT_EQ(3, event.getXCursorPosition());
+ ASSERT_EQ(4, event.getYCursorPosition());
+}
+
} // namespace android