diff options
Diffstat (limited to 'services/inputflinger/reader/mapper/MultiTouchInputMapper.cpp')
-rw-r--r-- | services/inputflinger/reader/mapper/MultiTouchInputMapper.cpp | 50 |
1 files changed, 36 insertions, 14 deletions
diff --git a/services/inputflinger/reader/mapper/MultiTouchInputMapper.cpp b/services/inputflinger/reader/mapper/MultiTouchInputMapper.cpp index 43bd9f1f99..fab7f4ca14 100644 --- a/services/inputflinger/reader/mapper/MultiTouchInputMapper.cpp +++ b/services/inputflinger/reader/mapper/MultiTouchInputMapper.cpp @@ -104,36 +104,37 @@ void MultiTouchMotionAccumulator::process(const RawEvent* rawEvent) { #endif } else { Slot* slot = &mSlots[mCurrentSlot]; + // If mUsingSlotsProtocol is true, it means the raw pointer has axis info of + // ABS_MT_TRACKING_ID and ABS_MT_SLOT, so driver should send a valid trackingId while + // updating the slot. + if (!mUsingSlotsProtocol) { + slot->mInUse = true; + } switch (rawEvent->code) { case ABS_MT_POSITION_X: - slot->mInUse = true; slot->mAbsMTPositionX = rawEvent->value; + warnIfNotInUse(*rawEvent, *slot); break; case ABS_MT_POSITION_Y: - slot->mInUse = true; slot->mAbsMTPositionY = rawEvent->value; + warnIfNotInUse(*rawEvent, *slot); break; case ABS_MT_TOUCH_MAJOR: - slot->mInUse = true; slot->mAbsMTTouchMajor = rawEvent->value; break; case ABS_MT_TOUCH_MINOR: - slot->mInUse = true; slot->mAbsMTTouchMinor = rawEvent->value; slot->mHaveAbsMTTouchMinor = true; break; case ABS_MT_WIDTH_MAJOR: - slot->mInUse = true; slot->mAbsMTWidthMajor = rawEvent->value; break; case ABS_MT_WIDTH_MINOR: - slot->mInUse = true; slot->mAbsMTWidthMinor = rawEvent->value; slot->mHaveAbsMTWidthMinor = true; break; case ABS_MT_ORIENTATION: - slot->mInUse = true; slot->mAbsMTOrientation = rawEvent->value; break; case ABS_MT_TRACKING_ID: @@ -147,15 +148,12 @@ void MultiTouchMotionAccumulator::process(const RawEvent* rawEvent) { } break; case ABS_MT_PRESSURE: - slot->mInUse = true; slot->mAbsMTPressure = rawEvent->value; break; case ABS_MT_DISTANCE: - slot->mInUse = true; slot->mAbsMTDistance = rawEvent->value; break; case ABS_MT_TOOL_TYPE: - slot->mInUse = true; slot->mAbsMTToolType = rawEvent->value; slot->mHaveAbsMTToolType = true; break; @@ -177,6 +175,13 @@ bool MultiTouchMotionAccumulator::hasStylus() const { return mHaveStylus; } +void MultiTouchMotionAccumulator::warnIfNotInUse(const RawEvent& event, const Slot& slot) { + if (!slot.mInUse) { + ALOGW("Received unexpected event (0x%0x, 0x%0x) for slot %i with tracking id %i", + event.code, event.value, mCurrentSlot, slot.mAbsMTTrackingId); + } +} + // --- MultiTouchMotionAccumulator::Slot --- MultiTouchMotionAccumulator::Slot::Slot() { @@ -236,6 +241,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,11 +269,14 @@ 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()); } +#if DEBUG_POINTERS + ALOGI("Stop processing slot %zu for it received a palm event from device %s", inIndex, + getDeviceName().c_str()); +#endif continue; } |