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

Commit be23210b authored by Linzhao Ye's avatar Linzhao Ye Committed by Gerrit Code Review
Browse files

Merge changes from topic "ToupadPointerCapture"

* changes:
  Revise RELATIVE_X and RELATIVE_Y motion ranges documentation.
  Populate RELATIVE_X and RELATIVE_Y motion range for touchpad pointer capture mode.
  Fix MultiTouchInputMapperTest#Process_TouchpadCapture test failure.
  Add relative field to captured cursor device
  Add relative coordinates for touchpad events.
  Support "pointer" capture for touchpads
  Allow touch if some pointers are MT_TOOL_PALM
  Convert TouchInputMapper enums to enum classes.
parents 354a51c8 4b2268c7
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -86,6 +86,13 @@ constexpr int32_t VERIFIED_KEY_EVENT_FLAGS = AKEY_EVENT_FLAG_CANCELED;
constexpr int32_t VERIFIED_MOTION_EVENT_FLAGS =
        AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED | AMOTION_EVENT_FLAG_WINDOW_IS_PARTIALLY_OBSCURED;

/**
 * This flag indicates that the point up event has been canceled.
 * Typically this is used for palm event when the user has accidental touches.
 * TODO: Adjust flag to public api
 */
constexpr int32_t AMOTION_EVENT_FLAG_CANCELED = 0x20;

enum {
    /* Used when a motion event is not associated with any display.
     * Typically used for non-pointer events. */
+9 −3
Original line number Diff line number Diff line
@@ -80,6 +80,10 @@ void CursorInputMapper::populateDeviceInfo(InputDeviceInfo* info) {
    } else {
        info->addMotionRange(AMOTION_EVENT_AXIS_X, mSource, -1.0f, 1.0f, 0.0f, mXScale, 0.0f);
        info->addMotionRange(AMOTION_EVENT_AXIS_Y, mSource, -1.0f, 1.0f, 0.0f, mYScale, 0.0f);
        info->addMotionRange(AMOTION_EVENT_AXIS_RELATIVE_X, mSource, -1.0f, 1.0f, 0.0f, mXScale,
                             0.0f);
        info->addMotionRange(AMOTION_EVENT_AXIS_RELATIVE_Y, mSource, -1.0f, 1.0f, 0.0f, mYScale,
                             0.0f);
    }
    info->addMotionRange(AMOTION_EVENT_AXIS_PRESSURE, mSource, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f);

@@ -312,7 +316,7 @@ void CursorInputMapper::sync(nsecs_t when) {

    mPointerVelocityControl.move(when, &deltaX, &deltaY);

    int32_t displayId;
    int32_t displayId = ADISPLAY_ID_NONE;
    float xCursorPosition = AMOTION_EVENT_INVALID_CURSOR_POSITION;
    float yCursorPosition = AMOTION_EVENT_INVALID_CURSOR_POSITION;
    if (mSource == AINPUT_SOURCE_MOUSE) {
@@ -336,10 +340,12 @@ void CursorInputMapper::sync(nsecs_t when) {
        pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X, deltaX);
        pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y, deltaY);
        displayId = mPointerController->getDisplayId();
    } else {
    } else if (mSource == AINPUT_SOURCE_MOUSE_RELATIVE) {
        // Pointer capture mode
        pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_X, deltaX);
        pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, deltaY);
        displayId = ADISPLAY_ID_NONE;
        pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X, deltaX);
        pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y, deltaY);
    }

    pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, down ? 1.0f : 0.0f);
+17 −4
Original line number Diff line number Diff line
@@ -236,6 +236,20 @@ void MultiTouchInputMapper::process(const RawEvent* rawEvent) {
    mMultiTouchMotionAccumulator.process(rawEvent);
}

std::optional<int32_t> MultiTouchInputMapper::getActiveBitId(
        const MultiTouchMotionAccumulator::Slot& inSlot) {
    if (mHavePointerIds) {
        int32_t trackingId = inSlot.getTrackingId();
        for (BitSet32 idBits(mPointerIdBits); !idBits.isEmpty();) {
            int32_t n = idBits.clearFirstMarkedBit();
            if (mPointerTrackingIdMap[n] == trackingId) {
                return std::make_optional(n);
            }
        }
    }
    return std::nullopt;
}

void MultiTouchInputMapper::syncTouch(nsecs_t when, RawState* outState) {
    size_t inCount = mMultiTouchMotionAccumulator.getSlotCount();
    size_t outCount = 0;
@@ -250,10 +264,9 @@ void MultiTouchInputMapper::syncTouch(nsecs_t when, RawState* outState) {
        }

        if (inSlot->getToolType() == AMOTION_EVENT_TOOL_TYPE_PALM) {
            if (!mCurrentMotionAborted) {
                ALOGI("Canceling touch gesture from device %s because the palm event was detected",
                      getDeviceName().c_str());
                cancelTouch(when);
            std::optional<int32_t> id = getActiveBitId(*inSlot);
            if (id) {
                outState->rawPointerData.canceledIdBits.markBit(id.value());
            }
            continue;
        }
+8 −6
Original line number Diff line number Diff line
@@ -92,17 +92,19 @@ private:
class MultiTouchInputMapper : public TouchInputMapper {
public:
    explicit MultiTouchInputMapper(InputDeviceContext& deviceContext);
    virtual ~MultiTouchInputMapper();
    ~MultiTouchInputMapper() override;

    virtual void reset(nsecs_t when) override;
    virtual void process(const RawEvent* rawEvent) override;
    void reset(nsecs_t when) override;
    void process(const RawEvent* rawEvent) override;

protected:
    virtual void syncTouch(nsecs_t when, RawState* outState);
    virtual void configureRawPointerAxes();
    virtual bool hasStylus() const;
    void syncTouch(nsecs_t when, RawState* outState) override;
    void configureRawPointerAxes() override;
    bool hasStylus() const override;

private:
    // If the slot is in use, return the bit id. Return std::nullopt otherwise.
    std::optional<int32_t> getActiveBitId(const MultiTouchMotionAccumulator::Slot& inSlot);
    MultiTouchMotionAccumulator mMultiTouchMotionAccumulator;

    // Specifies the pointer id bits that are in use, and their associated tracking id.
+6 −6
Original line number Diff line number Diff line
@@ -25,15 +25,15 @@ namespace android {
class SingleTouchInputMapper : public TouchInputMapper {
public:
    explicit SingleTouchInputMapper(InputDeviceContext& deviceContext);
    virtual ~SingleTouchInputMapper();
    ~SingleTouchInputMapper() override;

    virtual void reset(nsecs_t when) override;
    virtual void process(const RawEvent* rawEvent) override;
    void reset(nsecs_t when) override;
    void process(const RawEvent* rawEvent) override;

protected:
    virtual void syncTouch(nsecs_t when, RawState* outState);
    virtual void configureRawPointerAxes();
    virtual bool hasStylus() const;
    void syncTouch(nsecs_t when, RawState* outState) override;
    void configureRawPointerAxes() override;
    bool hasStylus() const override;

private:
    SingleTouchMotionAccumulator mSingleTouchMotionAccumulator;
Loading