diff options
| -rw-r--r-- | services/inputflinger/reader/mapper/TouchInputMapper.cpp | 41 | ||||
| -rw-r--r-- | services/inputflinger/reader/mapper/TouchInputMapper.h | 3 |
2 files changed, 31 insertions, 13 deletions
diff --git a/services/inputflinger/reader/mapper/TouchInputMapper.cpp b/services/inputflinger/reader/mapper/TouchInputMapper.cpp index 073c18babb..ecf50c3a3d 100644 --- a/services/inputflinger/reader/mapper/TouchInputMapper.cpp +++ b/services/inputflinger/reader/mapper/TouchInputMapper.cpp @@ -873,14 +873,26 @@ void TouchInputMapper::computeInputTransforms() { : ui::Transform(); // Step 4: Scale the raw coordinates to the display space. - // - Here, we assume that the raw surface of the touch device maps perfectly to the surface - // of the display panel. This is usually true for touchscreens. + // - In DIRECT mode, we assume that the raw surface of the touch device maps perfectly to + // the surface of the display panel. This is usually true for touchscreens. + // - In POINTER mode, we cannot assume that the display and the touch device have the same + // aspect ratio, since it is likely to be untrue for devices like external drawing tablets. + // In this case, we used a fixed scale so that 1) we use the same scale across both the x and + // y axes to ensure the mapping does not stretch gestures, and 2) the entire region of the + // display can be reached by the touch device. // - From this point onward, we are no longer in the discrete space of the raw coordinates but // are in the continuous space of the logical display. ui::Transform scaleRawToDisplay; const float xScale = static_cast<float>(mViewport.deviceWidth) / rotatedRawSize.width; const float yScale = static_cast<float>(mViewport.deviceHeight) / rotatedRawSize.height; - scaleRawToDisplay.set(xScale, 0, 0, yScale); + if (mDeviceMode == DeviceMode::DIRECT) { + scaleRawToDisplay.set(xScale, 0, 0, yScale); + } else if (mDeviceMode == DeviceMode::POINTER) { + const float fixedScale = std::max(xScale, yScale); + scaleRawToDisplay.set(fixedScale, 0, 0, fixedScale); + } else { + LOG_ALWAYS_FATAL("computeInputTransform can only be used for DIRECT and POINTER modes"); + } // Step 5: Undo the display rotation to bring us back to the un-rotated display coordinate space // that InputReader uses. @@ -3479,14 +3491,19 @@ std::list<NotifyArgs> TouchInputMapper::dispatchPointerStylus(nsecs_t when, nsec if (!mCurrentCookedState.stylusIdBits.isEmpty()) { uint32_t id = mCurrentCookedState.stylusIdBits.firstMarkedBit(); uint32_t index = mCurrentCookedState.cookedPointerData.idToIndex[id]; - mPointerController - ->setPosition(mCurrentCookedState.cookedPointerData.pointerCoords[index].getX(), - mCurrentCookedState.cookedPointerData.pointerCoords[index].getY()); - hovering = mCurrentCookedState.cookedPointerData.hoveringIdBits.hasBit(id); down = !hovering; - const auto [x, y] = mPointerController->getPosition(); + float x = mCurrentCookedState.cookedPointerData.pointerCoords[index].getX(); + float y = mCurrentCookedState.cookedPointerData.pointerCoords[index].getY(); + // Styluses are configured specifically for one display. We only update the + // PointerController for this stylus if the PointerController is configured for + // the same display as this stylus, + if (getAssociatedDisplayId() == mViewport.displayId) { + mPointerController->setPosition(x, y); + std::tie(x, y) = mPointerController->getPosition(); + } + mPointerSimple.currentCoords.copyFrom( mCurrentCookedState.cookedPointerData.pointerCoords[index]); mPointerSimple.currentCoords.setAxisValue(AMOTION_EVENT_AXIS_X, x); @@ -3499,7 +3516,7 @@ std::list<NotifyArgs> TouchInputMapper::dispatchPointerStylus(nsecs_t when, nsec hovering = false; } - return dispatchPointerSimple(when, readTime, policyFlags, down, hovering); + return dispatchPointerSimple(when, readTime, policyFlags, down, hovering, mViewport.displayId); } std::list<NotifyArgs> TouchInputMapper::abortPointerStylus(nsecs_t when, nsecs_t readTime, @@ -3542,7 +3559,8 @@ std::list<NotifyArgs> TouchInputMapper::dispatchPointerMouse(nsecs_t when, nsecs hovering = false; } - return dispatchPointerSimple(when, readTime, policyFlags, down, hovering); + const int32_t displayId = mPointerController->getDisplayId(); + return dispatchPointerSimple(when, readTime, policyFlags, down, hovering, displayId); } std::list<NotifyArgs> TouchInputMapper::abortPointerMouse(nsecs_t when, nsecs_t readTime, @@ -3556,7 +3574,7 @@ std::list<NotifyArgs> TouchInputMapper::abortPointerMouse(nsecs_t when, nsecs_t std::list<NotifyArgs> TouchInputMapper::dispatchPointerSimple(nsecs_t when, nsecs_t readTime, uint32_t policyFlags, bool down, - bool hovering) { + bool hovering, int32_t displayId) { LOG_ALWAYS_FATAL_IF(mDeviceMode != DeviceMode::POINTER, "%s cannot be used when the device is not in POINTER mode.", __func__); std::list<NotifyArgs> out; @@ -3569,7 +3587,6 @@ std::list<NotifyArgs> TouchInputMapper::dispatchPointerSimple(nsecs_t when, nsec } else if (!down && !hovering && (mPointerSimple.down || mPointerSimple.hovering)) { mPointerController->fade(PointerControllerInterface::Transition::GRADUAL); } - int32_t displayId = mPointerController->getDisplayId(); const auto [xCursorPosition, yCursorPosition] = mPointerController->getPosition(); diff --git a/services/inputflinger/reader/mapper/TouchInputMapper.h b/services/inputflinger/reader/mapper/TouchInputMapper.h index bc358b97e6..336d5243eb 100644 --- a/services/inputflinger/reader/mapper/TouchInputMapper.h +++ b/services/inputflinger/reader/mapper/TouchInputMapper.h @@ -789,7 +789,7 @@ private: [[nodiscard]] std::list<NotifyArgs> dispatchPointerSimple(nsecs_t when, nsecs_t readTime, uint32_t policyFlags, bool down, - bool hovering); + bool hovering, int32_t displayId); [[nodiscard]] std::list<NotifyArgs> abortPointerSimple(nsecs_t when, nsecs_t readTime, uint32_t policyFlags); @@ -821,6 +821,7 @@ private: static void assignPointerIds(const RawState& last, RawState& current); + // Compute input transforms for DIRECT and POINTER modes. void computeInputTransforms(); void configureDeviceType(); |