• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 
17 #include "node_model.h"
18 #include "gesture_impl.h"
19 
20 #include "core/gestures/gesture_event.h"
21 #include "interfaces/native/event/ui_input_event_impl.h"
22 
OH_ArkUI_GestureEvent_GetActionType(const ArkUI_GestureEvent * event)23 ArkUI_GestureEventActionType OH_ArkUI_GestureEvent_GetActionType(const ArkUI_GestureEvent* event)
24 {
25     ArkUI_GestureEventActionType ret;
26     switch (event->eventData.subKind) {
27         case ON_ACTION:
28         case ON_ACTION_START:
29             ret = GESTURE_EVENT_ACTION_ACCEPT;
30             break;
31         case ON_ACTION_UPDATE:
32             ret = GESTURE_EVENT_ACTION_UPDATE;
33             break;
34         case ON_ACTION_END:
35             ret = GESTURE_EVENT_ACTION_END;
36             break;
37         case ON_ACTION_CANCEL:
38             ret = GESTURE_EVENT_ACTION_CANCEL;
39             break;
40         default:
41             ret = GESTURE_EVENT_ACTION_ACCEPT;
42             break;
43     }
44     return ret;
45 }
46 
OH_ArkUI_GestureEvent_GetRawInputEvent(const ArkUI_GestureEvent * event)47 const ArkUI_UIInputEvent* OH_ArkUI_GestureEvent_GetRawInputEvent(const ArkUI_GestureEvent* event)
48 {
49     if (!event) {
50         return nullptr;
51     }
52     return reinterpret_cast<ArkUI_UIInputEvent*>(event->eventData.rawPointerEvent);
53 }
54 
OH_ArkUI_LongPress_GetRepeatCount(const ArkUI_GestureEvent * event)55 int32_t OH_ArkUI_LongPress_GetRepeatCount(const ArkUI_GestureEvent* event)
56 {
57     return event->eventData.repeat;
58 }
59 
OH_ArkUI_PanGesture_GetVelocity(const ArkUI_GestureEvent * event)60 float OH_ArkUI_PanGesture_GetVelocity(const ArkUI_GestureEvent* event)
61 {
62     return event->eventData.velocity;
63 }
64 
OH_ArkUI_PanGesture_GetVelocityX(const ArkUI_GestureEvent * event)65 float OH_ArkUI_PanGesture_GetVelocityX(const ArkUI_GestureEvent* event)
66 {
67     return event->eventData.velocityX;
68 }
69 
OH_ArkUI_PanGesture_GetVelocityY(const ArkUI_GestureEvent * event)70 float OH_ArkUI_PanGesture_GetVelocityY(const ArkUI_GestureEvent* event)
71 {
72     return event->eventData.velocityY;
73 }
74 
OH_ArkUI_PanGesture_GetOffsetX(const ArkUI_GestureEvent * event)75 float OH_ArkUI_PanGesture_GetOffsetX(const ArkUI_GestureEvent* event)
76 {
77     return event->eventData.x;
78 }
79 
OH_ArkUI_PanGesture_GetOffsetY(const ArkUI_GestureEvent * event)80 float OH_ArkUI_PanGesture_GetOffsetY(const ArkUI_GestureEvent* event)
81 {
82     return event->eventData.y;
83 }
84 
OH_ArkUI_SwipeGesture_GetAngle(const ArkUI_GestureEvent * event)85 float OH_ArkUI_SwipeGesture_GetAngle(const ArkUI_GestureEvent* event)
86 {
87     return event->eventData.angle;
88 }
89 
OH_ArkUI_SwipeGesture_GetVelocity(const ArkUI_GestureEvent * event)90 float OH_ArkUI_SwipeGesture_GetVelocity(const ArkUI_GestureEvent* event)
91 {
92     return event->eventData.speed;
93 }
94 
OH_ArkUI_RotationGesture_GetAngle(const ArkUI_GestureEvent * event)95 float OH_ArkUI_RotationGesture_GetAngle(const ArkUI_GestureEvent* event)
96 {
97     return event->eventData.angle;
98 }
99 
OH_ArkUI_PinchGesture_GetScale(const ArkUI_GestureEvent * event)100 float OH_ArkUI_PinchGesture_GetScale(const ArkUI_GestureEvent* event)
101 {
102     return event->eventData.scale;
103 }
104 
OH_ArkUI_PinchGesture_GetCenterX(const ArkUI_GestureEvent * event)105 float OH_ArkUI_PinchGesture_GetCenterX(const ArkUI_GestureEvent* event)
106 {
107     return event->eventData.pinchCenterX;
108 }
109 
OH_ArkUI_PinchGesture_GetCenterY(const ArkUI_GestureEvent * event)110 float OH_ArkUI_PinchGesture_GetCenterY(const ArkUI_GestureEvent* event)
111 {
112     return event->eventData.pinchCenterY;
113 }
114 
OH_ArkUI_GestureEvent_GetNode(const ArkUI_GestureEvent * event)115 ArkUI_NodeHandle OH_ArkUI_GestureEvent_GetNode(const ArkUI_GestureEvent* event)
116 {
117     if (!event) {
118         return nullptr;
119     }
120     return reinterpret_cast<ArkUI_NodeHandle>(event->attachNode);
121 }
122 
OH_ArkUI_GestureInterruptInfo_GetSystemFlag(const ArkUI_GestureInterruptInfo * event)123 bool OH_ArkUI_GestureInterruptInfo_GetSystemFlag(const ArkUI_GestureInterruptInfo* event)
124 {
125     return event->interruptData.isSystemGesture;
126 }
127 
OH_ArkUI_GestureInterruptInfo_GetRecognizer(const ArkUI_GestureInterruptInfo * event)128 ArkUI_GestureRecognizer* OH_ArkUI_GestureInterruptInfo_GetRecognizer(const ArkUI_GestureInterruptInfo* event)
129 {
130     return reinterpret_cast<ArkUI_GestureRecognizer *>(event->interruptData.userData);
131 }
132 
OH_ArkUI_GestureInterruptInfo_GetGestureEvent(const ArkUI_GestureInterruptInfo * event)133 ArkUI_GestureEvent* OH_ArkUI_GestureInterruptInfo_GetGestureEvent(const ArkUI_GestureInterruptInfo* event)
134 {
135     CHECK_NULL_RETURN(event, nullptr);
136     ArkUI_GestureEvent* gestureEvent = reinterpret_cast<ArkUI_GestureEvent*>(event->interruptData.gestureEvent);
137     CHECK_NULL_RETURN(gestureEvent, nullptr);
138 
139     ArkUI_UIInputEvent* uiEvent = reinterpret_cast<ArkUI_UIInputEvent*>(event->interruptData.inputEvent);
140     gestureEvent->eventData.rawPointerEvent = uiEvent;
141 
142     auto* gestureRecognizer = reinterpret_cast<ArkUI_GestureRecognizer*>(event->interruptData.userData);
143     CHECK_NULL_RETURN(gestureRecognizer, nullptr);
144     gestureEvent->attachNode = gestureRecognizer->attachNode;
145     return gestureEvent;
146 }
147 
OH_ArkUI_GestureInterruptInfo_GetSystemRecognizerType(const ArkUI_GestureInterruptInfo * event)148 int32_t OH_ArkUI_GestureInterruptInfo_GetSystemRecognizerType(const ArkUI_GestureInterruptInfo* event)
149 {
150     if (event->interruptData.isSystemGesture) {
151         return event->interruptData.systemRecognizerType;
152     }
153     return -1;
154 }
155 
OH_ArkUI_GestureInterruptInfo_GetTouchRecognizers(const ArkUI_GestureInterruptInfo * info,ArkUI_TouchRecognizerHandleArray * recognizers,int32_t * size)156 int32_t OH_ArkUI_GestureInterruptInfo_GetTouchRecognizers(
157     const ArkUI_GestureInterruptInfo* info, ArkUI_TouchRecognizerHandleArray* recognizers, int32_t* size)
158 {
159     CHECK_NULL_RETURN(info, ARKUI_ERROR_CODE_PARAM_INVALID);
160     CHECK_NULL_RETURN(recognizers, ARKUI_ERROR_CODE_PARAM_INVALID);
161     CHECK_NULL_RETURN(size, ARKUI_ERROR_CODE_PARAM_INVALID);
162     *recognizers = reinterpret_cast<ArkUI_TouchRecognizerHandleArray>(info->interruptData.touchRecognizers);
163     *size = info->interruptData.touchRecognizerCnt;
164     return ARKUI_ERROR_CODE_NO_ERROR;
165 }
166 
OH_ArkUI_TouchRecognizer_GetNodeHandle(const ArkUI_TouchRecognizerHandle recognizer)167 ArkUI_NodeHandle OH_ArkUI_TouchRecognizer_GetNodeHandle(const ArkUI_TouchRecognizerHandle recognizer)
168 {
169     CHECK_NULL_RETURN(recognizer, nullptr);
170     auto node =
171         OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->touchRecognizerGetNodeHandle(
172             static_cast<void*>(recognizer));
173 
174     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
175     ArkUI_Node* arkUINode = new ArkUI_Node({ -1, node, false });
176     impl->getExtendedAPI()->setAttachNodePtr((arkUINode)->uiNodeHandle, reinterpret_cast<void*>(arkUINode));
177     return reinterpret_cast<ArkUI_NodeHandle>(arkUINode);
178 }
179 
OH_ArkUI_TouchRecognizer_CancelTouch(ArkUI_TouchRecognizerHandle recognizer,ArkUI_GestureInterruptInfo * info)180 int32_t OH_ArkUI_TouchRecognizer_CancelTouch(ArkUI_TouchRecognizerHandle recognizer, ArkUI_GestureInterruptInfo* info)
181 {
182     CHECK_NULL_RETURN(recognizer, ARKUI_ERROR_CODE_PARAM_INVALID);
183     CHECK_NULL_RETURN(info, ARKUI_ERROR_CODE_PARAM_INVALID);
184     bool ret =
185         OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->touchRecognizerCancelTouch(
186             static_cast<void*>(recognizer));
187     return ret ? ARKUI_ERROR_CODE_NO_ERROR : ARKUI_ERROR_CODE_PARAM_INVALID;
188 }
189 
OH_ArkUI_GetResponseRecognizersFromInterruptInfo(const ArkUI_GestureInterruptInfo * event,ArkUI_GestureRecognizerHandleArray * responseChain,int32_t * count)190 int32_t OH_ArkUI_GetResponseRecognizersFromInterruptInfo(
191     const ArkUI_GestureInterruptInfo* event, ArkUI_GestureRecognizerHandleArray* responseChain, int32_t* count)
192 {
193     CHECK_NULL_RETURN(responseChain, ARKUI_ERROR_CODE_PARAM_INVALID);
194     CHECK_NULL_RETURN(count, ARKUI_ERROR_CODE_PARAM_INVALID);
195     *responseChain = reinterpret_cast<ArkUI_GestureRecognizer**>(event->interruptData.responseLinkRecognizer);
196     *count = event->interruptData.count;
197     return 0;
198 }
199 
OH_ArkUI_SetGestureRecognizerEnabled(ArkUI_GestureRecognizer * recognizer,bool enabled)200 int32_t OH_ArkUI_SetGestureRecognizerEnabled(ArkUI_GestureRecognizer* recognizer, bool enabled)
201 {
202     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
203     if (!gestureRecognizer) {
204         return ARKUI_ERROR_CODE_PARAM_INVALID;
205     }
206     return OHOS::Ace::NodeModel::GetFullImpl()
207         ->getNodeModifiers()
208         ->getGestureModifier()
209         ->setGestureRecognizerEnabled(gestureRecognizer, enabled);
210 }
211 
OH_ArkUI_SetGestureRecognizerLimitFingerCount(ArkUI_GestureRecognizer * recognizer,bool limitFingerCount)212 int32_t OH_ArkUI_SetGestureRecognizerLimitFingerCount(ArkUI_GestureRecognizer* recognizer, bool limitFingerCount)
213 {
214     auto* gesture = reinterpret_cast<ArkUIGesture*>(recognizer->gesture);
215     if (!gesture) {
216         return ARKUI_ERROR_CODE_PARAM_INVALID;
217     }
218     return OHOS::Ace::NodeModel::GetFullImpl()
219         ->getNodeModifiers()
220         ->getGestureModifier()
221         ->setGestureRecognizerLimitFingerCount(gesture, limitFingerCount);
222 }
223 
OH_ArkUI_GetGestureRecognizerEnabled(ArkUI_GestureRecognizer * recognizer)224 bool OH_ArkUI_GetGestureRecognizerEnabled(ArkUI_GestureRecognizer* recognizer)
225 {
226     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
227     if (!gestureRecognizer) {
228         return false;
229     }
230     return OHOS::Ace::NodeModel::GetFullImpl()
231         ->getNodeModifiers()
232         ->getGestureModifier()
233         ->getGestureRecognizerEnabled(gestureRecognizer);
234 }
235 
OH_ArkUI_GetGestureRecognizerState(ArkUI_GestureRecognizer * recognizer,ArkUI_GestureRecognizerState * state)236 int32_t OH_ArkUI_GetGestureRecognizerState(ArkUI_GestureRecognizer* recognizer, ArkUI_GestureRecognizerState* state)
237 {
238     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
239     if (!gestureRecognizer) {
240         return ARKUI_ERROR_CODE_PARAM_INVALID;
241     }
242     ArkUIGestureRecognizerState recognizerState;
243     auto result =
244         OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getGestureRecognizerState(
245             gestureRecognizer, &recognizerState);
246     *state = static_cast<ArkUI_GestureRecognizerState>(recognizerState);
247     return result;
248 }
249 
OH_ArkUI_GetGestureEventTargetInfo(ArkUI_GestureRecognizer * recognizer,ArkUI_GestureEventTargetInfo ** info)250 int32_t OH_ArkUI_GetGestureEventTargetInfo(ArkUI_GestureRecognizer* recognizer, ArkUI_GestureEventTargetInfo** info)
251 {
252     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
253     if (!gestureRecognizer) {
254         return ARKUI_ERROR_CODE_PARAM_INVALID;
255     }
256     *info = reinterpret_cast<ArkUI_GestureEventTargetInfo*>(&gestureRecognizer->targetInfo);
257     return 0;
258 }
259 
OH_ArkUI_GestureEventTargetInfo_IsScrollBegin(ArkUI_GestureEventTargetInfo * info,bool * ret)260 int32_t OH_ArkUI_GestureEventTargetInfo_IsScrollBegin(ArkUI_GestureEventTargetInfo* info, bool* ret)
261 {
262     auto* targetInfo = reinterpret_cast<ArkUIGestureEventTargetInfo*>(info);
263     if (!targetInfo) {
264         return ARKUI_ERROR_CODE_PARAM_INVALID;
265     }
266     return OHOS::Ace::NodeModel::GetFullImpl()
267         ->getNodeModifiers()
268         ->getGestureModifier()
269         ->gestureEventTargetInfoIsScrollBegin(targetInfo, ret);
270 }
271 
OH_ArkUI_GestureEventTargetInfo_IsScrollEnd(ArkUI_GestureEventTargetInfo * info,bool * ret)272 int32_t OH_ArkUI_GestureEventTargetInfo_IsScrollEnd(ArkUI_GestureEventTargetInfo* info, bool* ret)
273 {
274     auto* targetInfo = reinterpret_cast<ArkUIGestureEventTargetInfo*>(info);
275     if (!targetInfo) {
276         return ARKUI_ERROR_CODE_PARAM_INVALID;
277     }
278     return OHOS::Ace::NodeModel::GetFullImpl()
279         ->getNodeModifiers()
280         ->getGestureModifier()
281         ->gestureEventTargetInfoIsScrollEnd(targetInfo, ret);
282 }
283 
OH_ArkUI_GetPanGestureDirectionMask(ArkUI_GestureRecognizer * recognizer,ArkUI_GestureDirectionMask * directionMask)284 int32_t OH_ArkUI_GetPanGestureDirectionMask(
285     ArkUI_GestureRecognizer* recognizer, ArkUI_GestureDirectionMask* directionMask)
286 {
287     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
288     if (!gestureRecognizer) {
289         return ARKUI_ERROR_CODE_PARAM_INVALID;
290     }
291     ArkUIGestureDirection direction = ArkUIGestureDirection::ArkUI_GESTURE_DIRECTION_ALL;
292     auto result =
293         OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getPanGestureDirectionMask(
294             gestureRecognizer, &direction);
295     *directionMask = static_cast<ArkUI_GestureDirectionMask>(direction);
296     return result;
297 }
298 
OH_ArkUI_IsBuiltInGesture(ArkUI_GestureRecognizer * recognizer)299 bool OH_ArkUI_IsBuiltInGesture(ArkUI_GestureRecognizer* recognizer)
300 {
301     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
302     if (!gestureRecognizer) {
303         return false;
304     }
305     return OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->isBuiltInGesture(
306         gestureRecognizer);
307 }
308 
OH_ArkUI_GetGestureTag(ArkUI_GestureRecognizer * recognizer,char * buffer,int32_t bufferSize,int32_t * result)309 int32_t OH_ArkUI_GetGestureTag(ArkUI_GestureRecognizer* recognizer, char* buffer, int32_t bufferSize, int32_t* result)
310 {
311     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
312     if (!gestureRecognizer) {
313         return ARKUI_ERROR_CODE_PARAM_INVALID;
314     }
315     return OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getGestureTag(
316         gestureRecognizer, buffer, bufferSize, result);
317 }
318 
OH_ArkUI_GetGestureBindNodeId(ArkUI_GestureRecognizer * recognizer,char * nodeId,int32_t size,int32_t * result)319 int32_t OH_ArkUI_GetGestureBindNodeId(ArkUI_GestureRecognizer* recognizer, char* nodeId, int32_t size, int32_t* result)
320 {
321     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
322     if (!gestureRecognizer) {
323         return ARKUI_ERROR_CODE_PARAM_INVALID;
324     }
325     return OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getGestureBindNodeId(
326         gestureRecognizer, nodeId, size, result);
327 }
328 
OH_ArkUI_IsGestureRecognizerValid(ArkUI_GestureRecognizer * recognizer)329 bool OH_ArkUI_IsGestureRecognizerValid(ArkUI_GestureRecognizer* recognizer)
330 {
331     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
332     if (!gestureRecognizer) {
333         return false;
334     }
335     return OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->isGestureRecognizerValid(
336         gestureRecognizer);
337 }
338 
OH_ArkUI_ParallelInnerGestureEvent_GetUserData(ArkUI_ParallelInnerGestureEvent * event)339 void* OH_ArkUI_ParallelInnerGestureEvent_GetUserData(ArkUI_ParallelInnerGestureEvent* event)
340 {
341     return event->userData;
342 }
343 
OH_ArkUI_GestureInterrupter_GetUserData(ArkUI_GestureInterruptInfo * event)344 void* OH_ArkUI_GestureInterrupter_GetUserData(ArkUI_GestureInterruptInfo* event)
345 {
346     if (!event) {
347         return nullptr;
348     }
349     return event->interruptData.customUserData;
350 }
351 
OH_ArkUI_ParallelInnerGestureEvent_GetCurrentRecognizer(ArkUI_ParallelInnerGestureEvent * event)352 ArkUI_GestureRecognizer* OH_ArkUI_ParallelInnerGestureEvent_GetCurrentRecognizer(ArkUI_ParallelInnerGestureEvent* event)
353 {
354     return reinterpret_cast<ArkUI_GestureRecognizer*>(event->current);
355 }
356 
OH_ArkUI_ParallelInnerGestureEvent_GetConflictRecognizers(ArkUI_ParallelInnerGestureEvent * event,ArkUI_GestureRecognizerHandleArray * array,int32_t * size)357 int32_t OH_ArkUI_ParallelInnerGestureEvent_GetConflictRecognizers(
358     ArkUI_ParallelInnerGestureEvent* event, ArkUI_GestureRecognizerHandleArray* array, int32_t* size)
359 {
360     CHECK_NULL_RETURN(array, ARKUI_ERROR_CODE_PARAM_INVALID);
361     CHECK_NULL_RETURN(size, ARKUI_ERROR_CODE_PARAM_INVALID);
362     *array = reinterpret_cast<ArkUI_GestureRecognizer**>(event->responseLinkRecognizer);
363     *size = event->count;
364     return 0;
365 }
366 
OH_ArkUI_SetArkUIGestureRecognizerDisposeNotify(ArkUI_GestureRecognizer * recognizer,ArkUI_GestureRecognizerDisposeNotifyCallback callback,void * userData)367 int32_t OH_ArkUI_SetArkUIGestureRecognizerDisposeNotify(
368     ArkUI_GestureRecognizer* recognizer, ArkUI_GestureRecognizerDisposeNotifyCallback callback, void* userData)
369 {
370     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
371     if (!gestureRecognizer || gestureRecognizer->capi) {
372         return ARKUI_ERROR_CODE_PARAM_INVALID;
373     }
374     auto disposeCallback = reinterpret_cast<void (*)(ArkUIGestureRecognizer * recognizer, void* userData)>(callback);
375     OHOS::Ace::NodeModel::GetFullImpl()
376         ->getNodeModifiers()
377         ->getGestureModifier()
378         ->setArkUIGestureRecognizerDisposeNotify(gestureRecognizer, userData, disposeCallback);
379     return 0;
380 }
381 
OH_ArkUI_GetGestureParam_DirectMask(ArkUI_GestureRecognizer * recognizer,ArkUI_GestureDirectionMask * directMask)382 int32_t OH_ArkUI_GetGestureParam_DirectMask(ArkUI_GestureRecognizer* recognizer, ArkUI_GestureDirectionMask* directMask)
383 {
384     if (!recognizer || !directMask) {
385         return ARKUI_ERROR_CODE_PARAM_INVALID;
386     }
387     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
388     if (!gestureRecognizer) {
389         return ARKUI_ERROR_CODE_PARAM_INVALID;
390     }
391     switch (recognizer->type) {
392         case SWIPE_GESTURE: {
393             ArkUIGestureDirection direction = ArkUIGestureDirection::ArkUI_GESTURE_DIRECTION_ALL;
394             auto result = OHOS::Ace::NodeModel::GetFullImpl()
395                               ->getNodeModifiers()
396                               ->getGestureModifier()
397                               ->getSwipeGestureDirectionMask(gestureRecognizer, &direction);
398             *directMask = static_cast<ArkUI_GestureDirectionMask>(direction);
399             return result;
400         }
401         case PAN_GESTURE: {
402             ArkUIGestureDirection direction = ArkUIGestureDirection::ArkUI_GESTURE_DIRECTION_ALL;
403             auto result = OHOS::Ace::NodeModel::GetFullImpl()
404                               ->getNodeModifiers()
405                               ->getGestureModifier()
406                               ->getPanGestureDirectionMask(gestureRecognizer, &direction);
407             *directMask = static_cast<ArkUI_GestureDirectionMask>(direction);
408             return result;
409         }
410         default:
411             break;
412     }
413     return ARKUI_ERROR_CODE_PARAM_INVALID;
414 }
415 
OH_ArkUI_GetGestureParam_FingerCount(ArkUI_GestureRecognizer * recognizer,int * finger)416 int32_t OH_ArkUI_GetGestureParam_FingerCount(ArkUI_GestureRecognizer* recognizer, int* finger)
417 {
418     if (!recognizer || !finger) {
419         return ARKUI_ERROR_CODE_PARAM_INVALID;
420     }
421     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
422     if (!gestureRecognizer) {
423         return ARKUI_ERROR_CODE_PARAM_INVALID;
424     }
425     switch (recognizer->type) {
426         case TAP_GESTURE:
427         case LONG_PRESS_GESTURE:
428         case PINCH_GESTURE:
429         case ROTATION_GESTURE:
430         case SWIPE_GESTURE:
431         case PAN_GESTURE: {
432             auto result =
433                 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getGestureFingerCount(
434                     gestureRecognizer, finger);
435             return result;
436         }
437         default:
438             break;
439     }
440     return ARKUI_ERROR_CODE_PARAM_INVALID;
441 }
442 
OH_ArkUI_GetGestureParam_limitFingerCount(ArkUI_GestureRecognizer * recognizer,bool * isLimited)443 int32_t OH_ArkUI_GetGestureParam_limitFingerCount(ArkUI_GestureRecognizer* recognizer, bool* isLimited)
444 {
445     if (!recognizer || !isLimited) {
446         return ARKUI_ERROR_CODE_PARAM_INVALID;
447     }
448     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
449     if (!gestureRecognizer) {
450         return ARKUI_ERROR_CODE_PARAM_INVALID;
451     }
452     switch (recognizer->type) {
453         case TAP_GESTURE:
454         case LONG_PRESS_GESTURE:
455         case PINCH_GESTURE:
456         case ROTATION_GESTURE:
457         case SWIPE_GESTURE:
458         case PAN_GESTURE: {
459             auto result = OHOS::Ace::NodeModel::GetFullImpl()
460                               ->getNodeModifiers()
461                               ->getGestureModifier()
462                               ->getGestureLimitFingerCount(gestureRecognizer, isLimited);
463             return result;
464         }
465         default:
466             break;
467     }
468     return ARKUI_ERROR_CODE_PARAM_INVALID;
469 }
470 
OH_ArkUI_GetGestureParam_repeat(ArkUI_GestureRecognizer * recognizer,bool * isRepeat)471 int32_t OH_ArkUI_GetGestureParam_repeat(ArkUI_GestureRecognizer* recognizer, bool* isRepeat)
472 {
473     if (!recognizer || !isRepeat) {
474         return ARKUI_ERROR_CODE_PARAM_INVALID;
475     }
476     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
477     if (!gestureRecognizer) {
478         return ARKUI_ERROR_CODE_PARAM_INVALID;
479     }
480     switch (recognizer->type) {
481         case LONG_PRESS_GESTURE: {
482             auto result = OHOS::Ace::NodeModel::GetFullImpl()
483                               ->getNodeModifiers()
484                               ->getGestureModifier()
485                               ->getLongPressGestureRepeat(gestureRecognizer, isRepeat);
486             return result;
487         }
488         default:
489             break;
490     }
491     return ARKUI_ERROR_CODE_RECOGNIZER_TYPE_NOT_SUPPORTED;
492 }
493 
OH_ArkUI_GetGestureParam_distance(ArkUI_GestureRecognizer * recognizer,double * distance)494 int32_t OH_ArkUI_GetGestureParam_distance(ArkUI_GestureRecognizer* recognizer, double* distance)
495 {
496     if (!recognizer || !distance) {
497         return ARKUI_ERROR_CODE_PARAM_INVALID;
498     }
499     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
500     if (!gestureRecognizer) {
501         return ARKUI_ERROR_CODE_PARAM_INVALID;
502     }
503     switch (recognizer->type) {
504         case PINCH_GESTURE: {
505             auto result =
506                 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getPinchGestureDistance(
507                     gestureRecognizer, distance);
508             return result;
509         }
510         case PAN_GESTURE: {
511             auto result =
512                 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getPanGestureDistance(
513                     gestureRecognizer, distance);
514             return result;
515         }
516         default:
517             break;
518     }
519     return ARKUI_ERROR_CODE_RECOGNIZER_TYPE_NOT_SUPPORTED;
520 }
521 
OH_ArkUI_GetGestureParam_speed(ArkUI_GestureRecognizer * recognizer,double * speed)522 int32_t OH_ArkUI_GetGestureParam_speed(ArkUI_GestureRecognizer* recognizer, double* speed)
523 {
524     if (!recognizer || !speed) {
525         return ARKUI_ERROR_CODE_PARAM_INVALID;
526     }
527     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
528     if (!gestureRecognizer) {
529         return ARKUI_ERROR_CODE_PARAM_INVALID;
530     }
531     switch (recognizer->type) {
532         case SWIPE_GESTURE: {
533             auto result =
534                 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getSwipeGestureSpeed(
535                     gestureRecognizer, speed);
536             return result;
537         }
538         default:
539             break;
540     }
541     return ARKUI_ERROR_CODE_RECOGNIZER_TYPE_NOT_SUPPORTED;
542 }
543 
OH_ArkUI_GetGestureParam_duration(ArkUI_GestureRecognizer * recognizer,int * duration)544 int32_t OH_ArkUI_GetGestureParam_duration(ArkUI_GestureRecognizer* recognizer, int* duration)
545 {
546     if (!recognizer || !duration) {
547         return ARKUI_ERROR_CODE_PARAM_INVALID;
548     }
549     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
550     if (!gestureRecognizer) {
551         return ARKUI_ERROR_CODE_PARAM_INVALID;
552     }
553     switch (recognizer->type) {
554         case LONG_PRESS_GESTURE: {
555             auto result = OHOS::Ace::NodeModel::GetFullImpl()
556                               ->getNodeModifiers()
557                               ->getGestureModifier()
558                               ->getLongPressGestureDuration(gestureRecognizer, duration);
559             return result;
560         }
561         default:
562             break;
563     }
564     return ARKUI_ERROR_CODE_RECOGNIZER_TYPE_NOT_SUPPORTED;
565 }
566 
OH_ArkUI_GetGestureParam_angle(ArkUI_GestureRecognizer * recognizer,double * angle)567 int32_t OH_ArkUI_GetGestureParam_angle(ArkUI_GestureRecognizer* recognizer, double* angle)
568 {
569     if (!recognizer || !angle) {
570         return ARKUI_ERROR_CODE_PARAM_INVALID;
571     }
572     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
573     if (!gestureRecognizer) {
574         return ARKUI_ERROR_CODE_PARAM_INVALID;
575     }
576     switch (recognizer->type) {
577         case ROTATION_GESTURE: {
578             auto result =
579                 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getRotationGestureAngle(
580                     gestureRecognizer, angle);
581             return result;
582         }
583         default:
584             break;
585     }
586     return ARKUI_ERROR_CODE_RECOGNIZER_TYPE_NOT_SUPPORTED;
587 }
588 
OH_ArkUI_GetGestureParam_distanceThreshold(ArkUI_GestureRecognizer * recognizer,double * distanceThreshold)589 int32_t OH_ArkUI_GetGestureParam_distanceThreshold(ArkUI_GestureRecognizer* recognizer, double* distanceThreshold)
590 {
591     if (!recognizer || !distanceThreshold) {
592         return ARKUI_ERROR_CODE_PARAM_INVALID;
593     }
594     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
595     if (!gestureRecognizer) {
596         return ARKUI_ERROR_CODE_PARAM_INVALID;
597     }
598     switch (recognizer->type) {
599         case TAP_GESTURE: {
600             auto result = OHOS::Ace::NodeModel::GetFullImpl()
601                               ->getNodeModifiers()
602                               ->getGestureModifier()
603                               ->getTapGestureDistanceThreshold(gestureRecognizer, distanceThreshold);
604             return result;
605         }
606         default:
607             break;
608     }
609     return ARKUI_ERROR_CODE_RECOGNIZER_TYPE_NOT_SUPPORTED;
610 }
611 
OH_ArkUI_PanGesture_SetDistanceMap(ArkUI_GestureRecognizer * recognizer,int size,int * toolTypeArray,double * distanceArray)612 ArkUI_ErrorCode OH_ArkUI_PanGesture_SetDistanceMap(
613     ArkUI_GestureRecognizer* recognizer, int size, int* toolTypeArray, double* distanceArray)
614 {
615     if (!recognizer || !toolTypeArray || !distanceArray) {
616         return ARKUI_ERROR_CODE_PARAM_INVALID;
617     }
618     auto* gesture = reinterpret_cast<ArkUIGesture*>(recognizer->gesture);
619     if (!gesture) {
620         return ARKUI_ERROR_CODE_PARAM_INVALID;
621     }
622     if (recognizer->type == PAN_GESTURE) {
623         auto result = OHOS::Ace::NodeModel::GetFullImpl()
624                           ->getNodeModifiers()
625                           ->getGestureModifier()
626                           ->setDistanceMap(gesture, size, toolTypeArray, distanceArray);
627         return static_cast<ArkUI_ErrorCode>(result);
628     }
629     return ARKUI_ERROR_CODE_RECOGNIZER_TYPE_NOT_SUPPORTED;
630 }
631 
OH_ArkUI_PreventGestureRecognizerBegin(ArkUI_GestureRecognizer * recognizer)632 ArkUI_ErrorCode OH_ArkUI_PreventGestureRecognizerBegin(ArkUI_GestureRecognizer* recognizer)
633 {
634     if (!recognizer) {
635         return ARKUI_ERROR_CODE_PARAM_INVALID;
636     }
637 
638     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
639     if (!gestureRecognizer) {
640         return ARKUI_ERROR_CODE_PARAM_INVALID;
641     }
642     auto result = OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->setPreventBegin(
643         gestureRecognizer);
644     return static_cast<ArkUI_ErrorCode>(result);
645 }
646 
OH_ArkUI_SetTouchTestDoneCallback(ArkUI_NodeHandle node,void * userData,void (* touchTestDone)(ArkUI_GestureEvent * event,ArkUI_GestureRecognizerHandleArray recognizers,int32_t count,void * userData))647 ArkUI_ErrorCode OH_ArkUI_SetTouchTestDoneCallback(ArkUI_NodeHandle node, void* userData,
648     void (*touchTestDone)(
649         ArkUI_GestureEvent* event, ArkUI_GestureRecognizerHandleArray recognizers, int32_t count, void* userData))
650 {
651     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
652     if (!impl || !node) {
653         return ARKUI_ERROR_CODE_PARAM_INVALID;
654     }
655     auto callback = reinterpret_cast<void (*)(ArkUIGestureEvent* event, ArkUIGestureRecognizerHandleArray recognizers,
656         int32_t count, void* userData)>(touchTestDone);
657     auto result = impl->getNodeModifiers()->getCommonModifier()->setOnTouchTestDoneCallback(
658         node->uiNodeHandle, userData, callback);
659     return static_cast<ArkUI_ErrorCode>(result);
660 }
661 
OH_ArkUI_PanGesture_GetDistanceByToolType(ArkUI_GestureRecognizer * recognizer,int toolType,double * distance)662 ArkUI_ErrorCode OH_ArkUI_PanGesture_GetDistanceByToolType(
663     ArkUI_GestureRecognizer* recognizer, int toolType, double* distance)
664 {
665     if (!recognizer || !distance) {
666         return ARKUI_ERROR_CODE_PARAM_INVALID;
667     }
668     auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
669     if (!gestureRecognizer) {
670         return ARKUI_ERROR_CODE_PARAM_INVALID;
671     }
672     if (recognizer->type == PAN_GESTURE) {
673         auto result = OHOS::Ace::NodeModel::GetFullImpl()
674                             ->getNodeModifiers()
675                             ->getGestureModifier()
676                             ->getDistanceByToolType(gestureRecognizer, toolType, distance);
677         return static_cast<ArkUI_ErrorCode>(result);
678     }
679     return ARKUI_ERROR_CODE_RECOGNIZER_TYPE_NOT_SUPPORTED;
680 }
681 
682 namespace OHOS::Ace::GestureModel {
683 
684 constexpr int32_t DEFAULT_PAN_FINGERS = 1;
685 constexpr int32_t MAX_PAN_FINGERS = 10;
686 constexpr double DEFAULT_PINCH_DISTANCE = 5.0f;
687 constexpr double DEFAULT_SWIPE_SPEED = 100.0f;
688 constexpr int32_t DEFAULT_TAP_COUNT = 1;
689 constexpr int32_t DEFAULT_TAP_FINGERS = 1;
690 constexpr int32_t MAX_TAP_FINGERS = 10;
691 
692 struct GestureInnerData {
693     void (*targetReceiver)(ArkUI_GestureEvent* event, void* extraParam);
694     void* extraParam;
695     void* gesture;
696 };
697 
CreateTapGesture(int32_t count,int32_t fingers)698 ArkUI_GestureRecognizer* CreateTapGesture(int32_t count, int32_t fingers)
699 {
700     count = std::max(count, DEFAULT_TAP_COUNT);
701     fingers = std::clamp(fingers, DEFAULT_TAP_FINGERS, MAX_TAP_FINGERS);
702     auto* ndkGesture = new ArkUI_GestureRecognizer{ TAP_GESTURE, nullptr, nullptr, nullptr };
703     auto* gesture = OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createTapGesture(
704         count, fingers, false, ndkGesture);
705     ndkGesture->gesture = gesture;
706     return ndkGesture;
707 }
708 
CreateTapGestureWithDistanceThreshold(int32_t count,int32_t fingers,double distanceThreshold)709 ArkUI_GestureRecognizer* CreateTapGestureWithDistanceThreshold(int32_t count, int32_t fingers, double distanceThreshold)
710 {
711     count = std::max(count, DEFAULT_TAP_COUNT);
712     fingers = std::clamp(fingers, DEFAULT_TAP_FINGERS, MAX_TAP_FINGERS);
713     auto* ndkGesture = new ArkUI_GestureRecognizer{ TAP_GESTURE, nullptr, nullptr, nullptr };
714     auto* gesture = OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->
715         createTapGestureWithDistanceThreshold(count, fingers, distanceThreshold, false, ndkGesture);
716     ndkGesture->gesture = gesture;
717     return ndkGesture;
718 }
719 
CreateLongPressGesture(int32_t fingers,bool repeatResult,int32_t duration)720 ArkUI_GestureRecognizer* CreateLongPressGesture(int32_t fingers, bool repeatResult, int32_t duration)
721 {
722     auto* ndkGesture = new ArkUI_GestureRecognizer{ LONG_PRESS_GESTURE, nullptr, nullptr, nullptr };
723     auto* gesture =
724         OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createLongPressGesture(fingers,
725         repeatResult, duration, false, ndkGesture);
726     ndkGesture->gesture = gesture;
727     return ndkGesture;
728 }
729 
CreatePinchGesture(int32_t fingers,double distance)730 ArkUI_GestureRecognizer* CreatePinchGesture(int32_t fingers, double distance)
731 {
732     if (LessOrEqual(distance, 0.0f)) {
733         distance = DEFAULT_PINCH_DISTANCE;
734     }
735     double distanceNum = OHOS::Ace::NodeModel::GetFullImpl()->getBasicAPI()->convertLengthMetricsUnit(
736         distance, static_cast<int32_t>(ARKUI_LENGTH_METRIC_UNIT_PX), static_cast<int32_t>(ARKUI_LENGTH_METRIC_UNIT_VP));
737     auto* ndkGesture = new ArkUI_GestureRecognizer{ PINCH_GESTURE, nullptr, nullptr, nullptr };
738     auto* gesture =
739         OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createPinchGesture(fingers,
740         distanceNum, false, ndkGesture);
741     ndkGesture->gesture = gesture;
742     return ndkGesture;
743 }
744 
CreateRotationGesture(int32_t fingers,double angle)745 ArkUI_GestureRecognizer* CreateRotationGesture(int32_t fingers, double angle)
746 {
747     auto* ndkGesture = new ArkUI_GestureRecognizer{ ROTATION_GESTURE, nullptr, nullptr, nullptr };
748     auto* gesture =
749         OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createRotationGesture(fingers,
750         angle, false, ndkGesture);
751     ndkGesture->gesture = gesture;
752     return ndkGesture;
753 }
754 
CreateSwipeGesture(int32_t fingers,ArkUI_GestureDirectionMask directions,double speed)755 ArkUI_GestureRecognizer* CreateSwipeGesture(
756     int32_t fingers, ArkUI_GestureDirectionMask directions, double speed)
757 {
758     if (LessOrEqual(speed, 0.0f)) {
759         speed = DEFAULT_SWIPE_SPEED;
760     }
761     double speedNum = OHOS::Ace::NodeModel::GetFullImpl()->getBasicAPI()->convertLengthMetricsUnit(
762         speed, static_cast<int32_t>(ARKUI_LENGTH_METRIC_UNIT_PX), static_cast<int32_t>(ARKUI_LENGTH_METRIC_UNIT_VP));
763     auto* ndkGesture = new ArkUI_GestureRecognizer{ SWIPE_GESTURE, nullptr, nullptr, nullptr };
764     auto* gesture =
765         OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createSwipeGesture(fingers,
766         directions, speedNum, false, ndkGesture);
767     ndkGesture->gesture = gesture;
768     return ndkGesture;
769 }
770 
CreatePanGesture(int32_t fingersNum,ArkUI_GestureDirectionMask mask,double distanceNum)771 ArkUI_GestureRecognizer* CreatePanGesture(int32_t fingersNum, ArkUI_GestureDirectionMask mask, double distanceNum)
772 {
773     int32_t fingers = DEFAULT_PAN_FINGERS;
774     if (fingersNum < DEFAULT_PAN_FINGERS || fingersNum > MAX_PAN_FINGERS) {
775         fingers = DEFAULT_PAN_FINGERS;
776     } else {
777         fingers = fingersNum;
778     }
779     auto* ndkGesture = new ArkUI_GestureRecognizer{ PAN_GESTURE, nullptr, nullptr, nullptr };
780     auto* gesture = OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createPanGesture(
781         fingers, mask, distanceNum, false, ndkGesture);
782     ndkGesture->gesture = gesture;
783     return ndkGesture;
784 }
785 
DisposeGesture(ArkUI_GestureRecognizer * recognizer)786 void DisposeGesture(ArkUI_GestureRecognizer* recognizer)
787 {
788     OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->dispose(recognizer->gesture);
789     delete reinterpret_cast<GestureInnerData*>(recognizer->extraData);
790     recognizer->extraData = nullptr;
791     delete recognizer;
792     recognizer = nullptr;
793 }
794 
SetGestureEventTarget(ArkUI_GestureRecognizer * recognizer,ArkUI_GestureEventActionTypeMask mask,void * extraParam,void (* targetReceiver)(ArkUI_GestureEvent * event,void * extraParam))795 int32_t SetGestureEventTarget(ArkUI_GestureRecognizer* recognizer, ArkUI_GestureEventActionTypeMask mask,
796     void* extraParam, void (*targetReceiver)(ArkUI_GestureEvent* event, void* extraParam))
797 {
798     // 手势事件通过通用的异步事件接口进行处理。(HandleGestureEvent)
799     // 把回调函数和上下文都封装到内部结构体中。
800     if (recognizer->extraData) {
801         delete reinterpret_cast<GestureInnerData*>(recognizer->extraData);
802         recognizer->extraData = nullptr;
803     }
804     recognizer->extraData = new GestureInnerData { targetReceiver, extraParam, recognizer };
805     OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->registerGestureEvent(
806         recognizer->gesture, mask, recognizer->extraData);
807     return 0;
808 }
809 
AddGestureToNode(ArkUI_NodeHandle node,ArkUI_GestureRecognizer * recognizer,ArkUI_GesturePriority priorityNum,ArkUI_GestureMask mask)810 int32_t AddGestureToNode(ArkUI_NodeHandle node, ArkUI_GestureRecognizer* recognizer, ArkUI_GesturePriority priorityNum,
811     ArkUI_GestureMask mask)
812 {
813     recognizer->attachNode = node;
814     OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->addGestureToNode(
815         node->uiNodeHandle, recognizer->gesture, priorityNum, mask);
816     recognizer->targetInfo.uiNode = reinterpret_cast<void*>(node->uiNodeHandle);
817     return 0;
818 }
819 
RemoveGestureFromNode(ArkUI_NodeHandle node,ArkUI_GestureRecognizer * recognizer)820 int32_t RemoveGestureFromNode(ArkUI_NodeHandle node, ArkUI_GestureRecognizer* recognizer)
821 {
822     OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->removeGestureFromNode(
823         node->uiNodeHandle, recognizer->gesture);
824     recognizer->targetInfo.uiNode = nullptr;
825     return 0;
826 }
827 
GetGestureType(ArkUI_GestureRecognizer * recognizer)828 ArkUI_GestureRecognizerType GetGestureType(ArkUI_GestureRecognizer* recognizer)
829 {
830     return static_cast<ArkUI_GestureRecognizerType>(recognizer->type);
831 }
832 
CreateGroupGesture(ArkUI_GroupGestureMode gestureMode)833 ArkUI_GestureRecognizer* CreateGroupGesture(ArkUI_GroupGestureMode gestureMode)
834 {
835     auto* gesture =
836         OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createGestureGroup(gestureMode);
837     return new ArkUI_GestureRecognizer { GROUP_GESTURE, gesture, nullptr };
838 }
839 
AddChildGesture(ArkUI_GestureRecognizer * group,ArkUI_GestureRecognizer * child)840 int32_t AddChildGesture(ArkUI_GestureRecognizer* group, ArkUI_GestureRecognizer* child)
841 {
842     OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->addGestureToGestureGroup(
843         group->gesture, child->gesture);
844     return 0;
845 }
846 
RemoveChildGesture(ArkUI_GestureRecognizer * group,ArkUI_GestureRecognizer * child)847 int32_t RemoveChildGesture(ArkUI_GestureRecognizer* group, ArkUI_GestureRecognizer* child)
848 {
849     OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->removeGestureFromGestureGroup(
850         group->gesture, child->gesture);
851     return 0;
852 }
853 
HandleGestureEvent(ArkUINodeEvent * event)854 void HandleGestureEvent(ArkUINodeEvent* event)
855 {
856     if (event == nullptr) {
857         return;
858     }
859     auto* extraData = reinterpret_cast<GestureInnerData*>(event->extraParam);
860     if (extraData == nullptr) {
861         return;
862     }
863     ArkUI_GestureEvent* gestureEvent = reinterpret_cast<ArkUI_GestureEvent *>(&event->gestureAsyncEvent);
864     if (gestureEvent == nullptr || extraData->targetReceiver == nullptr) {
865         return;
866     }
867     ArkUI_UIInputEvent* uiEvent = new ArkUI_UIInputEvent();
868     if (gestureEvent->eventData.inputEventType == static_cast<int32_t>(ARKUI_UIINPUTEVENT_TYPE_MOUSE)) {
869         uiEvent->eventTypeId = C_MOUSE_EVENT_ID;
870         uiEvent->inputType = ARKUI_UIINPUTEVENT_TYPE_MOUSE;
871     } else if (gestureEvent->eventData.inputEventType == static_cast<int32_t>(ARKUI_UIINPUTEVENT_TYPE_AXIS)) {
872         uiEvent->eventTypeId = C_AXIS_EVENT_ID;
873         uiEvent->inputType = ARKUI_UIINPUTEVENT_TYPE_AXIS;
874     } else if (gestureEvent->eventData.inputEventType == static_cast<int32_t>(ARKUI_UIINPUTEVENT_TYPE_KEY)) {
875         uiEvent->eventTypeId = C_CLICK_EVENT_ID;
876         uiEvent->inputType = ARKUI_UIINPUTEVENT_TYPE_KEY;
877     } else {
878         uiEvent->eventTypeId = C_TOUCH_EVENT_ID;
879         uiEvent->inputType = ARKUI_UIINPUTEVENT_TYPE_TOUCH;
880     }
881     uiEvent->apiVersion = event->apiVersion;
882     uiEvent->inputEvent = gestureEvent->eventData.rawPointerEvent;
883     gestureEvent->eventData.rawPointerEvent = uiEvent;
884     if (extraData->gesture) {
885         ArkUI_GestureRecognizer* recognizer = reinterpret_cast<ArkUI_GestureRecognizer*>(extraData->gesture);
886         gestureEvent->attachNode = recognizer->attachNode;
887     }
888     extraData->targetReceiver(gestureEvent, extraData->extraParam);
889     delete uiEvent;
890     gestureEvent->eventData.rawPointerEvent = nullptr;
891 }
892 
SetGestureInterrupterToNode(ArkUI_NodeHandle node,ArkUI_GestureInterruptResult (* interrupter)(ArkUI_GestureInterruptInfo * info))893 int32_t SetGestureInterrupterToNode(
894     ArkUI_NodeHandle node,  ArkUI_GestureInterruptResult (*interrupter)(ArkUI_GestureInterruptInfo* info))
895 {
896     auto callback = reinterpret_cast<int32_t (*)(ArkUIGestureInterruptInfo*)>(interrupter);
897     OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->setGestureInterrupterToNode(
898         node->uiNodeHandle, callback);
899     return 0;
900 }
901 
SetGestureInterrupterToNodeWithUserData(ArkUI_NodeHandle node,void * userData,ArkUI_GestureInterruptResult (* interrupter)(ArkUI_GestureInterruptInfo * info))902 int32_t SetGestureInterrupterToNodeWithUserData(ArkUI_NodeHandle node, void* userData,
903     ArkUI_GestureInterruptResult (*interrupter)(ArkUI_GestureInterruptInfo* info))
904 {
905     auto callback = reinterpret_cast<int32_t (*)(ArkUIGestureInterruptInfo*)>(interrupter);
906     auto nodeModel = OHOS::Ace::NodeModel::GetFullImpl();
907     if (nodeModel) {
908         nodeModel->getNodeModifiers()->getGestureModifier()->setGestureInterrupterToNodeWithUserData(
909             node->uiNodeHandle, userData, callback);
910     }
911     return 0;
912 }
913 
SetInnerGestureParallelTo(ArkUI_NodeHandle node,void * userData,ArkUI_GestureRecognizer * (* parallelInnerGesture)(ArkUI_ParallelInnerGestureEvent * event))914 int32_t SetInnerGestureParallelTo(ArkUI_NodeHandle node, void* userData,
915     ArkUI_GestureRecognizer* (*parallelInnerGesture)(ArkUI_ParallelInnerGestureEvent* event))
916 {
917     auto callback =
918         reinterpret_cast<ArkUIGestureRecognizer* (*)(ArkUIParallelInnerGestureEvent * current)>(parallelInnerGesture);
919     OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->setInnerGestureParallelTo(
920         node->uiNodeHandle, userData, callback);
921     return 0;
922 }
923 
924 }; // namespace OHOS::Ace::GestureModel