Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2d18ba25 authored by Prabir Pradhan's avatar Prabir Pradhan Committed by Android (Google) Code Review
Browse files

Merge changes from topic "drawing-tablet" into udc-dev

* changes:
  Fix display association for drawing tablets
  TouchInputMapper: Use a fixed scale factor for external drawing tablets
parents 1b612445 e71e5706
Loading
Loading
Loading
Loading
+29 −12
Original line number Diff line number Diff line
@@ -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;
    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();

+2 −1
Original line number Diff line number Diff line
@@ -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();