From cb19cb39d6f7798d2217b374c12ecb14249b85ff Mon Sep 17 00:00:00 2001 From: chenqiang777 Date: Mon, 19 Aug 2024 20:24:47 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=89=8B=E5=86=99?= =?UTF-8?q?=E7=AC=94=E6=82=AC=E5=81=9C=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: chenqiang777 Change-Id: I5fae5a9789b5a917d177090d9eb3e9cde9ef7f0c --- adapter/ohos/entrance/ace_container.cpp | 2 + adapter/ohos/entrance/mmi_event_convertor.cpp | 2 + frameworks/core/common/event_manager.cpp | 87 +++++++++++++++++++ frameworks/core/common/event_manager.h | 6 ++ .../core/components_ng/base/frame_node.cpp | 22 +++-- .../core/components_ng/base/frame_node.h | 3 + .../core/components_ng/event/input_event.cpp | 33 +++++++ .../core/components_ng/event/input_event.h | 4 + .../components_ng/event/input_event_hub.cpp | 12 +++ .../components_ng/event/input_event_hub.h | 2 + .../pattern/model/model_touch_handler.cpp | 2 + frameworks/core/event/mouse_event.cpp | 17 ++++ frameworks/core/event/mouse_event.h | 13 +++ frameworks/core/event/touch_event.h | 8 ++ frameworks/core/pipeline/pipeline_base.h | 2 + .../core/pipeline_ng/pipeline_context.cpp | 29 +++++++ .../core/pipeline_ng/pipeline_context.h | 2 + .../core/pipeline/mock_pipeline_context.cpp | 2 + 18 files changed, 243 insertions(+), 5 deletions(-) diff --git a/adapter/ohos/entrance/ace_container.cpp b/adapter/ohos/entrance/ace_container.cpp index 4088b018fec..9484d48321c 100644 --- a/adapter/ohos/entrance/ace_container.cpp +++ b/adapter/ohos/entrance/ace_container.cpp @@ -819,6 +819,8 @@ void AceContainer::InitializeCallback() if (event.type == TouchType::HOVER_ENTER || event.type == TouchType::HOVER_MOVE || event.type == TouchType::HOVER_EXIT || event.type == TouchType::HOVER_CANCEL) { context->OnAccessibilityHoverEvent(event, node); + } else if (event.IsPenHoverEvent()) { + context->OnPenHoverEvent(event, node); } else { if (node) { context->OnTouchEvent(event, node); diff --git a/adapter/ohos/entrance/mmi_event_convertor.cpp b/adapter/ohos/entrance/mmi_event_convertor.cpp index 7df84c5f7f2..59d2b6d6a41 100644 --- a/adapter/ohos/entrance/mmi_event_convertor.cpp +++ b/adapter/ohos/entrance/mmi_event_convertor.cpp @@ -226,6 +226,8 @@ void SetTouchEventType(int32_t orgAction, TouchEvent& event) { OHOS::MMI::PointerEvent::POINTER_ACTION_HOVER_MOVE, TouchType::HOVER_MOVE }, { OHOS::MMI::PointerEvent::POINTER_ACTION_HOVER_EXIT, TouchType::HOVER_EXIT }, { OHOS::MMI::PointerEvent::POINTER_ACTION_HOVER_CANCEL, TouchType::HOVER_CANCEL }, + { OHOS::MMI::PointerEvent::POINTER_ACTION_PROXIMITY_IN, TouchType::PROXIMITY_IN }, + { OHOS::MMI::PointerEvent::POINTER_ACTION_PROXIMITY_OUT, TouchType::PROXIMITY_OUT }, }; auto typeIter = actionMap.find(orgAction); if (typeIter == actionMap.end()) { diff --git a/frameworks/core/common/event_manager.cpp b/frameworks/core/common/event_manager.cpp index 2ccbb7650f7..6e180bfbc19 100644 --- a/frameworks/core/common/event_manager.cpp +++ b/frameworks/core/common/event_manager.cpp @@ -1086,6 +1086,19 @@ void EventManager::AccessibilityHoverTest( UpdateAccessibilityHoverNode(event, testResult); } +void EventManager::PenHoverTest( + const TouchEvent& event, const RefPtr& frameNode, TouchRestrict& touchRestrict) +{ + CHECK_NULL_VOID(frameNode); + const NG::PointF point { event.x, event.y }; + TouchTestResult testResult; + ResponseLinkResult responseLinkResult; + frameNode->TouchTest( + point, point, point, touchRestrict, testResult, event.id, responseLinkResult); + SetResponseLinkRecognizers(testResult, responseLinkResult); + UpdateAccessibilityHoverNode(event, testResult); +} + void EventManager::MouseTest( const MouseEvent& event, const RefPtr& frameNode, TouchRestrict& touchRestrict) { @@ -1153,6 +1166,30 @@ void EventManager::UpdateAccessibilityHoverNode(const TouchEvent& event, const T } } +void EventManager::UpdatePenHoverNode(const TouchEvent& event, const TouchTestResult& testResult) +{ + HoverTestResult penHoverTestResult; + for (const auto& result : testResult) { + auto penHoverResult = AceType::DynamicCast(result); + if (penHoverResult && penHoverResult->IsPenHoverTarget()) { + penHoverTestResult.emplace_back(penHoverResult); + } + } + + if (event.type == TouchType::PROXIMITY_IN) { + TAG_LOGI(AceLogTag::ACE_INPUTTRACKING, "pen proximity in hover event."); + lastPenHoverResults_.clear(); + curPenHoverResults_ = std::move(penHoverTestResult); + } else if (event.type == TouchType::PROXIMITY_OUT) { + TAG_LOGI(AceLogTag::ACE_INPUTTRACKING, "pen proximity out hover event."); + lastPenHoverResults_ = std::move(curPenHoverResults_); + curPenHoverResults_.clear(); + } else { + lastPenHoverResults_ = std::move(curPenHoverResults_); + curPenHoverResults_ = std::move(penHoverTestResult); + } +} + void EventManager::UpdateHoverNode(const MouseEvent& event, const TouchTestResult& testResult) { currMouseTestResults_.clear(); @@ -1380,6 +1417,56 @@ void EventManager::DispatchAccessibilityHoverEventNG(const TouchEvent& event) } } +void EventManager::DispatchPenHoverEventNG(const TouchEvent& event) +{ + auto lastHoverEndNode = lastPenHoverResults_.begin(); + auto currHoverEndNode = curPenHoverResults_.begin(); + RefPtr lastHoverEndNodeTarget; + uint32_t iterCountLast = 0; + uint32_t iterCountCurr = 0; + for (const auto& hoverResult : lastPenHoverResults_) { + // get valid part of previous hover nodes while it's not in current hover nodes. Those nodes exit hover + // there may have some nodes in curPenHoverResults_ but intercepted + iterCountLast++; + if (lastHoverEndNode != curPenHoverResults_.end()) { + lastHoverEndNode++; + } + if (std::find(curPenHoverResults_.begin(), curPenHoverResults_.end(), hoverResult) == + curPenHoverResults_.end()) { + hoverResult->HandlePenHoverEvent(false, event); + } + if ((iterCountLast >= lastPenHoverDispatchLength_) && (lastPenHoverDispatchLength_ != 0)) { + lastHoverEndNodeTarget = hoverResult; + break; + } + } + lastPenHoverDispatchLength_ = 0; + for (const auto& hoverResult : curPenHoverResults_) { + // get valid part of current hover nodes while it's not in previous hover nodes. Those nodes are new hover + // the valid part stops at first interception + iterCountCurr++; + if (currHoverEndNode != curPenHoverResults_.end()) { + currHoverEndNode++; + } + if (std::find(lastPenHoverResults_.begin(), lastHoverEndNode, hoverResult) == lastHoverEndNode) { + if (!hoverResult->HandlePenHoverEvent(true, event)) { + lastPenHoverDispatchLength_ = iterCountCurr; + break; + } + } + if (hoverResult == lastHoverEndNodeTarget) { + lastPenHoverDispatchLength_ = iterCountCurr; + break; + } + } + for (auto hoverResultIt = lastPenHoverResults_.begin(); hoverResultIt != lastHoverEndNode; ++hoverResultIt) { + // there may have previous hover nodes in the invalid part of current hover nodes. Those nodes exit hover also + if (std::find(currHoverEndNode, curPenHoverResults_.end(), *hoverResultIt) != curPenHoverResults_.end()) { + (*hoverResultIt)->HandlePenHoverEvent(false, event); + } + } +} + void EventManager::AxisTest(const AxisEvent& event, const RefPtr& renderNode) { CHECK_NULL_VOID(renderNode); diff --git a/frameworks/core/common/event_manager.h b/frameworks/core/common/event_manager.h index 3af647bab4b..ca0a7d13040 100644 --- a/frameworks/core/common/event_manager.h +++ b/frameworks/core/common/event_manager.h @@ -126,12 +126,15 @@ public: void AccessibilityHoverTest( const TouchEvent& event, const RefPtr& frameNode, TouchRestrict& touchRestrict); void UpdateAccessibilityHoverNode(const TouchEvent& event, const TouchTestResult& testResult); + void PenHoverTest(const TouchEvent& event, const RefPtr& frameNode, TouchRestrict& touchRestrict); + void UpdatePenHoverNode(const TouchEvent& event, const TouchTestResult& testResult); void UpdateHoverNode(const MouseEvent& event, const TouchTestResult& testResult); bool DispatchMouseEventNG(const MouseEvent& event); void DispatchMouseHoverAnimationNG(const MouseEvent& event); bool DispatchMouseHoverEventNG(const MouseEvent& event); void DispatchHoverEffectEvent(const MouseEvent& event); void DispatchAccessibilityHoverEventNG(const TouchEvent& event); + void DispatchPenHoverEventNG(const TouchEvent& event); void AxisTest(const AxisEvent& event, const RefPtr& renderNode); bool DispatchAxisEvent(const AxisEvent& event); @@ -311,6 +314,8 @@ private: HoverTestResult lastHoverTestResults_; HoverTestResult curAccessibilityHoverResults_; HoverTestResult lastAccessibilityHoverResults_; + HoverTestResult curPenHoverResults_; + HoverTestResult lastPenHoverResults_; AxisTestResult axisTestResults_; WeakPtr lastHoverNode_; WeakPtr currHoverNode_; @@ -323,6 +328,7 @@ private: int32_t instanceId_ = 0; uint32_t lastHoverDispatchLength_ = 0; uint32_t lastAccessibilityHoverDispatchLength_ = 0; + uint32_t lastPenHoverDispatchLength_ = 0; bool inSelectedRect_ = false; bool isDragging_ = false; bool isLastMoveBeforeUp_ = false; diff --git a/frameworks/core/components_ng/base/frame_node.cpp b/frameworks/core/components_ng/base/frame_node.cpp index beeb92fc84f..79ed0c1581e 100644 --- a/frameworks/core/components_ng/base/frame_node.cpp +++ b/frameworks/core/components_ng/base/frame_node.cpp @@ -2586,11 +2586,7 @@ HitTestResult FrameNode::TouchTest(const PointF& globalPoint, const PointF& pare responseLinkResult.splice(responseLinkResult.end(), std::move(newComingResponseLinkTargets)); } } else if (touchRestrict.hitTestType == SourceType::MOUSE) { - auto mouseHub = eventHub_->GetInputEventHub(); - if (mouseHub) { - const auto coordinateOffset = globalPoint - localPoint; - preventBubbling = mouseHub->ProcessMouseTestHit(coordinateOffset, newComingTargets); - } + preventBubbling = ProcessMouseTestHit(globalPoint, localPoint, touchRestrict, newComingTargets); } } @@ -2620,6 +2616,22 @@ HitTestResult FrameNode::TouchTest(const PointF& globalPoint, const PointF& pare return testResult; } +bool FrameNode::ProcessMouseTestHit(const PointF& globalPoint, const PointF& localPoint, + TouchRestrict& touchRestrict, TouchTestResult& newComingTargets) +{ + auto mouseHub = eventHub_->GetInputEventHub(); + if (!mouseHub) { + return false; + } + + const auto coordinateOffset = globalPoint - localPoint; + if (touchRestrict.touchEvent.IsPenHoverEvent()) { + return mouseHub->ProcessPenHoverTestHit(coordinateOffset, newComingTargets); + } + + return mouseHub->ProcessMouseTestHit(coordinateOffset, newComingTargets); +} + std::vector FrameNode::GetResponseRegionList(const RectF& rect, int32_t sourceType) { std::vector responseRegionList; diff --git a/frameworks/core/components_ng/base/frame_node.h b/frameworks/core/components_ng/base/frame_node.h index 72a68374a9f..8f35aca418f 100644 --- a/frameworks/core/components_ng/base/frame_node.h +++ b/frameworks/core/components_ng/base/frame_node.h @@ -1190,6 +1190,9 @@ private: bool AllowVisibleAreaCheck() const; + bool ProcessMouseTestHit(const PointF& globalPoint, const PointF& localPoint, + TouchRestrict& touchRestrict, TouchTestResult& newComingTargets); + // sort in ZIndex. std::multiset, ZIndexComparator> frameChildren_; RefPtr geometryNode_ = MakeRefPtr(); diff --git a/frameworks/core/components_ng/event/input_event.cpp b/frameworks/core/components_ng/event/input_event.cpp index d7d26caabe6..6f243feda8b 100644 --- a/frameworks/core/components_ng/event/input_event.cpp +++ b/frameworks/core/components_ng/event/input_event.cpp @@ -29,6 +29,7 @@ InputEventActuator::InputEventActuator(const WeakPtr& inputEventH hoverEventTarget_ = MakeRefPtr(frameNode->GetTag(), frameNode->GetId()); hoverEffectTarget_ = MakeRefPtr(frameNode->GetTag(), frameNode->GetId()); accessibilityHoverEventTarget_ = MakeRefPtr(frameNode->GetTag(), frameNode->GetId()); + penHoverEventTarget_ = MakeRefPtr(frameNode->GetTag(), frameNode->GetId()); axisEventTarget_ = MakeRefPtr(frameNode->GetTag()); } @@ -95,6 +96,38 @@ void InputEventActuator::OnCollectHoverEvent( result.emplace_back(hoverEventTarget_); } +void InputEventActuator::OnCollectPenHoverEvent( + const OffsetF& coordinateOffset, const GetEventTargetImpl& getEventTargetImpl, TouchTestResult& result) +{ + if (inputEvents_.empty() && !userCallback_ && !userJSFrameNodeCallback_) { + return; + } + + auto onHoverCallback = [weak = WeakClaim(this)](bool info, HoverInfo& hoverInfo) { + auto actuator = weak.Upgrade(); + CHECK_NULL_VOID(actuator); + auto innerEvents = actuator->inputEvents_; + for (const auto& callback : innerEvents) { + if (callback) { + (*callback)(info); + (*callback)(info, hoverInfo); + } + } + auto userEvent = actuator->userCallback_; + if (userEvent) { + (*userEvent)(info, hoverInfo); + } + auto userJSFrameNodeCallback = actuator->userJSFrameNodeCallback_; + if (userJSFrameNodeCallback) { + (*userJSFrameNodeCallback)(info, hoverInfo); + } + }; + penHoverEventTarget_->SetPenHoverCallback(onHoverCallback); + penHoverEventTarget_->SetCoordinateOffset(Offset(coordinateOffset.GetX(), coordinateOffset.GetY())); + penHoverEventTarget_->SetGetEventTargetImpl(getEventTargetImpl); + result.emplace_back(penHoverEventTarget_); +} + void InputEventActuator::OnCollectHoverEffect( const OffsetF& coordinateOffset, const GetEventTargetImpl& getEventTargetImpl, TouchTestResult& result) { diff --git a/frameworks/core/components_ng/event/input_event.h b/frameworks/core/components_ng/event/input_event.h index 18a0ab7acfd..651b191d77b 100644 --- a/frameworks/core/components_ng/event/input_event.h +++ b/frameworks/core/components_ng/event/input_event.h @@ -199,6 +199,9 @@ public: void OnCollectAccessibilityHoverEvent(const OffsetF& coordinateOffset, const GetEventTargetImpl& getEventTargetImpl, TouchTestResult& result, const RefPtr& host); + void OnCollectPenHoverEvent( + const OffsetF& coordinateOffset, const GetEventTargetImpl& getEventTargetImpl, TouchTestResult& result); + void OnCollectAxisEvent( const OffsetF& coordinateOffset, const GetEventTargetImpl& getEventTargetImpl, AxisTestResult& onAxisResult); @@ -208,6 +211,7 @@ private: RefPtr hoverEventTarget_; RefPtr hoverEffectTarget_; RefPtr accessibilityHoverEventTarget_; + RefPtr penHoverEventTarget_; RefPtr axisEventTarget_; std::list> inputEvents_; RefPtr userCallback_; diff --git a/frameworks/core/components_ng/event/input_event_hub.cpp b/frameworks/core/components_ng/event/input_event_hub.cpp index da8f7e40c28..2c5a950f2c7 100644 --- a/frameworks/core/components_ng/event/input_event_hub.cpp +++ b/frameworks/core/components_ng/event/input_event_hub.cpp @@ -53,6 +53,18 @@ bool InputEventHub::ProcessMouseTestHit(const OffsetF& coordinateOffset, TouchTe return false; } +bool InputEventHub::ProcessPenHoverTestHit(const OffsetF& coordinateOffset, TouchTestResult& result) +{ + auto eventHub = eventHub_.Upgrade(); + auto getEventTargetImpl = eventHub ? eventHub->CreateGetEventTargetImpl() : nullptr; + + if (hoverEventActuator_) { + hoverEventActuator_->OnCollectPenHoverEvent(coordinateOffset, getEventTargetImpl, result); + } + + return false; +} + bool InputEventHub::ProcessAxisTestHit(const OffsetF& coordinateOffset, AxisTestResult& onAxisResult) { auto eventHub = eventHub_.Upgrade(); diff --git a/frameworks/core/components_ng/event/input_event_hub.h b/frameworks/core/components_ng/event/input_event_hub.h index 900d50f8ea6..7ee5a8917e8 100644 --- a/frameworks/core/components_ng/event/input_event_hub.h +++ b/frameworks/core/components_ng/event/input_event_hub.h @@ -147,6 +147,8 @@ public: // the return value means prevents event bubbling. bool ProcessMouseTestHit(const OffsetF& coordinateOffset, TouchTestResult& result); + bool ProcessPenHoverTestHit(const OffsetF& coordinateOffset, TouchTestResult& result); + bool ProcessAxisTestHit(const OffsetF& coordinateOffset, AxisTestResult& onAxisResult); RefPtr GetFrameNode() const; diff --git a/frameworks/core/components_ng/pattern/model/model_touch_handler.cpp b/frameworks/core/components_ng/pattern/model/model_touch_handler.cpp index cc32538445c..22e651c5b70 100644 --- a/frameworks/core/components_ng/pattern/model/model_touch_handler.cpp +++ b/frameworks/core/components_ng/pattern/model/model_touch_handler.cpp @@ -120,6 +120,8 @@ Render3D::PointerEvent ModelTouchHandler::CreateSceneTouchEvent(const TouchEvent case TouchType::HOVER_MOVE: case TouchType::HOVER_EXIT: case TouchType::HOVER_CANCEL: + case TouchType::PROXIMITY_IN: + case TouchType::PROXIMITY_OUT: case TouchType::UNKNOWN: break; } diff --git a/frameworks/core/event/mouse_event.cpp b/frameworks/core/event/mouse_event.cpp index dc50a255ad8..d39269cc5aa 100644 --- a/frameworks/core/event/mouse_event.cpp +++ b/frameworks/core/event/mouse_event.cpp @@ -33,6 +33,21 @@ bool HoverEventTarget::HandleHoverEvent(bool isHovered, const MouseEvent& event) return !hoverInfo.IsStopPropagation(); } +bool HoverEventTarget::HandlePenHoverEvent(bool isHovered, const TouchEvent& event) +{ + if (!onPenHoverEventCallback_) { + return false; + } + HoverInfo hoverInfo; + hoverInfo.SetTimeStamp(event.time); + hoverInfo.SetDeviceId(event.deviceId); + hoverInfo.SetSourceDevice(event.sourceType); + hoverInfo.SetSourceTool(event.sourceTool); + hoverInfo.SetTarget(GetEventTarget().value_or(EventTarget())); + onPenHoverEventCallback_(isHovered, hoverInfo); + return !hoverInfo.IsStopPropagation(); +} + void HoverEventTarget::HandleAccessibilityHoverEvent(bool isHovered, const TouchEvent& event) { if (!onAccessibilityHoverCallback_) { @@ -77,6 +92,8 @@ AccessibilityHoverAction HoverEventTarget::ConvertAccessibilityHoverAction(Touch case TouchType::PULL_MOVE: case TouchType::PULL_IN_WINDOW: case TouchType::PULL_OUT_WINDOW: + case TouchType::PROXIMITY_IN: + case TouchType::PROXIMITY_OUT: case TouchType::UNKNOWN: return AccessibilityHoverAction::UNKNOWN; } diff --git a/frameworks/core/event/mouse_event.h b/frameworks/core/event/mouse_event.h index b13bd0e7c49..17b740d18fc 100644 --- a/frameworks/core/event/mouse_event.h +++ b/frameworks/core/event/mouse_event.h @@ -502,15 +502,27 @@ public: onAccessibilityHoverCallback_ = onAccessibilityHoverCallback; } + void SetPenHoverCallback(const OnHoverFunc& onPenHoverEventCallback) + { + onPenHoverEventCallback_ = onPenHoverEventCallback; + } + bool HandleHoverEvent(bool isHovered, const MouseEvent& event); void HandleAccessibilityHoverEvent(bool isHovered, const TouchEvent& event); + bool HandlePenHoverEvent(bool isHovered, const TouchEvent& event); + bool IsAccessibilityHoverTarget() { return onAccessibilityHoverCallback_ != nullptr; } + bool IsPenHoverTarget() + { + return onPenHoverEventCallback_ != nullptr; + } + bool HandleHoverEvent(bool isHovered) { if (!onHoverCallback_) { @@ -535,6 +547,7 @@ private: OnHoverEventFunc onHoverCallback_; OnHoverFunc onHoverEventCallback_; OnAccessibilityHoverFunc onAccessibilityHoverCallback_; + OnHoverFunc onPenHoverEventCallback_; }; class HoverEffectTarget : public virtual TouchEventTarget { diff --git a/frameworks/core/event/touch_event.h b/frameworks/core/event/touch_event.h index dd06cacdac3..71d81e19ea5 100755 --- a/frameworks/core/event/touch_event.h +++ b/frameworks/core/event/touch_event.h @@ -52,6 +52,8 @@ enum class TouchType : size_t { HOVER_MOVE, HOVER_EXIT, HOVER_CANCEL, + PROXIMITY_IN, + PROXIMITY_OUT, UNKNOWN, }; @@ -451,6 +453,12 @@ struct TouchEvent final : public UIInputEvent { event.pointers.emplace_back(std::move(point)); return event; } + + bool IsPenHoverEvent() const + { + return sourceTool == SourceTool::PEN && (type == TouchType::PROXIMITY_IN || + type == TouchType::PROXIMITY_OUT || (type == TouchType::MOVE && force == 0.0f)); + } }; namespace Platform { diff --git a/frameworks/core/pipeline/pipeline_base.h b/frameworks/core/pipeline/pipeline_base.h index 6ae09b71b1d..0367ed89d21 100644 --- a/frameworks/core/pipeline/pipeline_base.h +++ b/frameworks/core/pipeline/pipeline_base.h @@ -170,6 +170,8 @@ public: virtual void OnAccessibilityHoverEvent(const TouchEvent& point, const RefPtr& node) {} + virtual void OnPenHoverEvent(const TouchEvent& point, const RefPtr& node) {} + // Called by container when key event received. // if return false, then this event needs platform to handle it. virtual bool OnKeyEvent(const KeyEvent& event) = 0; diff --git a/frameworks/core/pipeline_ng/pipeline_context.cpp b/frameworks/core/pipeline_ng/pipeline_context.cpp index 907d3a0c426..722e5129dd6 100644 --- a/frameworks/core/pipeline_ng/pipeline_context.cpp +++ b/frameworks/core/pipeline_ng/pipeline_context.cpp @@ -2671,6 +2671,35 @@ void PipelineContext::OnAccessibilityHoverEvent(const TouchEvent& point, const R RequestFrame(); } +void PipelineContext::OnPenHoverEvent(const TouchEvent& point, const RefPtr& node) +{ + CHECK_RUN_ON(UI); + auto scaleEvent = point.CreateScalePoint(viewScale_); + if (scaleEvent.type != TouchType::MOVE) { + eventManager_->GetEventTreeRecord().AddTouchPoint(scaleEvent); + TAG_LOGI(AceLogTag::ACE_INPUTTRACKING, + "OnPenHoverEvent event id:%{public}d, fingerId:%{public}d, x=%{public}f y=%{public}f " + "type=%{public}d, " + "inject=%{public}d", + scaleEvent.touchEventId, scaleEvent.id, scaleEvent.x, scaleEvent.y, (int)scaleEvent.type, + scaleEvent.isInjected); + } + + auto targerNode = node ? node : rootNode_; + TouchRestrict touchRestrict { TouchRestrict::NONE }; + touchRestrict.sourceType = scaleEvent.sourceType; + touchRestrict.touchEvent.sourceTool = scaleEvent.sourceTool; + touchRestrict.touchEvent.type = scaleEvent.type; + touchRestrict.touchEvent.force = scaleEvent.force; + + // use mouse to collect pen hover target + touchRestrict.hitTestType = SourceType::MOUSE; + touchRestrict.inputEventType = InputEventType::TOUCH_SCREEN; + eventManager_->PenHoverTest(scaleEvent, targerNode, touchRestrict); + eventManager_->DispatchPenHoverEventNG(scaleEvent); + RequestFrame(); +} + void PipelineContext::OnMouseEvent(const MouseEvent& event, const RefPtr& node) { CHECK_RUN_ON(UI); diff --git a/frameworks/core/pipeline_ng/pipeline_context.h b/frameworks/core/pipeline_ng/pipeline_context.h index 4bfefb96c29..28c3d8849a2 100644 --- a/frameworks/core/pipeline_ng/pipeline_context.h +++ b/frameworks/core/pipeline_ng/pipeline_context.h @@ -138,6 +138,8 @@ public: void OnAccessibilityHoverEvent(const TouchEvent& point, const RefPtr& node) override; + void OnPenHoverEvent(const TouchEvent& point, const RefPtr& node) override; + void OnMouseEvent(const MouseEvent& event, const RefPtr& node) override; void OnAxisEvent(const AxisEvent& event, const RefPtr& node) override; diff --git a/test/mock/core/pipeline/mock_pipeline_context.cpp b/test/mock/core/pipeline/mock_pipeline_context.cpp index 42c766f0fc0..7df1a3f7c2d 100644 --- a/test/mock/core/pipeline/mock_pipeline_context.cpp +++ b/test/mock/core/pipeline/mock_pipeline_context.cpp @@ -215,6 +215,8 @@ void PipelineContext::OnTouchEvent(const TouchEvent& point, bool isSubPipe) {} void PipelineContext::OnAccessibilityHoverEvent(const TouchEvent& point, const RefPtr& node) {} +void PipelineContext::OnPenHoverEvent(const TouchEvent& point, const RefPtr& node) {} + void PipelineContext::OnMouseEvent(const MouseEvent& event) {} void PipelineContext::FlushTouchEvents() {} -- Gitee From d822d6955b3bc8ecdee202f9a3d97de71a9ffdcb Mon Sep 17 00:00:00 2001 From: chenqiang777 Date: Thu, 22 Aug 2024 21:54:41 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E6=8C=89=E5=8E=8B=E5=9C=BA=E6=99=AF?= =?UTF-8?q?=E8=A7=A3=E9=99=A4=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I7ee9f3b4a3dd789a8ccfef38276a7609ef2fe59d Signed-off-by: chenqiang777 --- frameworks/core/pipeline/pipeline_base.h | 2 ++ .../core/pipeline_ng/pipeline_context.cpp | 17 +++++++++++++++++ frameworks/core/pipeline_ng/pipeline_context.h | 2 ++ .../core/pipeline/mock_pipeline_context.cpp | 2 ++ 4 files changed, 23 insertions(+) diff --git a/frameworks/core/pipeline/pipeline_base.h b/frameworks/core/pipeline/pipeline_base.h index 0367ed89d21..6c21021ab26 100644 --- a/frameworks/core/pipeline/pipeline_base.h +++ b/frameworks/core/pipeline/pipeline_base.h @@ -172,6 +172,8 @@ public: virtual void OnPenHoverEvent(const TouchEvent& point, const RefPtr& node) {} + virtual void HandlePenHoverOut(const TouchEvent& point) {} + // Called by container when key event received. // if return false, then this event needs platform to handle it. virtual bool OnKeyEvent(const KeyEvent& event) = 0; diff --git a/frameworks/core/pipeline_ng/pipeline_context.cpp b/frameworks/core/pipeline_ng/pipeline_context.cpp index 722e5129dd6..c3c5aa040a0 100644 --- a/frameworks/core/pipeline_ng/pipeline_context.cpp +++ b/frameworks/core/pipeline_ng/pipeline_context.cpp @@ -2031,6 +2031,8 @@ void PipelineContext::OnTouchEvent(const TouchEvent& point, const RefPtrUpdatePenHoverNode(scaleEvent, testResult); + eventManager_->DispatchPenHoverEventNG(scaleEvent); +} + void PipelineContext::OnMouseEvent(const MouseEvent& event, const RefPtr& node) { CHECK_RUN_ON(UI); diff --git a/frameworks/core/pipeline_ng/pipeline_context.h b/frameworks/core/pipeline_ng/pipeline_context.h index 28c3d8849a2..206b53c9f9a 100644 --- a/frameworks/core/pipeline_ng/pipeline_context.h +++ b/frameworks/core/pipeline_ng/pipeline_context.h @@ -140,6 +140,8 @@ public: void OnPenHoverEvent(const TouchEvent& point, const RefPtr& node) override; + void HandlePenHoverOut(const TouchEvent& point) override; + void OnMouseEvent(const MouseEvent& event, const RefPtr& node) override; void OnAxisEvent(const AxisEvent& event, const RefPtr& node) override; diff --git a/test/mock/core/pipeline/mock_pipeline_context.cpp b/test/mock/core/pipeline/mock_pipeline_context.cpp index 7df1a3f7c2d..68ad35c20a4 100644 --- a/test/mock/core/pipeline/mock_pipeline_context.cpp +++ b/test/mock/core/pipeline/mock_pipeline_context.cpp @@ -217,6 +217,8 @@ void PipelineContext::OnAccessibilityHoverEvent(const TouchEvent& point, const R void PipelineContext::OnPenHoverEvent(const TouchEvent& point, const RefPtr& node) {} +void PipelineContext::HandlePenHoverOut(const TouchEvent& point) {} + void PipelineContext::OnMouseEvent(const MouseEvent& event) {} void PipelineContext::FlushTouchEvents() {} -- Gitee From 871db69af6192154e7aee0749f3252bd77a682f0 Mon Sep 17 00:00:00 2001 From: chenqiang777 Date: Fri, 23 Aug 2024 11:19:57 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E8=A7=A3=E5=86=B3code=20check=20&=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ic2b090df5e8eb82331890a7cd075ba93072535c1 Signed-off-by: chenqiang777 --- frameworks/core/common/event_manager.cpp | 7 +------ frameworks/core/common/event_manager.h | 5 ++++- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/frameworks/core/common/event_manager.cpp b/frameworks/core/common/event_manager.cpp index 6e180bfbc19..f4fe101366c 100644 --- a/frameworks/core/common/event_manager.cpp +++ b/frameworks/core/common/event_manager.cpp @@ -1096,7 +1096,7 @@ void EventManager::PenHoverTest( frameNode->TouchTest( point, point, point, touchRestrict, testResult, event.id, responseLinkResult); SetResponseLinkRecognizers(testResult, responseLinkResult); - UpdateAccessibilityHoverNode(event, testResult); + UpdatePenHoverNode(event, testResult); } void EventManager::MouseTest( @@ -1280,11 +1280,6 @@ bool EventManager::DispatchMouseEventNG(const MouseEvent& event) return false; } -void EventManager::DoMouseActionRelease() -{ - pressMouseTestResults_.clear(); -} - void EventManager::DispatchMouseHoverAnimationNG(const MouseEvent& event) { auto hoverNodeCur = currHoverNode_.Upgrade(); diff --git a/frameworks/core/common/event_manager.h b/frameworks/core/common/event_manager.h index ca0a7d13040..14609cb50f0 100644 --- a/frameworks/core/common/event_manager.h +++ b/frameworks/core/common/event_manager.h @@ -202,7 +202,10 @@ public: uint8_t GetKeyboardShortcutKeys(const std::vector& keys); - void DoMouseActionRelease(); + void DoMouseActionRelease() + { + pressMouseTestResults_.clear(); + } void SetIsDragging(bool isDragging) { -- Gitee From 28af897005b7b6517b758e820cb94c227d308c1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B0=B8=E7=95=85?= Date: Fri, 23 Aug 2024 08:49:38 +0000 Subject: [PATCH 4/8] =?UTF-8?q?=E4=BD=BF=E7=94=A8NearZero=E5=88=A40=20&=20?= =?UTF-8?q?=E8=A7=A3=E5=86=B3bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: chenqiang777 Change-Id: I7a41f1107f493fe4555a3f3c58ff95d342e1e4ad --- frameworks/core/event/touch_event.h | 2 +- frameworks/core/pipeline_ng/pipeline_context.cpp | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/frameworks/core/event/touch_event.h b/frameworks/core/event/touch_event.h index 71d81e19ea5..f57f2ac441a 100755 --- a/frameworks/core/event/touch_event.h +++ b/frameworks/core/event/touch_event.h @@ -457,7 +457,7 @@ struct TouchEvent final : public UIInputEvent { bool IsPenHoverEvent() const { return sourceTool == SourceTool::PEN && (type == TouchType::PROXIMITY_IN || - type == TouchType::PROXIMITY_OUT || (type == TouchType::MOVE && force == 0.0f)); + type == TouchType::PROXIMITY_OUT || (type == TouchType::MOVE && NearZero(force))); } }; diff --git a/frameworks/core/pipeline_ng/pipeline_context.cpp b/frameworks/core/pipeline_ng/pipeline_context.cpp index c3c5aa040a0..0ce16458ba1 100644 --- a/frameworks/core/pipeline_ng/pipeline_context.cpp +++ b/frameworks/core/pipeline_ng/pipeline_context.cpp @@ -2704,17 +2704,17 @@ void PipelineContext::OnPenHoverEvent(const TouchEvent& point, const RefPtrUpdatePenHoverNode(scaleEvent, testResult); - eventManager_->DispatchPenHoverEventNG(scaleEvent); + eventManager_->UpdatePenHoverNode(oriPoint, testResult); + eventManager_->DispatchPenHoverEventNG(oriPoint); } void PipelineContext::OnMouseEvent(const MouseEvent& event, const RefPtr& node) -- Gitee From 3de765da8dbf0ed39867e70b0b172c6b28c7a149 Mon Sep 17 00:00:00 2001 From: chenqiang777 Date: Mon, 26 Aug 2024 19:20:32 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E6=A3=80=E8=A7=86?= =?UTF-8?q?=E6=84=8F=E8=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ia368c4621ff3534a60f77a4654f39b03e77c9e22 Signed-off-by: chenqiang777 --- .../core/components_ng/event/input_event.cpp | 28 +++++++++---------- frameworks/core/event/mouse_event.h | 2 +- .../core/pipeline_ng/pipeline_context.cpp | 4 +-- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/frameworks/core/components_ng/event/input_event.cpp b/frameworks/core/components_ng/event/input_event.cpp index 6f243feda8b..6290cf87d66 100644 --- a/frameworks/core/components_ng/event/input_event.cpp +++ b/frameworks/core/components_ng/event/input_event.cpp @@ -103,26 +103,26 @@ void InputEventActuator::OnCollectPenHoverEvent( return; } - auto onHoverCallback = [weak = WeakClaim(this)](bool info, HoverInfo& hoverInfo) { - auto actuator = weak.Upgrade(); + auto penHoverCallback = [weakClaim = WeakClaim(this)](bool isHover, HoverInfo& penHoverInfo) { + auto actuator = weakClaim.Upgrade(); CHECK_NULL_VOID(actuator); - auto innerEvents = actuator->inputEvents_; - for (const auto& callback : innerEvents) { - if (callback) { - (*callback)(info); - (*callback)(info, hoverInfo); + auto inputEvents = actuator->inputEvents_; + for (const auto& inputCallback : inputEvents) { + if (inputCallback) { + (*inputCallback)(isHover); + (*inputCallback)(isHover, penHoverInfo); } } - auto userEvent = actuator->userCallback_; - if (userEvent) { - (*userEvent)(info, hoverInfo); + auto userCallback = actuator->userCallback_; + if (userCallback) { + (*userCallback)(isHover, penHoverInfo); } - auto userJSFrameNodeCallback = actuator->userJSFrameNodeCallback_; - if (userJSFrameNodeCallback) { - (*userJSFrameNodeCallback)(info, hoverInfo); + auto userJSCallback = actuator->userJSFrameNodeCallback_; + if (userJSCallback) { + (*userJSCallback)(isHover, penHoverInfo); } }; - penHoverEventTarget_->SetPenHoverCallback(onHoverCallback); + penHoverEventTarget_->SetPenHoverCallback(penHoverCallback); penHoverEventTarget_->SetCoordinateOffset(Offset(coordinateOffset.GetX(), coordinateOffset.GetY())); penHoverEventTarget_->SetGetEventTargetImpl(getEventTargetImpl); result.emplace_back(penHoverEventTarget_); diff --git a/frameworks/core/event/mouse_event.h b/frameworks/core/event/mouse_event.h index 17b740d18fc..4651f0b8198 100644 --- a/frameworks/core/event/mouse_event.h +++ b/frameworks/core/event/mouse_event.h @@ -518,7 +518,7 @@ public: return onAccessibilityHoverCallback_ != nullptr; } - bool IsPenHoverTarget() + bool IsPenHoverTarget() const { return onPenHoverEventCallback_ != nullptr; } diff --git a/frameworks/core/pipeline_ng/pipeline_context.cpp b/frameworks/core/pipeline_ng/pipeline_context.cpp index 0ce16458ba1..31a572f39c0 100644 --- a/frameworks/core/pipeline_ng/pipeline_context.cpp +++ b/frameworks/core/pipeline_ng/pipeline_context.cpp @@ -2680,10 +2680,10 @@ void PipelineContext::OnPenHoverEvent(const TouchEvent& point, const RefPtrGetEventTreeRecord().AddTouchPoint(scaleEvent); TAG_LOGI(AceLogTag::ACE_INPUTTRACKING, - "OnPenHoverEvent event id:%{public}d, fingerId:%{public}d, x=%{public}f y=%{public}f " + "OnPenHoverEvent event id:%{public}d, fingerId:%{public}d " "type=%{public}d, " "inject=%{public}d", - scaleEvent.touchEventId, scaleEvent.id, scaleEvent.x, scaleEvent.y, (int)scaleEvent.type, + scaleEvent.touchEventId, scaleEvent.id, (int)scaleEvent.type, scaleEvent.isInjected); } -- Gitee From 66b64e1269cb511c9fbe318318d1b59207eea897 Mon Sep 17 00:00:00 2001 From: chenqiang777 Date: Wed, 28 Aug 2024 16:55:56 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E8=A7=A3=E5=86=B3codecheck=E6=8B=86?= =?UTF-8?q?=E8=B6=85=E5=A4=A7=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: chenqiang777 Change-Id: I2f46ca883c081031c81fb9625e53bdb97e2f5aa6 --- frameworks/core/BUILD.gn | 2 + frameworks/core/common/event_manager.cpp | 92 +-------------- frameworks/core/common/event_manager.h | 5 +- frameworks/core/common/pen_event_manager.cpp | 113 +++++++++++++++++++ 4 files changed, 121 insertions(+), 91 deletions(-) create mode 100644 frameworks/core/common/pen_event_manager.cpp diff --git a/frameworks/core/BUILD.gn b/frameworks/core/BUILD.gn index c36e0d19fbf..2ba8698f8d9 100644 --- a/frameworks/core/BUILD.gn +++ b/frameworks/core/BUILD.gn @@ -124,6 +124,7 @@ template("ace_core_source_set") { "common/font_loader.cpp", "common/font_manager.cpp", "common/frontend.cpp", + "common/pen_event_manager.cpp", "common/platform_bridge.cpp", "common/render_boundary_manager.cpp", "common/resource/resource_manager.cpp", @@ -704,6 +705,7 @@ template("ace_core_ng_source_set") { "common/font_loader.cpp", "common/font_manager.cpp", "common/frontend.cpp", + "common/pen_event_manager.cpp", "common/platform_bridge.cpp", "common/render_boundary_manager.cpp", "common/resource/resource_manager.cpp", diff --git a/frameworks/core/common/event_manager.cpp b/frameworks/core/common/event_manager.cpp index f4fe101366c..2ccbb7650f7 100644 --- a/frameworks/core/common/event_manager.cpp +++ b/frameworks/core/common/event_manager.cpp @@ -1086,19 +1086,6 @@ void EventManager::AccessibilityHoverTest( UpdateAccessibilityHoverNode(event, testResult); } -void EventManager::PenHoverTest( - const TouchEvent& event, const RefPtr& frameNode, TouchRestrict& touchRestrict) -{ - CHECK_NULL_VOID(frameNode); - const NG::PointF point { event.x, event.y }; - TouchTestResult testResult; - ResponseLinkResult responseLinkResult; - frameNode->TouchTest( - point, point, point, touchRestrict, testResult, event.id, responseLinkResult); - SetResponseLinkRecognizers(testResult, responseLinkResult); - UpdatePenHoverNode(event, testResult); -} - void EventManager::MouseTest( const MouseEvent& event, const RefPtr& frameNode, TouchRestrict& touchRestrict) { @@ -1166,30 +1153,6 @@ void EventManager::UpdateAccessibilityHoverNode(const TouchEvent& event, const T } } -void EventManager::UpdatePenHoverNode(const TouchEvent& event, const TouchTestResult& testResult) -{ - HoverTestResult penHoverTestResult; - for (const auto& result : testResult) { - auto penHoverResult = AceType::DynamicCast(result); - if (penHoverResult && penHoverResult->IsPenHoverTarget()) { - penHoverTestResult.emplace_back(penHoverResult); - } - } - - if (event.type == TouchType::PROXIMITY_IN) { - TAG_LOGI(AceLogTag::ACE_INPUTTRACKING, "pen proximity in hover event."); - lastPenHoverResults_.clear(); - curPenHoverResults_ = std::move(penHoverTestResult); - } else if (event.type == TouchType::PROXIMITY_OUT) { - TAG_LOGI(AceLogTag::ACE_INPUTTRACKING, "pen proximity out hover event."); - lastPenHoverResults_ = std::move(curPenHoverResults_); - curPenHoverResults_.clear(); - } else { - lastPenHoverResults_ = std::move(curPenHoverResults_); - curPenHoverResults_ = std::move(penHoverTestResult); - } -} - void EventManager::UpdateHoverNode(const MouseEvent& event, const TouchTestResult& testResult) { currMouseTestResults_.clear(); @@ -1280,6 +1243,11 @@ bool EventManager::DispatchMouseEventNG(const MouseEvent& event) return false; } +void EventManager::DoMouseActionRelease() +{ + pressMouseTestResults_.clear(); +} + void EventManager::DispatchMouseHoverAnimationNG(const MouseEvent& event) { auto hoverNodeCur = currHoverNode_.Upgrade(); @@ -1412,56 +1380,6 @@ void EventManager::DispatchAccessibilityHoverEventNG(const TouchEvent& event) } } -void EventManager::DispatchPenHoverEventNG(const TouchEvent& event) -{ - auto lastHoverEndNode = lastPenHoverResults_.begin(); - auto currHoverEndNode = curPenHoverResults_.begin(); - RefPtr lastHoverEndNodeTarget; - uint32_t iterCountLast = 0; - uint32_t iterCountCurr = 0; - for (const auto& hoverResult : lastPenHoverResults_) { - // get valid part of previous hover nodes while it's not in current hover nodes. Those nodes exit hover - // there may have some nodes in curPenHoverResults_ but intercepted - iterCountLast++; - if (lastHoverEndNode != curPenHoverResults_.end()) { - lastHoverEndNode++; - } - if (std::find(curPenHoverResults_.begin(), curPenHoverResults_.end(), hoverResult) == - curPenHoverResults_.end()) { - hoverResult->HandlePenHoverEvent(false, event); - } - if ((iterCountLast >= lastPenHoverDispatchLength_) && (lastPenHoverDispatchLength_ != 0)) { - lastHoverEndNodeTarget = hoverResult; - break; - } - } - lastPenHoverDispatchLength_ = 0; - for (const auto& hoverResult : curPenHoverResults_) { - // get valid part of current hover nodes while it's not in previous hover nodes. Those nodes are new hover - // the valid part stops at first interception - iterCountCurr++; - if (currHoverEndNode != curPenHoverResults_.end()) { - currHoverEndNode++; - } - if (std::find(lastPenHoverResults_.begin(), lastHoverEndNode, hoverResult) == lastHoverEndNode) { - if (!hoverResult->HandlePenHoverEvent(true, event)) { - lastPenHoverDispatchLength_ = iterCountCurr; - break; - } - } - if (hoverResult == lastHoverEndNodeTarget) { - lastPenHoverDispatchLength_ = iterCountCurr; - break; - } - } - for (auto hoverResultIt = lastPenHoverResults_.begin(); hoverResultIt != lastHoverEndNode; ++hoverResultIt) { - // there may have previous hover nodes in the invalid part of current hover nodes. Those nodes exit hover also - if (std::find(currHoverEndNode, curPenHoverResults_.end(), *hoverResultIt) != curPenHoverResults_.end()) { - (*hoverResultIt)->HandlePenHoverEvent(false, event); - } - } -} - void EventManager::AxisTest(const AxisEvent& event, const RefPtr& renderNode) { CHECK_NULL_VOID(renderNode); diff --git a/frameworks/core/common/event_manager.h b/frameworks/core/common/event_manager.h index 14609cb50f0..ca0a7d13040 100644 --- a/frameworks/core/common/event_manager.h +++ b/frameworks/core/common/event_manager.h @@ -202,10 +202,7 @@ public: uint8_t GetKeyboardShortcutKeys(const std::vector& keys); - void DoMouseActionRelease() - { - pressMouseTestResults_.clear(); - } + void DoMouseActionRelease(); void SetIsDragging(bool isDragging) { diff --git a/frameworks/core/common/pen_event_manager.cpp b/frameworks/core/common/pen_event_manager.cpp new file mode 100644 index 00000000000..1b80720ca0f --- /dev/null +++ b/frameworks/core/common/pen_event_manager.cpp @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2021-2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "core/common/event_manager.h" + +#include "base/log/dump_log.h" +#include "base/thread/frame_trace_adapter.h" +#include "core/common/container.h" +#include "core/common/xcollie/xcollieInterface.h" +#include "core/components_ng/manager/select_overlay/select_overlay_manager.h" +#include "core/components_ng/pattern/window_scene/helper/window_scene_helper.h" + +namespace OHOS::Ace { + +void EventManager::PenHoverTest( + const TouchEvent& event, const RefPtr& frameNode, TouchRestrict& touchRestrict) +{ + CHECK_NULL_VOID(frameNode); + const NG::PointF point { event.x, event.y }; + TouchTestResult testResult; + ResponseLinkResult responseLinkResult; + frameNode->TouchTest( + point, point, point, touchRestrict, testResult, event.id, responseLinkResult); + SetResponseLinkRecognizers(testResult, responseLinkResult); + UpdatePenHoverNode(event, testResult); +} + +void EventManager::UpdatePenHoverNode(const TouchEvent& event, const TouchTestResult& testResult) +{ + HoverTestResult penHoverTestResult; + for (const auto& result : testResult) { + auto penHoverResult = AceType::DynamicCast(result); + if (penHoverResult && penHoverResult->IsPenHoverTarget()) { + penHoverTestResult.emplace_back(penHoverResult); + } + } + + if (event.type == TouchType::PROXIMITY_IN) { + TAG_LOGI(AceLogTag::ACE_INPUTTRACKING, "pen proximity in hover event."); + lastPenHoverResults_.clear(); + curPenHoverResults_ = std::move(penHoverTestResult); + } else if (event.type == TouchType::PROXIMITY_OUT) { + TAG_LOGI(AceLogTag::ACE_INPUTTRACKING, "pen proximity out hover event."); + lastPenHoverResults_ = std::move(curPenHoverResults_); + curPenHoverResults_.clear(); + } else { + lastPenHoverResults_ = std::move(curPenHoverResults_); + curPenHoverResults_ = std::move(penHoverTestResult); + } +} + +void EventManager::DispatchPenHoverEventNG(const TouchEvent& event) +{ + auto lastHoverEndNode = lastPenHoverResults_.begin(); + auto currHoverEndNode = curPenHoverResults_.begin(); + RefPtr lastHoverEndNodeTarget; + uint32_t iterCountLast = 0; + uint32_t iterCountCurr = 0; + for (const auto& hoverResult : lastPenHoverResults_) { + // get valid part of previous hover nodes while it's not in current hover nodes. Those nodes exit hover + // there may have some nodes in curPenHoverResults_ but intercepted + iterCountLast++; + if (lastHoverEndNode != curPenHoverResults_.end()) { + lastHoverEndNode++; + } + if (std::find(curPenHoverResults_.begin(), curPenHoverResults_.end(), hoverResult) == + curPenHoverResults_.end()) { + hoverResult->HandlePenHoverEvent(false, event); + } + if ((iterCountLast >= lastPenHoverDispatchLength_) && (lastPenHoverDispatchLength_ != 0)) { + lastHoverEndNodeTarget = hoverResult; + break; + } + } + lastPenHoverDispatchLength_ = 0; + for (const auto& hoverResult : curPenHoverResults_) { + // get valid part of current hover nodes while it's not in previous hover nodes. Those nodes are new hover + // the valid part stops at first interception + iterCountCurr++; + if (currHoverEndNode != curPenHoverResults_.end()) { + currHoverEndNode++; + } + if (std::find(lastPenHoverResults_.begin(), lastHoverEndNode, hoverResult) == lastHoverEndNode) { + if (!hoverResult->HandlePenHoverEvent(true, event)) { + lastPenHoverDispatchLength_ = iterCountCurr; + break; + } + } + if (hoverResult == lastHoverEndNodeTarget) { + lastPenHoverDispatchLength_ = iterCountCurr; + break; + } + } + for (auto hoverResultIt = lastPenHoverResults_.begin(); hoverResultIt != lastHoverEndNode; ++hoverResultIt) { + // there may have previous hover nodes in the invalid part of current hover nodes. Those nodes exit hover also + if (std::find(currHoverEndNode, curPenHoverResults_.end(), *hoverResultIt) != curPenHoverResults_.end()) { + (*hoverResultIt)->HandlePenHoverEvent(false, event); + } + } +} +} // namespace OHOS::Ace -- Gitee From 9676a79066303cd35209dd67b533aea976a3006e Mon Sep 17 00:00:00 2001 From: chenqiang777 Date: Wed, 28 Aug 2024 20:08:11 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E7=BC=96=E8=AF=91?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ieac0bda7d85ce5a946cf2d17948e37c0921cd955 Signed-off-by: chenqiang777 --- frameworks/core/animation/test/unittest/framework/BUILD.gn | 1 + frameworks/core/animation/test/unittest/spring_chain/BUILD.gn | 1 + frameworks/core/animation/test/unittest/svg_animate/BUILD.gn | 1 + frameworks/core/common/pen_event_manager.cpp | 2 +- test/unittest/BUILD.gn | 1 + 5 files changed, 5 insertions(+), 1 deletion(-) diff --git a/frameworks/core/animation/test/unittest/framework/BUILD.gn b/frameworks/core/animation/test/unittest/framework/BUILD.gn index 233a38d499a..6e66a91284a 100644 --- a/frameworks/core/animation/test/unittest/framework/BUILD.gn +++ b/frameworks/core/animation/test/unittest/framework/BUILD.gn @@ -54,6 +54,7 @@ ohos_unittest("AnimationTest") { "$ace_root/frameworks/core/common/font_loader.cpp", "$ace_root/frameworks/core/common/font_manager.cpp", "$ace_root/frameworks/core/common/frontend.cpp", + "$ace_root/frameworks/core/common/pen_event_manager.cpp", "$ace_root/frameworks/core/common/thread_checker.cpp", "$ace_root/frameworks/core/common/vibrator/vibrator_proxy.cpp", "$ace_root/frameworks/core/common/window.cpp", diff --git a/frameworks/core/animation/test/unittest/spring_chain/BUILD.gn b/frameworks/core/animation/test/unittest/spring_chain/BUILD.gn index 7652bbd1753..14e25a61538 100644 --- a/frameworks/core/animation/test/unittest/spring_chain/BUILD.gn +++ b/frameworks/core/animation/test/unittest/spring_chain/BUILD.gn @@ -57,6 +57,7 @@ ohos_unittest("SpringChainTest") { "$ace_root/frameworks/core/common/font_loader.cpp", "$ace_root/frameworks/core/common/font_manager.cpp", "$ace_root/frameworks/core/common/frontend.cpp", + "$ace_root/frameworks/core/common/pen_event_manager.cpp", "$ace_root/frameworks/core/common/thread_checker.cpp", "$ace_root/frameworks/core/common/vibrator/vibrator_proxy.cpp", "$ace_root/frameworks/core/common/window.cpp", diff --git a/frameworks/core/animation/test/unittest/svg_animate/BUILD.gn b/frameworks/core/animation/test/unittest/svg_animate/BUILD.gn index 8bd3bf59bae..cea78d5ac4f 100644 --- a/frameworks/core/animation/test/unittest/svg_animate/BUILD.gn +++ b/frameworks/core/animation/test/unittest/svg_animate/BUILD.gn @@ -56,6 +56,7 @@ ohos_unittest("SvgAnimateTest") { "$ace_root/frameworks/core/common/font_loader.cpp", "$ace_root/frameworks/core/common/font_manager.cpp", "$ace_root/frameworks/core/common/frontend.cpp", + "$ace_root/frameworks/core/common/pen_event_manager.cpp", "$ace_root/frameworks/core/common/thread_checker.cpp", "$ace_root/frameworks/core/common/vibrator/vibrator_proxy.cpp", "$ace_root/frameworks/core/common/window.cpp", diff --git a/frameworks/core/common/pen_event_manager.cpp b/frameworks/core/common/pen_event_manager.cpp index 1b80720ca0f..9eee4e0965e 100644 --- a/frameworks/core/common/pen_event_manager.cpp +++ b/frameworks/core/common/pen_event_manager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2024 Huawei Device Co., Ltd. + * Copyright (c) 2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/test/unittest/BUILD.gn b/test/unittest/BUILD.gn index 9cf9e598339..b50850c750f 100644 --- a/test/unittest/BUILD.gn +++ b/test/unittest/BUILD.gn @@ -428,6 +428,7 @@ ohos_source_set("ace_core_extra") { "$ace_root/frameworks/core/common/ime/text_input_formatter.cpp", "$ace_root/frameworks/core/common/ime/text_input_proxy.cpp", "$ace_root/frameworks/core/common/ime/text_input_type.cpp", + "$ace_root/frameworks/core/common/pen_event_manager.cpp", "$ace_root/frameworks/core/common/recorder/event_config.cpp", "$ace_root/frameworks/core/common/recorder/event_controller.cpp", "$ace_root/frameworks/core/common/recorder/event_recorder.cpp", -- Gitee From dae5e6e0a5f039be96f5724f55abc90b0eb495cd Mon Sep 17 00:00:00 2001 From: chenqiang777 Date: Wed, 28 Aug 2024 23:57:27 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E6=A3=80=E8=A7=86?= =?UTF-8?q?=E6=84=8F=E8=A7=81=E6=94=B9=E5=90=8D=E5=84=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: chenqiang777 Change-Id: I784511f70643188a5b5b1d96b3fb7c9bdb35971c --- frameworks/core/BUILD.gn | 4 ++-- frameworks/core/animation/test/unittest/framework/BUILD.gn | 2 +- frameworks/core/animation/test/unittest/spring_chain/BUILD.gn | 2 +- frameworks/core/animation/test/unittest/svg_animate/BUILD.gn | 2 +- .../common/{pen_event_manager.cpp => event_manager_pen.cpp} | 0 test/unittest/BUILD.gn | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) rename frameworks/core/common/{pen_event_manager.cpp => event_manager_pen.cpp} (100%) diff --git a/frameworks/core/BUILD.gn b/frameworks/core/BUILD.gn index 2ba8698f8d9..cb306b63b50 100644 --- a/frameworks/core/BUILD.gn +++ b/frameworks/core/BUILD.gn @@ -120,11 +120,11 @@ template("ace_core_source_set") { "common/environment/environment_proxy.cpp", "common/event_dump.cpp", "common/event_manager.cpp", + "common/event_manager_pen.cpp", "common/focus_animation_manager.cpp", "common/font_loader.cpp", "common/font_manager.cpp", "common/frontend.cpp", - "common/pen_event_manager.cpp", "common/platform_bridge.cpp", "common/render_boundary_manager.cpp", "common/resource/resource_manager.cpp", @@ -701,11 +701,11 @@ template("ace_core_ng_source_set") { "common/environment/environment_proxy.cpp", "common/event_dump.cpp", "common/event_manager.cpp", + "common/event_manager_pen.cpp", "common/focus_animation_manager.cpp", "common/font_loader.cpp", "common/font_manager.cpp", "common/frontend.cpp", - "common/pen_event_manager.cpp", "common/platform_bridge.cpp", "common/render_boundary_manager.cpp", "common/resource/resource_manager.cpp", diff --git a/frameworks/core/animation/test/unittest/framework/BUILD.gn b/frameworks/core/animation/test/unittest/framework/BUILD.gn index 6e66a91284a..efbf3331aaa 100644 --- a/frameworks/core/animation/test/unittest/framework/BUILD.gn +++ b/frameworks/core/animation/test/unittest/framework/BUILD.gn @@ -50,11 +50,11 @@ ohos_unittest("AnimationTest") { "$ace_root/frameworks/core/common/container.cpp", "$ace_root/frameworks/core/common/container_scope.cpp", "$ace_root/frameworks/core/common/event_manager.cpp", + "$ace_root/frameworks/core/common/event_manager_pen.cpp", "$ace_root/frameworks/core/common/focus_animation_manager.cpp", "$ace_root/frameworks/core/common/font_loader.cpp", "$ace_root/frameworks/core/common/font_manager.cpp", "$ace_root/frameworks/core/common/frontend.cpp", - "$ace_root/frameworks/core/common/pen_event_manager.cpp", "$ace_root/frameworks/core/common/thread_checker.cpp", "$ace_root/frameworks/core/common/vibrator/vibrator_proxy.cpp", "$ace_root/frameworks/core/common/window.cpp", diff --git a/frameworks/core/animation/test/unittest/spring_chain/BUILD.gn b/frameworks/core/animation/test/unittest/spring_chain/BUILD.gn index 14e25a61538..5856d721ece 100644 --- a/frameworks/core/animation/test/unittest/spring_chain/BUILD.gn +++ b/frameworks/core/animation/test/unittest/spring_chain/BUILD.gn @@ -53,11 +53,11 @@ ohos_unittest("SpringChainTest") { "$ace_root/frameworks/core/common/container.cpp", "$ace_root/frameworks/core/common/container_scope.cpp", "$ace_root/frameworks/core/common/event_manager.cpp", + "$ace_root/frameworks/core/common/event_manager_pen.cpp", "$ace_root/frameworks/core/common/focus_animation_manager.cpp", "$ace_root/frameworks/core/common/font_loader.cpp", "$ace_root/frameworks/core/common/font_manager.cpp", "$ace_root/frameworks/core/common/frontend.cpp", - "$ace_root/frameworks/core/common/pen_event_manager.cpp", "$ace_root/frameworks/core/common/thread_checker.cpp", "$ace_root/frameworks/core/common/vibrator/vibrator_proxy.cpp", "$ace_root/frameworks/core/common/window.cpp", diff --git a/frameworks/core/animation/test/unittest/svg_animate/BUILD.gn b/frameworks/core/animation/test/unittest/svg_animate/BUILD.gn index cea78d5ac4f..3556ea797a8 100644 --- a/frameworks/core/animation/test/unittest/svg_animate/BUILD.gn +++ b/frameworks/core/animation/test/unittest/svg_animate/BUILD.gn @@ -52,11 +52,11 @@ ohos_unittest("SvgAnimateTest") { "$ace_root/frameworks/core/common/container.cpp", "$ace_root/frameworks/core/common/container_scope.cpp", "$ace_root/frameworks/core/common/event_manager.cpp", + "$ace_root/frameworks/core/common/event_manager_pen.cpp", "$ace_root/frameworks/core/common/focus_animation_manager.cpp", "$ace_root/frameworks/core/common/font_loader.cpp", "$ace_root/frameworks/core/common/font_manager.cpp", "$ace_root/frameworks/core/common/frontend.cpp", - "$ace_root/frameworks/core/common/pen_event_manager.cpp", "$ace_root/frameworks/core/common/thread_checker.cpp", "$ace_root/frameworks/core/common/vibrator/vibrator_proxy.cpp", "$ace_root/frameworks/core/common/window.cpp", diff --git a/frameworks/core/common/pen_event_manager.cpp b/frameworks/core/common/event_manager_pen.cpp similarity index 100% rename from frameworks/core/common/pen_event_manager.cpp rename to frameworks/core/common/event_manager_pen.cpp diff --git a/test/unittest/BUILD.gn b/test/unittest/BUILD.gn index b50850c750f..3f092c6468c 100644 --- a/test/unittest/BUILD.gn +++ b/test/unittest/BUILD.gn @@ -420,6 +420,7 @@ ohos_source_set("ace_core_extra") { "$ace_root/frameworks/core/common/container_scope.cpp", "$ace_root/frameworks/core/common/event_dump.cpp", "$ace_root/frameworks/core/common/event_manager.cpp", + "$ace_root/frameworks/core/common/event_manager_pen.cpp", "$ace_root/frameworks/core/common/ime/text_editing_value.cpp", "$ace_root/frameworks/core/common/ime/text_input_action.cpp", "$ace_root/frameworks/core/common/ime/text_input_client.cpp", @@ -428,7 +429,6 @@ ohos_source_set("ace_core_extra") { "$ace_root/frameworks/core/common/ime/text_input_formatter.cpp", "$ace_root/frameworks/core/common/ime/text_input_proxy.cpp", "$ace_root/frameworks/core/common/ime/text_input_type.cpp", - "$ace_root/frameworks/core/common/pen_event_manager.cpp", "$ace_root/frameworks/core/common/recorder/event_config.cpp", "$ace_root/frameworks/core/common/recorder/event_controller.cpp", "$ace_root/frameworks/core/common/recorder/event_recorder.cpp", -- Gitee