diff --git a/adapter/ohos/entrance/mmi_event_convertor.cpp b/adapter/ohos/entrance/mmi_event_convertor.cpp index 69506e7e9f7cbc3c5bb3a3d3e2bf3b60128c2fd3..99e810e6a3054cc6c9af0dbf55f0bd3d9f789969 100644 --- a/adapter/ohos/entrance/mmi_event_convertor.cpp +++ b/adapter/ohos/entrance/mmi_event_convertor.cpp @@ -308,12 +308,26 @@ void SetClonedPointerEvent(const MMI::PointerEvent* pointerEvent, ArkUITouchEven } } -void SetPostPointerEvent(const MMI::PointerEvent* pointerEvent, TouchEvent& touchEvent) +void SetPostPointerEvent(TouchEvent& touchEvent, ArkUITouchEvent* arkUITouchEventCloned) { + MMI::PointerEvent* pointerEvent = reinterpret_cast(arkUITouchEventCloned->rawPointerEvent); + if (pointerEvent) { + MMI::PointerEvent* clonedEvent = new MMI::PointerEvent(*pointerEvent); + arkUITouchEventCloned->rawPointerEvent = clonedEvent; + } std::shared_ptr pointer(pointerEvent); touchEvent.SetPointerEvent(pointer); } +void DestroyRawPointerEvent(ArkUITouchEvent* arkUITouchEvent) +{ + MMI::PointerEvent* pointerEvent = reinterpret_cast(arkUITouchEvent->rawPointerEvent); + if (pointerEvent) { + delete pointerEvent; + pointerEvent = nullptr; + } +} + TouchEvent ConvertTouchEvent(const std::shared_ptr& pointerEvent) { CHECK_NULL_RETURN(pointerEvent, TouchEvent()); diff --git a/adapter/ohos/entrance/mmi_event_convertor.h b/adapter/ohos/entrance/mmi_event_convertor.h index f0678b2ee2f6d5edf7a094becdcbc36f902b587b..23afd50e584ca4b9303b36381a4ca50b99a2326e 100644 --- a/adapter/ohos/entrance/mmi_event_convertor.h +++ b/adapter/ohos/entrance/mmi_event_convertor.h @@ -115,7 +115,9 @@ bool GetPointerEventToolType(const std::shared_ptr& pointerEv void SetClonedPointerEvent(const MMI::PointerEvent* pointerEvent, ArkUITouchEvent* arkUITouchEventCloned); -void SetPostPointerEvent(const MMI::PointerEvent* pointerEvent, TouchEvent& touchEvent); +void SetPostPointerEvent(TouchEvent& touchEvent, ArkUITouchEvent* arkUITouchEventCloned); + +void DestroyRawPointerEvent(ArkUITouchEvent* arkUITouchEvent); TouchType GetTouchTypeFromPointerEvent(const std::shared_ptr& pointerEvent); diff --git a/adapter/ohos/entrance/touch_event_convertor.cpp b/adapter/ohos/entrance/touch_event_convertor.cpp index d548a789a139a5a4588932fbb447a6fd39594c84..bd53405401b91523f41a82d9632b91e1311bfc20 100644 --- a/adapter/ohos/entrance/touch_event_convertor.cpp +++ b/adapter/ohos/entrance/touch_event_convertor.cpp @@ -42,9 +42,14 @@ void SetClonedPointerEvent(const MMI::PointerEvent* pointerEvent, ArkUITouchEven Platform::SetClonedPointerEvent(pointerEvent, arkUITouchEventCloned); } -void SetPostPointerEvent(const MMI::PointerEvent* pointerEvent, TouchEvent& touchEvent) +void SetPostPointerEvent(TouchEvent& touchEvent, ArkUITouchEvent* arkUITouchEventCloned) { - Platform::SetPostPointerEvent(pointerEvent, touchEvent); + Platform::SetPostPointerEvent(touchEvent, arkUITouchEventCloned); +} + +void DestroyRawPointerEvent(ArkUITouchEvent* arkUITouchEvent) +{ + Platform::DestroyRawPointerEvent(arkUITouchEvent); } TouchType GetTouchEventType(const std::shared_ptr& pointerEvent) diff --git a/adapter/preview/entrance/touch_event_convertor.cpp b/adapter/preview/entrance/touch_event_convertor.cpp index 0cd22bee3c5967673ffbf3572b491585562b35ed..6d1c67ab0e2bf6425565c3e135782fa46b037d7d 100644 --- a/adapter/preview/entrance/touch_event_convertor.cpp +++ b/adapter/preview/entrance/touch_event_convertor.cpp @@ -27,7 +27,9 @@ void ConvertToAxisEvent(AxisEvent& event, const std::shared_ptr& pointerEvent) { diff --git a/frameworks/core/interfaces/arkoala/arkoala_api.h b/frameworks/core/interfaces/arkoala/arkoala_api.h index 527b3a3e2072ff5f515567310e438fd99ff8a640..67485adab5ae1c364fff802b8caa7b424996e001 100644 --- a/frameworks/core/interfaces/arkoala/arkoala_api.h +++ b/frameworks/core/interfaces/arkoala/arkoala_api.h @@ -2786,6 +2786,7 @@ struct ArkUICommonModifier { void (*dispatchKeyEvent)(ArkUINodeHandle node, ArkUIKeyEvent* arkUIkeyEvent); ArkUI_Int32 (*postTouchEvent)(ArkUINodeHandle node, const ArkUITouchEvent* arkUItouchEvent); void (*createClonedTouchEvent)(ArkUITouchEvent* arkUITouchEventCloned, const ArkUITouchEvent* arkUITouchEvent); + void (*destroyTouchEvent)(ArkUITouchEvent* arkUITouchEvent); void (*resetEnableAnalyzer)(ArkUINodeHandle node); void (*setEnableAnalyzer)(ArkUINodeHandle node, ArkUI_Bool enable); void (*setNodeBackdropBlur)( diff --git a/frameworks/core/interfaces/native/node/node_common_modifier.cpp b/frameworks/core/interfaces/native/node/node_common_modifier.cpp index 34031aa39e88d970a768fd732f4a4ea5f750ac57..bd00e4162b091a6221585a1e97f97e04389dd088 100644 --- a/frameworks/core/interfaces/native/node/node_common_modifier.cpp +++ b/frameworks/core/interfaces/native/node/node_common_modifier.cpp @@ -8375,8 +8375,8 @@ ArkUI_Int32 PostTouchEvent(ArkUINodeHandle node, const ArkUITouchEvent* arkUITou touchEvent.globalDisplayX = arkUITouchEvent->actionTouchPoint.globalDisplayX * density; touchEvent.globalDisplayY = arkUITouchEvent->actionTouchPoint.globalDisplayY * density; touchEvent.originalId = arkUITouchEvent->actionTouchPoint.id; - MMI::PointerEvent* pointerEvent = reinterpret_cast(arkUITouchEvent->rawPointerEvent); - NG::SetPostPointerEvent(pointerEvent, touchEvent); + ArkUITouchEvent* arkUITouchEventCloned = const_cast(arkUITouchEvent); + NG::SetPostPointerEvent(touchEvent, arkUITouchEventCloned); return PostTouchEventToFrameNode(node, touchEvent); } @@ -8452,6 +8452,14 @@ void SetHistoryTouchEvent(ArkUITouchEvent* arkUITouchEventCloned, const ArkUITou } } +void DestroyTouchEvent(ArkUITouchEvent* arkUITouchEvent) +{ + CHECK_NULL_VOID(arkUITouchEvent); + NG::DestroyRawPointerEvent(arkUITouchEvent); + delete arkUITouchEvent; + arkUITouchEvent = nullptr; +} + void CreateClonedTouchEvent(ArkUITouchEvent* arkUITouchEventCloned, const ArkUITouchEvent* arkUITouchEvent) { if (!arkUITouchEventCloned || !arkUITouchEvent) { @@ -9251,6 +9259,7 @@ const ArkUICommonModifier* GetCommonModifier() .dispatchKeyEvent = DispatchKeyEvent, .postTouchEvent = PostTouchEvent, .createClonedTouchEvent = CreateClonedTouchEvent, + .destroyTouchEvent = DestroyTouchEvent, .resetEnableAnalyzer = nullptr, .setEnableAnalyzer = nullptr, .setNodeBackdropBlur = SetNodeBackdropBlur, diff --git a/frameworks/core/interfaces/native/node/touch_event_convertor.h b/frameworks/core/interfaces/native/node/touch_event_convertor.h index 2c8d24235ec5cc91110261da5e3784a5a230a497..ab0889156de5431103fef7292a498bcea8bb29ad 100644 --- a/frameworks/core/interfaces/native/node/touch_event_convertor.h +++ b/frameworks/core/interfaces/native/node/touch_event_convertor.h @@ -25,7 +25,8 @@ namespace OHOS::Ace::NG { void ConvertToMouseEvent(MouseEvent& event, const std::shared_ptr& srcPointerEvent); void ConvertToAxisEvent(AxisEvent& event, const std::shared_ptr& srcPointerEvent); void SetClonedPointerEvent(const MMI::PointerEvent* pointerEvent, ArkUITouchEvent* arkUITouchEventCloned); - void SetPostPointerEvent(const MMI::PointerEvent* pointerEvent, TouchEvent& touchEvent); + void SetPostPointerEvent(TouchEvent& touchEvent, ArkUITouchEvent* arkUITouchEventCloned); + void DestroyRawPointerEvent(ArkUITouchEvent* arkUITouchEvent); TouchType GetTouchEventType(const std::shared_ptr& pointerEvent); AxisAction GetAxisEventType(const std::shared_ptr& pointerEvent); MouseAction GetMouseEventType(const std::shared_ptr& pointerEvent); diff --git a/interfaces/native/event/ui_input_event.cpp b/interfaces/native/event/ui_input_event.cpp index da36eba663d3e4dea8be8959e2b61cc1fe32a924..873731830986ef843094dc283ec9902bca1bff7e 100644 --- a/interfaces/native/event/ui_input_event.cpp +++ b/interfaces/native/event/ui_input_event.cpp @@ -3676,8 +3676,8 @@ int32_t OH_ArkUI_PointerEvent_DestroyClonedEvent(const ArkUI_UIInputEvent* event } auto* touchEvent = reinterpret_cast(event->inputEvent); if (touchEvent) { - delete touchEvent; - touchEvent = nullptr; + auto fullImpl = OHOS::Ace::NodeModel::GetFullImpl(); + fullImpl->getNodeModifiers()->getCommonModifier()->destroyTouchEvent(touchEvent); } delete event; event = nullptr; @@ -3740,7 +3740,7 @@ int32_t OH_ArkUI_PointerEvent_SetClonedEventActionType(const ArkUI_UIInputEvent* if (!touchEvent) { RETURN_RET_WITH_STATUS_CHECK(OHOS::Ace::ERROR_CODE_PARAM_INVALID, ARKUI_ERROR_CODE_PARAM_INVALID); } - touchEvent->action = actionType; + touchEvent->action = OHOS::Ace::NodeModel::ConvertToOriginTouchActionType(actionType); RETURN_RET_WITH_STATUS_CHECK(OHOS::Ace::ERROR_CODE_NO_ERROR, ARKUI_ERROR_CODE_NO_ERROR); } diff --git a/interfaces/native/node/event_converter.cpp b/interfaces/native/node/event_converter.cpp index cf260969185dcd760f7267047c9fd7c234f817e6..9aa09fbacfb9f3674f9ff7fbdd052103b637ec02 100644 --- a/interfaces/native/node/event_converter.cpp +++ b/interfaces/native/node/event_converter.cpp @@ -784,6 +784,23 @@ int32_t ConvertToCTouchActionType(int32_t originActionType) return -1; } +int32_t ConvertToOriginTouchActionType(int32_t actionType) +{ + switch (actionType) { + case UI_TOUCH_EVENT_ACTION_DOWN: + return static_cast(ORIGIN_TOUCH_ACTION_DOWN); + case UI_TOUCH_EVENT_ACTION_UP: + return static_cast(ORIGIN_TOUCH_ACTION_UP); + case UI_TOUCH_EVENT_ACTION_MOVE: + return static_cast(ORIGIN_TOUCH_ACTION_MOVE); + case UI_TOUCH_EVENT_ACTION_CANCEL: + return static_cast(ORIGIN_TOUCH_ACTION_CANCEL); + default: + break; + } + return -1; +} + int32_t ConvertToCInputEventToolType(int32_t originSourceToolType) { switch (originSourceToolType) { diff --git a/interfaces/native/node/event_converter.h b/interfaces/native/node/event_converter.h index e3a85390bb9892ff5c872ba0a0aa0c475b3a1889..d9761a4f7ec1f7b29672712e23a1ce0f6c0cca7f 100644 --- a/interfaces/native/node/event_converter.h +++ b/interfaces/native/node/event_converter.h @@ -60,6 +60,7 @@ int32_t ConvertToCMouseActionType(int32_t originActionType); int32_t ConvertToCMouseEventButtonType(int32_t originButtonType); int32_t ConvertToCAxisActionType(int32_t originActionType); int32_t ConvertToCKeyActionType(int32_t originActionType); +int32_t ConvertToOriginTouchActionType(int32_t actionType); }; // namespace OHOS::Ace::NodeModel #endif // ARKUI_NATIVE_NODE_EVENT_CONVERTER_H