Loading services/inputflinger/dispatcher/InputDispatcher.cpp +5 −1 Original line number Diff line number Diff line Loading @@ -3054,7 +3054,11 @@ void InputDispatcher::addPointerWindowTargetLocked( << ", windowInfo->globalScaleFactor=" << windowInfo->globalScaleFactor; } it->addPointers(pointerIds, windowInfo->transform); Result<void> result = it->addPointers(pointerIds, windowInfo->transform); if (!result.ok()) { logDispatchStateLocked(); LOG(FATAL) << result.error().message(); } } void InputDispatcher::addGlobalMonitoringTargetsLocked(std::vector<InputTarget>& inputTargets, Loading services/inputflinger/dispatcher/InputTarget.cpp +9 −6 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ #include <inttypes.h> #include <string> using android::base::Error; using android::base::Result; using android::base::StringPrintf; namespace android::inputdispatcher { Loading @@ -35,28 +37,29 @@ const static ui::Transform kIdentityTransform{}; InputTarget::InputTarget(const std::shared_ptr<Connection>& connection, ftl::Flags<Flags> flags) : connection(connection), flags(flags) {} void InputTarget::addPointers(std::bitset<MAX_POINTER_ID + 1> newPointerIds, Result<void> InputTarget::addPointers(std::bitset<MAX_POINTER_ID + 1> newPointerIds, const ui::Transform& transform) { // The pointerIds can be empty, but still a valid InputTarget. This can happen when there is no // valid pointer property from the input event. if (newPointerIds.none()) { setDefaultPointerTransform(transform); return; return {}; } // Ensure that the new set of pointers doesn't overlap with the current set of pointers. if ((getPointerIds() & newPointerIds).any()) { LOG(FATAL) << __func__ << " - overlap with incoming pointers " return Error() << __func__ << " - overlap with incoming pointers " << bitsetToString(newPointerIds) << " in " << *this; } for (auto& [existingTransform, existingPointers] : mPointerTransforms) { if (transform == existingTransform) { existingPointers |= newPointerIds; return; return {}; } } mPointerTransforms.emplace_back(transform, newPointerIds); return {}; } void InputTarget::setDefaultPointerTransform(const ui::Transform& transform) { Loading services/inputflinger/dispatcher/InputTarget.h +2 −1 Original line number Diff line number Diff line Loading @@ -92,7 +92,8 @@ public: InputTarget() = default; InputTarget(const std::shared_ptr<Connection>&, ftl::Flags<Flags> = {}); void addPointers(std::bitset<MAX_POINTER_ID + 1> pointerIds, const ui::Transform& transform); android::base::Result<void> addPointers(std::bitset<MAX_POINTER_ID + 1> pointerIds, const ui::Transform& transform); void setDefaultPointerTransform(const ui::Transform& transform); /** Loading Loading
services/inputflinger/dispatcher/InputDispatcher.cpp +5 −1 Original line number Diff line number Diff line Loading @@ -3054,7 +3054,11 @@ void InputDispatcher::addPointerWindowTargetLocked( << ", windowInfo->globalScaleFactor=" << windowInfo->globalScaleFactor; } it->addPointers(pointerIds, windowInfo->transform); Result<void> result = it->addPointers(pointerIds, windowInfo->transform); if (!result.ok()) { logDispatchStateLocked(); LOG(FATAL) << result.error().message(); } } void InputDispatcher::addGlobalMonitoringTargetsLocked(std::vector<InputTarget>& inputTargets, Loading
services/inputflinger/dispatcher/InputTarget.cpp +9 −6 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ #include <inttypes.h> #include <string> using android::base::Error; using android::base::Result; using android::base::StringPrintf; namespace android::inputdispatcher { Loading @@ -35,28 +37,29 @@ const static ui::Transform kIdentityTransform{}; InputTarget::InputTarget(const std::shared_ptr<Connection>& connection, ftl::Flags<Flags> flags) : connection(connection), flags(flags) {} void InputTarget::addPointers(std::bitset<MAX_POINTER_ID + 1> newPointerIds, Result<void> InputTarget::addPointers(std::bitset<MAX_POINTER_ID + 1> newPointerIds, const ui::Transform& transform) { // The pointerIds can be empty, but still a valid InputTarget. This can happen when there is no // valid pointer property from the input event. if (newPointerIds.none()) { setDefaultPointerTransform(transform); return; return {}; } // Ensure that the new set of pointers doesn't overlap with the current set of pointers. if ((getPointerIds() & newPointerIds).any()) { LOG(FATAL) << __func__ << " - overlap with incoming pointers " return Error() << __func__ << " - overlap with incoming pointers " << bitsetToString(newPointerIds) << " in " << *this; } for (auto& [existingTransform, existingPointers] : mPointerTransforms) { if (transform == existingTransform) { existingPointers |= newPointerIds; return; return {}; } } mPointerTransforms.emplace_back(transform, newPointerIds); return {}; } void InputTarget::setDefaultPointerTransform(const ui::Transform& transform) { Loading
services/inputflinger/dispatcher/InputTarget.h +2 −1 Original line number Diff line number Diff line Loading @@ -92,7 +92,8 @@ public: InputTarget() = default; InputTarget(const std::shared_ptr<Connection>&, ftl::Flags<Flags> = {}); void addPointers(std::bitset<MAX_POINTER_ID + 1> pointerIds, const ui::Transform& transform); android::base::Result<void> addPointers(std::bitset<MAX_POINTER_ID + 1> pointerIds, const ui::Transform& transform); void setDefaultPointerTransform(const ui::Transform& transform); /** Loading