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 #include <cstdint>
17
18 #include "native_gesture.h"
19 #include "native_node.h"
20 #include "native_type.h"
21 #include "node_model.h"
22 #include "gesture_impl.h"
23
24 #include "base/utils/utils.h"
25 #include "core/gestures/gesture_event.h"
26 #include "frameworks/core/interfaces/arkoala/arkoala_api.h"
27 #include "interfaces/native/event/ui_input_event_impl.h"
28
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32
33 struct ArkUI_GestureRecognizer {
34 int32_t type = -1;
35 ArkUIGesture* gesture = nullptr;
36 void* extraData = nullptr;
37 void* attachNode = nullptr;
38 bool capi = true;
39 void* recognizer = nullptr;
40 ArkUIGestureEventTargetInfo targetInfo = {};
41 };
42
43 struct ArkUI_GestureEventTargetInfo {
44 void* uiNode = nullptr;
45 };
46
47 #ifdef __cplusplus
48 };
49
50 // the ArkUI_GestureEvent struct actually same as ArkUIAPIEventGestureAsyncEvent;
51 struct ArkUI_GestureEvent {
52 ArkUIAPIEventGestureAsyncEvent eventData;
53 void* attachNode;
54 };
55
56 struct ArkUI_GestureInterruptInfo {
57 ArkUIGestureInterruptInfo interruptData;
58 };
59
60 struct ArkUI_ParallelInnerGestureEvent {
61 ArkUIGestureRecognizer* current = nullptr;
62 ArkUIGestureRecognizer** responseLinkRecognizer = nullptr;
63 void* userData = nullptr;
64 int32_t count;
65 };
66
67 #endif
68
69
OH_ArkUI_GestureEvent_GetActionType(const ArkUI_GestureEvent * event)70 ArkUI_GestureEventActionType OH_ArkUI_GestureEvent_GetActionType(const ArkUI_GestureEvent* event)
71 {
72 ArkUI_GestureEventActionType ret;
73 switch (event->eventData.subKind) {
74 case ON_ACTION:
75 case ON_ACTION_START:
76 ret = GESTURE_EVENT_ACTION_ACCEPT;
77 break;
78 case ON_ACTION_UPDATE:
79 ret = GESTURE_EVENT_ACTION_UPDATE;
80 break;
81 case ON_ACTION_END:
82 ret = GESTURE_EVENT_ACTION_END;
83 break;
84 case ON_ACTION_CANCEL:
85 ret = GESTURE_EVENT_ACTION_CANCEL;
86 break;
87 default:
88 ret = GESTURE_EVENT_ACTION_ACCEPT;
89 break;
90 }
91 return ret;
92 }
93
OH_ArkUI_GestureEvent_GetRawInputEvent(const ArkUI_GestureEvent * event)94 const ArkUI_UIInputEvent* OH_ArkUI_GestureEvent_GetRawInputEvent(const ArkUI_GestureEvent* event)
95 {
96 if (!event) {
97 return nullptr;
98 }
99 return reinterpret_cast<ArkUI_UIInputEvent*>(event->eventData.rawPointerEvent);
100 }
101
OH_ArkUI_LongPress_GetRepeatCount(const ArkUI_GestureEvent * event)102 int32_t OH_ArkUI_LongPress_GetRepeatCount(const ArkUI_GestureEvent* event)
103 {
104 return event->eventData.repeat;
105 }
106
OH_ArkUI_PanGesture_GetVelocity(const ArkUI_GestureEvent * event)107 float OH_ArkUI_PanGesture_GetVelocity(const ArkUI_GestureEvent* event)
108 {
109 return event->eventData.velocity;
110 }
111
OH_ArkUI_PanGesture_GetVelocityX(const ArkUI_GestureEvent * event)112 float OH_ArkUI_PanGesture_GetVelocityX(const ArkUI_GestureEvent* event)
113 {
114 return event->eventData.velocityX;
115 }
116
OH_ArkUI_PanGesture_GetVelocityY(const ArkUI_GestureEvent * event)117 float OH_ArkUI_PanGesture_GetVelocityY(const ArkUI_GestureEvent* event)
118 {
119 return event->eventData.velocityY;
120 }
121
OH_ArkUI_PanGesture_GetOffsetX(const ArkUI_GestureEvent * event)122 float OH_ArkUI_PanGesture_GetOffsetX(const ArkUI_GestureEvent* event)
123 {
124 return event->eventData.x;
125 }
126
OH_ArkUI_PanGesture_GetOffsetY(const ArkUI_GestureEvent * event)127 float OH_ArkUI_PanGesture_GetOffsetY(const ArkUI_GestureEvent* event)
128 {
129 return event->eventData.y;
130 }
131
OH_ArkUI_SwipeGesture_GetAngle(const ArkUI_GestureEvent * event)132 float OH_ArkUI_SwipeGesture_GetAngle(const ArkUI_GestureEvent* event)
133 {
134 return event->eventData.angle;
135 }
136
OH_ArkUI_SwipeGesture_GetVelocity(const ArkUI_GestureEvent * event)137 float OH_ArkUI_SwipeGesture_GetVelocity(const ArkUI_GestureEvent* event)
138 {
139 return event->eventData.speed;
140 }
141
OH_ArkUI_RotationGesture_GetAngle(const ArkUI_GestureEvent * event)142 float OH_ArkUI_RotationGesture_GetAngle(const ArkUI_GestureEvent* event)
143 {
144 return event->eventData.angle;
145 }
146
OH_ArkUI_PinchGesture_GetScale(const ArkUI_GestureEvent * event)147 float OH_ArkUI_PinchGesture_GetScale(const ArkUI_GestureEvent* event)
148 {
149 return event->eventData.scale;
150 }
151
OH_ArkUI_PinchGesture_GetCenterX(const ArkUI_GestureEvent * event)152 float OH_ArkUI_PinchGesture_GetCenterX(const ArkUI_GestureEvent* event)
153 {
154 return event->eventData.pinchCenterX;
155 }
156
OH_ArkUI_PinchGesture_GetCenterY(const ArkUI_GestureEvent * event)157 float OH_ArkUI_PinchGesture_GetCenterY(const ArkUI_GestureEvent* event)
158 {
159 return event->eventData.pinchCenterY;
160 }
161
OH_ArkUI_GestureEvent_GetNode(const ArkUI_GestureEvent * event)162 ArkUI_NodeHandle OH_ArkUI_GestureEvent_GetNode(const ArkUI_GestureEvent* event)
163 {
164 if (!event) {
165 return nullptr;
166 }
167 return reinterpret_cast<ArkUI_NodeHandle>(event->attachNode);
168 }
169
OH_ArkUI_GestureInterruptInfo_GetSystemFlag(const ArkUI_GestureInterruptInfo * event)170 bool OH_ArkUI_GestureInterruptInfo_GetSystemFlag(const ArkUI_GestureInterruptInfo* event)
171 {
172 return event->interruptData.isSystemGesture;
173 }
174
OH_ArkUI_GestureInterruptInfo_GetRecognizer(const ArkUI_GestureInterruptInfo * event)175 ArkUI_GestureRecognizer* OH_ArkUI_GestureInterruptInfo_GetRecognizer(const ArkUI_GestureInterruptInfo* event)
176 {
177 return reinterpret_cast<ArkUI_GestureRecognizer *>(event->interruptData.userData);
178 }
179
OH_ArkUI_GestureInterruptInfo_GetGestureEvent(const ArkUI_GestureInterruptInfo * event)180 ArkUI_GestureEvent* OH_ArkUI_GestureInterruptInfo_GetGestureEvent(const ArkUI_GestureInterruptInfo* event)
181 {
182 CHECK_NULL_RETURN(event, nullptr);
183 ArkUI_GestureEvent* gestureEvent = reinterpret_cast<ArkUI_GestureEvent*>(event->interruptData.gestureEvent);
184 CHECK_NULL_RETURN(gestureEvent, nullptr);
185
186 ArkUI_UIInputEvent* uiEvent = reinterpret_cast<ArkUI_UIInputEvent*>(event->interruptData.inputEvent);
187 gestureEvent->eventData.rawPointerEvent = uiEvent;
188
189 auto* gestureRecognizer = reinterpret_cast<ArkUI_GestureRecognizer*>(event->interruptData.userData);
190 CHECK_NULL_RETURN(gestureRecognizer, nullptr);
191 gestureEvent->attachNode = gestureRecognizer->attachNode;
192 return gestureEvent;
193 }
194
OH_ArkUI_GestureInterruptInfo_GetSystemRecognizerType(const ArkUI_GestureInterruptInfo * event)195 int32_t OH_ArkUI_GestureInterruptInfo_GetSystemRecognizerType(const ArkUI_GestureInterruptInfo* event)
196 {
197 if (event->interruptData.isSystemGesture) {
198 return event->interruptData.systemRecognizerType;
199 }
200 return -1;
201 }
202
OH_ArkUI_GestureInterruptInfo_GetTouchRecognizers(const ArkUI_GestureInterruptInfo * info,ArkUI_TouchRecognizerHandleArray * recognizers,int32_t * size)203 int32_t OH_ArkUI_GestureInterruptInfo_GetTouchRecognizers(
204 const ArkUI_GestureInterruptInfo* info, ArkUI_TouchRecognizerHandleArray* recognizers, int32_t* size)
205 {
206 CHECK_NULL_RETURN(info, ARKUI_ERROR_CODE_PARAM_INVALID);
207 CHECK_NULL_RETURN(recognizers, ARKUI_ERROR_CODE_PARAM_INVALID);
208 CHECK_NULL_RETURN(size, ARKUI_ERROR_CODE_PARAM_INVALID);
209 *recognizers = reinterpret_cast<ArkUI_TouchRecognizerHandleArray>(info->interruptData.touchRecognizers);
210 *size = info->interruptData.touchRecognizerCnt;
211 return ARKUI_ERROR_CODE_NO_ERROR;
212 }
213
OH_ArkUI_TouchRecognizer_GetNodeHandle(const ArkUI_TouchRecognizerHandle recognizer)214 ArkUI_NodeHandle OH_ArkUI_TouchRecognizer_GetNodeHandle(const ArkUI_TouchRecognizerHandle recognizer)
215 {
216 CHECK_NULL_RETURN(recognizer, nullptr);
217 auto node =
218 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->touchRecognizerGetNodeHandle(
219 static_cast<void*>(recognizer));
220
221 const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
222 ArkUI_Node* arkUINode = new ArkUI_Node({ -1, node, false });
223 impl->getExtendedAPI()->setAttachNodePtr((arkUINode)->uiNodeHandle, reinterpret_cast<void*>(arkUINode));
224 return reinterpret_cast<ArkUI_NodeHandle>(arkUINode);
225 }
226
OH_ArkUI_TouchRecognizer_CancelTouch(ArkUI_TouchRecognizerHandle recognizer,ArkUI_GestureInterruptInfo * info)227 int32_t OH_ArkUI_TouchRecognizer_CancelTouch(ArkUI_TouchRecognizerHandle recognizer, ArkUI_GestureInterruptInfo* info)
228 {
229 CHECK_NULL_RETURN(recognizer, ARKUI_ERROR_CODE_PARAM_INVALID);
230 CHECK_NULL_RETURN(info, ARKUI_ERROR_CODE_PARAM_INVALID);
231 bool ret =
232 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->touchRecognizerCancelTouch(
233 static_cast<void*>(recognizer));
234 return ret ? ARKUI_ERROR_CODE_NO_ERROR : ARKUI_ERROR_CODE_PARAM_INVALID;
235 }
236
OH_ArkUI_GetResponseRecognizersFromInterruptInfo(const ArkUI_GestureInterruptInfo * event,ArkUI_GestureRecognizerHandleArray * responseChain,int32_t * count)237 int32_t OH_ArkUI_GetResponseRecognizersFromInterruptInfo(
238 const ArkUI_GestureInterruptInfo* event, ArkUI_GestureRecognizerHandleArray* responseChain, int32_t* count)
239 {
240 CHECK_NULL_RETURN(responseChain, ARKUI_ERROR_CODE_PARAM_INVALID);
241 CHECK_NULL_RETURN(count, ARKUI_ERROR_CODE_PARAM_INVALID);
242 *responseChain = reinterpret_cast<ArkUI_GestureRecognizer**>(event->interruptData.responseLinkRecognizer);
243 *count = event->interruptData.count;
244 return 0;
245 }
246
OH_ArkUI_SetGestureRecognizerEnabled(ArkUI_GestureRecognizer * recognizer,bool enabled)247 int32_t OH_ArkUI_SetGestureRecognizerEnabled(ArkUI_GestureRecognizer* recognizer, bool enabled)
248 {
249 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
250 if (!gestureRecognizer) {
251 return ARKUI_ERROR_CODE_PARAM_INVALID;
252 }
253 return OHOS::Ace::NodeModel::GetFullImpl()
254 ->getNodeModifiers()
255 ->getGestureModifier()
256 ->setGestureRecognizerEnabled(gestureRecognizer, enabled);
257 }
258
OH_ArkUI_SetGestureRecognizerLimitFingerCount(ArkUI_GestureRecognizer * recognizer,bool limitFingerCount)259 int32_t OH_ArkUI_SetGestureRecognizerLimitFingerCount(ArkUI_GestureRecognizer* recognizer, bool limitFingerCount)
260 {
261 auto* gesture = reinterpret_cast<ArkUIGesture*>(recognizer->gesture);
262 if (!gesture) {
263 return ARKUI_ERROR_CODE_PARAM_INVALID;
264 }
265 return OHOS::Ace::NodeModel::GetFullImpl()
266 ->getNodeModifiers()
267 ->getGestureModifier()
268 ->setGestureRecognizerLimitFingerCount(gesture, limitFingerCount);
269 }
270
OH_ArkUI_GetGestureRecognizerEnabled(ArkUI_GestureRecognizer * recognizer)271 bool OH_ArkUI_GetGestureRecognizerEnabled(ArkUI_GestureRecognizer* recognizer)
272 {
273 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
274 if (!gestureRecognizer) {
275 return false;
276 }
277 return OHOS::Ace::NodeModel::GetFullImpl()
278 ->getNodeModifiers()
279 ->getGestureModifier()
280 ->getGestureRecognizerEnabled(gestureRecognizer);
281 }
282
OH_ArkUI_GetGestureRecognizerState(ArkUI_GestureRecognizer * recognizer,ArkUI_GestureRecognizerState * state)283 int32_t OH_ArkUI_GetGestureRecognizerState(ArkUI_GestureRecognizer* recognizer, ArkUI_GestureRecognizerState* state)
284 {
285 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
286 if (!gestureRecognizer) {
287 return ARKUI_ERROR_CODE_PARAM_INVALID;
288 }
289 ArkUIGestureRecognizerState recognizerState;
290 auto result =
291 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getGestureRecognizerState(
292 gestureRecognizer, &recognizerState);
293 *state = static_cast<ArkUI_GestureRecognizerState>(recognizerState);
294 return result;
295 }
296
OH_ArkUI_GetGestureEventTargetInfo(ArkUI_GestureRecognizer * recognizer,ArkUI_GestureEventTargetInfo ** info)297 int32_t OH_ArkUI_GetGestureEventTargetInfo(ArkUI_GestureRecognizer* recognizer, ArkUI_GestureEventTargetInfo** info)
298 {
299 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
300 if (!gestureRecognizer) {
301 return ARKUI_ERROR_CODE_PARAM_INVALID;
302 }
303 *info = reinterpret_cast<ArkUI_GestureEventTargetInfo*>(&gestureRecognizer->targetInfo);
304 return 0;
305 }
306
OH_ArkUI_GestureEventTargetInfo_IsScrollBegin(ArkUI_GestureEventTargetInfo * info,bool * ret)307 int32_t OH_ArkUI_GestureEventTargetInfo_IsScrollBegin(ArkUI_GestureEventTargetInfo* info, bool* ret)
308 {
309 auto* targetInfo = reinterpret_cast<ArkUIGestureEventTargetInfo*>(info);
310 if (!targetInfo) {
311 return ARKUI_ERROR_CODE_PARAM_INVALID;
312 }
313 return OHOS::Ace::NodeModel::GetFullImpl()
314 ->getNodeModifiers()
315 ->getGestureModifier()
316 ->gestureEventTargetInfoIsScrollBegin(targetInfo, ret);
317 }
318
OH_ArkUI_GestureEventTargetInfo_IsScrollEnd(ArkUI_GestureEventTargetInfo * info,bool * ret)319 int32_t OH_ArkUI_GestureEventTargetInfo_IsScrollEnd(ArkUI_GestureEventTargetInfo* info, bool* ret)
320 {
321 auto* targetInfo = reinterpret_cast<ArkUIGestureEventTargetInfo*>(info);
322 if (!targetInfo) {
323 return ARKUI_ERROR_CODE_PARAM_INVALID;
324 }
325 return OHOS::Ace::NodeModel::GetFullImpl()
326 ->getNodeModifiers()
327 ->getGestureModifier()
328 ->gestureEventTargetInfoIsScrollEnd(targetInfo, ret);
329 }
330
OH_ArkUI_GetPanGestureDirectionMask(ArkUI_GestureRecognizer * recognizer,ArkUI_GestureDirectionMask * directionMask)331 int32_t OH_ArkUI_GetPanGestureDirectionMask(
332 ArkUI_GestureRecognizer* recognizer, ArkUI_GestureDirectionMask* directionMask)
333 {
334 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
335 if (!gestureRecognizer) {
336 return ARKUI_ERROR_CODE_PARAM_INVALID;
337 }
338 ArkUIGestureDirection direction = ArkUIGestureDirection::ArkUI_GESTURE_DIRECTION_ALL;
339 auto result =
340 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getPanGestureDirectionMask(
341 gestureRecognizer, &direction);
342 *directionMask = static_cast<ArkUI_GestureDirectionMask>(direction);
343 return result;
344 }
345
OH_ArkUI_IsBuiltInGesture(ArkUI_GestureRecognizer * recognizer)346 bool OH_ArkUI_IsBuiltInGesture(ArkUI_GestureRecognizer* recognizer)
347 {
348 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
349 if (!gestureRecognizer) {
350 return false;
351 }
352 return OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->isBuiltInGesture(
353 gestureRecognizer);
354 }
355
OH_ArkUI_GetGestureTag(ArkUI_GestureRecognizer * recognizer,char * buffer,int32_t bufferSize,int32_t * result)356 int32_t OH_ArkUI_GetGestureTag(ArkUI_GestureRecognizer* recognizer, char* buffer, int32_t bufferSize, int32_t* result)
357 {
358 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
359 if (!gestureRecognizer) {
360 return ARKUI_ERROR_CODE_PARAM_INVALID;
361 }
362 return OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getGestureTag(
363 gestureRecognizer, buffer, bufferSize, result);
364 }
365
OH_ArkUI_GetGestureBindNodeId(ArkUI_GestureRecognizer * recognizer,char * nodeId,int32_t size,int32_t * result)366 int32_t OH_ArkUI_GetGestureBindNodeId(ArkUI_GestureRecognizer* recognizer, char* nodeId, int32_t size, int32_t* result)
367 {
368 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
369 if (!gestureRecognizer) {
370 return ARKUI_ERROR_CODE_PARAM_INVALID;
371 }
372 return OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->getGestureBindNodeId(
373 gestureRecognizer, nodeId, size, result);
374 }
375
OH_ArkUI_IsGestureRecognizerValid(ArkUI_GestureRecognizer * recognizer)376 bool OH_ArkUI_IsGestureRecognizerValid(ArkUI_GestureRecognizer* recognizer)
377 {
378 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
379 if (!gestureRecognizer) {
380 return false;
381 }
382 return OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->isGestureRecognizerValid(
383 gestureRecognizer);
384 }
385
OH_ArkUI_ParallelInnerGestureEvent_GetUserData(ArkUI_ParallelInnerGestureEvent * event)386 void* OH_ArkUI_ParallelInnerGestureEvent_GetUserData(ArkUI_ParallelInnerGestureEvent* event)
387 {
388 return event->userData;
389 }
390
OH_ArkUI_ParallelInnerGestureEvent_GetCurrentRecognizer(ArkUI_ParallelInnerGestureEvent * event)391 ArkUI_GestureRecognizer* OH_ArkUI_ParallelInnerGestureEvent_GetCurrentRecognizer(ArkUI_ParallelInnerGestureEvent* event)
392 {
393 return reinterpret_cast<ArkUI_GestureRecognizer*>(event->current);
394 }
395
OH_ArkUI_ParallelInnerGestureEvent_GetConflictRecognizers(ArkUI_ParallelInnerGestureEvent * event,ArkUI_GestureRecognizerHandleArray * array,int32_t * size)396 int32_t OH_ArkUI_ParallelInnerGestureEvent_GetConflictRecognizers(
397 ArkUI_ParallelInnerGestureEvent* event, ArkUI_GestureRecognizerHandleArray* array, int32_t* size)
398 {
399 CHECK_NULL_RETURN(array, ARKUI_ERROR_CODE_PARAM_INVALID);
400 CHECK_NULL_RETURN(size, ARKUI_ERROR_CODE_PARAM_INVALID);
401 *array = reinterpret_cast<ArkUI_GestureRecognizer**>(event->responseLinkRecognizer);
402 *size = event->count;
403 return 0;
404 }
405
OH_ArkUI_SetArkUIGestureRecognizerDisposeNotify(ArkUI_GestureRecognizer * recognizer,ArkUI_GestureRecognizerDisposeNotifyCallback callback,void * userData)406 int32_t OH_ArkUI_SetArkUIGestureRecognizerDisposeNotify(
407 ArkUI_GestureRecognizer* recognizer, ArkUI_GestureRecognizerDisposeNotifyCallback callback, void* userData)
408 {
409 auto* gestureRecognizer = reinterpret_cast<ArkUIGestureRecognizer*>(recognizer);
410 if (!gestureRecognizer || gestureRecognizer->capi) {
411 return ARKUI_ERROR_CODE_PARAM_INVALID;
412 }
413 auto disposeCallback = reinterpret_cast<void (*)(ArkUIGestureRecognizer * recognizer, void* userData)>(callback);
414 OHOS::Ace::NodeModel::GetFullImpl()
415 ->getNodeModifiers()
416 ->getGestureModifier()
417 ->setArkUIGestureRecognizerDisposeNotify(gestureRecognizer, userData, disposeCallback);
418 return 0;
419 }
420
421 namespace OHOS::Ace::GestureModel {
422
423 constexpr int32_t DEFAULT_PAN_FINGERS = 1;
424 constexpr int32_t MAX_PAN_FINGERS = 10;
425 constexpr double DEFAULT_PINCH_DISTANCE = 5.0f;
426 constexpr double DEFAULT_SWIPE_SPEED = 100.0f;
427 constexpr int32_t DEFAULT_TAP_COUNT = 1;
428 constexpr int32_t DEFAULT_TAP_FINGERS = 1;
429 constexpr int32_t MAX_TAP_FINGERS = 10;
430
431 struct GestureInnerData {
432 void (*targetReceiver)(ArkUI_GestureEvent* event, void* extraParam);
433 void* extraParam;
434 void* gesture;
435 };
436
CreatePanGesture(int32_t fingersNum,ArkUI_GestureDirectionMask mask,double distanceNum)437 ArkUI_GestureRecognizer* CreatePanGesture(int32_t fingersNum, ArkUI_GestureDirectionMask mask, double distanceNum)
438 {
439 int32_t fingers = DEFAULT_PAN_FINGERS;
440 if (fingersNum < DEFAULT_PAN_FINGERS || fingersNum > MAX_PAN_FINGERS) {
441 fingers = DEFAULT_PAN_FINGERS;
442 } else {
443 fingers = fingersNum;
444 }
445 auto* ndkGesture = new ArkUI_GestureRecognizer{ PAN_GESTURE, nullptr, nullptr };
446 auto* gesture = OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createPanGesture(
447 fingers, mask, distanceNum, false, ndkGesture);
448 ndkGesture->gesture = gesture;
449 return ndkGesture;
450 }
451
CreateTapGesture(int32_t count,int32_t fingers)452 ArkUI_GestureRecognizer* CreateTapGesture(int32_t count, int32_t fingers)
453 {
454 count = std::max(count, DEFAULT_TAP_COUNT);
455 fingers = std::clamp(fingers, DEFAULT_TAP_FINGERS, MAX_TAP_FINGERS);
456 auto* ndkGesture = new ArkUI_GestureRecognizer{ TAP_GESTURE, nullptr, nullptr, nullptr };
457 auto* gesture = OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createTapGesture(
458 count, fingers, false, ndkGesture);
459 ndkGesture->gesture = gesture;
460 return ndkGesture;
461 }
462
CreateTapGestureWithDistanceThreshold(int32_t count,int32_t fingers,double distanceThreshold)463 ArkUI_GestureRecognizer* CreateTapGestureWithDistanceThreshold(
464 int32_t count, int32_t fingers, double distanceThreshold)
465 {
466 count = std::max(count, DEFAULT_TAP_COUNT);
467 fingers = std::clamp(fingers, DEFAULT_TAP_FINGERS, MAX_TAP_FINGERS);
468 auto* ndkGesture = new ArkUI_GestureRecognizer{ TAP_GESTURE, nullptr, nullptr, nullptr };
469 auto* gesture = OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->
470 createTapGestureWithDistanceThreshold(count, fingers, distanceThreshold, false, ndkGesture);
471 ndkGesture->gesture = gesture;
472 return ndkGesture;
473 }
474
CreateLongPressGesture(int32_t fingers,bool repeatResult,int32_t duration)475 ArkUI_GestureRecognizer* CreateLongPressGesture(int32_t fingers, bool repeatResult, int32_t duration)
476 {
477 auto* ndkGesture = new ArkUI_GestureRecognizer{ LONG_PRESS_GESTURE, nullptr, nullptr, nullptr };
478 auto* gesture =
479 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createLongPressGesture(fingers,
480 repeatResult, duration, false, ndkGesture);
481 ndkGesture->gesture = gesture;
482 return ndkGesture;
483 }
484
CreatePinchGesture(int32_t fingers,double distance)485 ArkUI_GestureRecognizer* CreatePinchGesture(int32_t fingers, double distance)
486 {
487 if (LessOrEqual(distance, 0.0f)) {
488 distance = DEFAULT_PINCH_DISTANCE;
489 }
490 double distanceNum = OHOS::Ace::NodeModel::GetFullImpl()->getBasicAPI()->convertLengthMetricsUnit(
491 distance, static_cast<int32_t>(ARKUI_LENGTH_METRIC_UNIT_PX), static_cast<int32_t>(ARKUI_LENGTH_METRIC_UNIT_VP));
492 auto* ndkGesture = new ArkUI_GestureRecognizer{ PINCH_GESTURE, nullptr, nullptr, nullptr };
493 auto* gesture =
494 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createPinchGesture(fingers,
495 distanceNum, false, ndkGesture);
496 ndkGesture->gesture = gesture;
497 return ndkGesture;
498 }
499
CreateRotationGesture(int32_t fingers,double angle)500 ArkUI_GestureRecognizer* CreateRotationGesture(int32_t fingers, double angle)
501 {
502 auto* ndkGesture = new ArkUI_GestureRecognizer{ ROTATION_GESTURE, nullptr, nullptr, nullptr };
503 auto* gesture =
504 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createRotationGesture(fingers,
505 angle, false, ndkGesture);
506 ndkGesture->gesture = gesture;
507 return ndkGesture;
508 }
509
CreateSwipeGesture(int32_t fingers,ArkUI_GestureDirectionMask directions,double speed)510 ArkUI_GestureRecognizer* CreateSwipeGesture(
511 int32_t fingers, ArkUI_GestureDirectionMask directions, double speed)
512 {
513 if (LessOrEqual(speed, 0.0f)) {
514 speed = DEFAULT_SWIPE_SPEED;
515 }
516 double speedNum = OHOS::Ace::NodeModel::GetFullImpl()->getBasicAPI()->convertLengthMetricsUnit(
517 speed, static_cast<int32_t>(ARKUI_LENGTH_METRIC_UNIT_PX), static_cast<int32_t>(ARKUI_LENGTH_METRIC_UNIT_VP));
518 auto* ndkGesture = new ArkUI_GestureRecognizer{ SWIPE_GESTURE, nullptr, nullptr, nullptr };
519 auto* gesture =
520 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createSwipeGesture(fingers,
521 directions, speedNum, false, ndkGesture);
522 ndkGesture->gesture = gesture;
523 return ndkGesture;
524 }
525
DisposeGesture(ArkUI_GestureRecognizer * recognizer)526 void DisposeGesture(ArkUI_GestureRecognizer* recognizer)
527 {
528 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->dispose(recognizer->gesture);
529 delete reinterpret_cast<GestureInnerData*>(recognizer->extraData);
530 recognizer->extraData = nullptr;
531 delete recognizer;
532 recognizer = nullptr;
533 }
534
SetGestureEventTarget(ArkUI_GestureRecognizer * recognizer,ArkUI_GestureEventActionTypeMask mask,void * extraParam,void (* targetReceiver)(ArkUI_GestureEvent * event,void * extraParam))535 int32_t SetGestureEventTarget(ArkUI_GestureRecognizer* recognizer, ArkUI_GestureEventActionTypeMask mask,
536 void* extraParam, void (*targetReceiver)(ArkUI_GestureEvent* event, void* extraParam))
537 {
538 // 手势事件通过通用的异步事件接口进行处理。(HandleGestureEvent)
539 // 把回调函数和上下文都封装到内部结构体中。
540 if (recognizer->extraData) {
541 delete reinterpret_cast<GestureInnerData*>(recognizer->extraData);
542 recognizer->extraData = nullptr;
543 }
544 recognizer->extraData = new GestureInnerData { targetReceiver, extraParam, recognizer };
545 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->registerGestureEvent(
546 recognizer->gesture, mask, recognizer->extraData);
547 return 0;
548 }
549
AddGestureToNode(ArkUI_NodeHandle node,ArkUI_GestureRecognizer * recognizer,ArkUI_GesturePriority priorityNum,ArkUI_GestureMask mask)550 int32_t AddGestureToNode(ArkUI_NodeHandle node, ArkUI_GestureRecognizer* recognizer, ArkUI_GesturePriority priorityNum,
551 ArkUI_GestureMask mask)
552 {
553 recognizer->attachNode = node;
554 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->addGestureToNode(
555 node->uiNodeHandle, recognizer->gesture, priorityNum, mask);
556 recognizer->targetInfo.uiNode = reinterpret_cast<void*>(node->uiNodeHandle);
557 return 0;
558 }
559
RemoveGestureFromNode(ArkUI_NodeHandle node,ArkUI_GestureRecognizer * recognizer)560 int32_t RemoveGestureFromNode(ArkUI_NodeHandle node, ArkUI_GestureRecognizer* recognizer)
561 {
562 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->removeGestureFromNode(
563 node->uiNodeHandle, recognizer->gesture);
564 recognizer->targetInfo.uiNode = nullptr;
565 return 0;
566 }
567
GetGestureType(ArkUI_GestureRecognizer * recognizer)568 ArkUI_GestureRecognizerType GetGestureType(ArkUI_GestureRecognizer* recognizer)
569 {
570 return static_cast<ArkUI_GestureRecognizerType>(recognizer->type);
571 }
572
CreateGroupGesture(ArkUI_GroupGestureMode gestureMode)573 ArkUI_GestureRecognizer* CreateGroupGesture(ArkUI_GroupGestureMode gestureMode)
574 {
575 auto* gesture =
576 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->createGestureGroup(gestureMode);
577 return new ArkUI_GestureRecognizer { GROUP_GESTURE, gesture, nullptr };
578 }
579
AddChildGesture(ArkUI_GestureRecognizer * group,ArkUI_GestureRecognizer * child)580 int32_t AddChildGesture(ArkUI_GestureRecognizer* group, ArkUI_GestureRecognizer* child)
581 {
582 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->addGestureToGestureGroup(
583 group->gesture, child->gesture);
584 return 0;
585 }
586
RemoveChildGesture(ArkUI_GestureRecognizer * group,ArkUI_GestureRecognizer * child)587 int32_t RemoveChildGesture(ArkUI_GestureRecognizer* group, ArkUI_GestureRecognizer* child)
588 {
589 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->removeGestureFromGestureGroup(
590 group->gesture, child->gesture);
591 return 0;
592 }
593
HandleGestureEvent(ArkUINodeEvent * event)594 void HandleGestureEvent(ArkUINodeEvent* event)
595 {
596 if (event == nullptr) {
597 return;
598 }
599 auto* extraData = reinterpret_cast<GestureInnerData*>(event->extraParam);
600 if (extraData == nullptr) {
601 return;
602 }
603 ArkUI_GestureEvent* gestureEvent = reinterpret_cast<ArkUI_GestureEvent *>(&event->gestureAsyncEvent);
604 if (gestureEvent == nullptr || extraData->targetReceiver == nullptr) {
605 return;
606 }
607 ArkUI_UIInputEvent uiEvent;
608 if (gestureEvent->eventData.inputEventType == static_cast<int32_t>(ARKUI_UIINPUTEVENT_TYPE_MOUSE)) {
609 uiEvent.eventTypeId = C_MOUSE_EVENT_ID;
610 uiEvent.inputType = ARKUI_UIINPUTEVENT_TYPE_MOUSE;
611 } else if (gestureEvent->eventData.inputEventType == static_cast<int32_t>(ARKUI_UIINPUTEVENT_TYPE_AXIS)) {
612 uiEvent.eventTypeId = C_AXIS_EVENT_ID;
613 uiEvent.inputType = ARKUI_UIINPUTEVENT_TYPE_AXIS;
614 } else {
615 uiEvent.eventTypeId = C_TOUCH_EVENT_ID;
616 uiEvent.inputType = ARKUI_UIINPUTEVENT_TYPE_TOUCH;
617 }
618 uiEvent.inputEvent = gestureEvent->eventData.rawPointerEvent;
619 gestureEvent->eventData.rawPointerEvent = &uiEvent;
620 if (extraData->gesture) {
621 ArkUI_GestureRecognizer* recognizer = reinterpret_cast<ArkUI_GestureRecognizer*>(extraData->gesture);
622 gestureEvent->attachNode = recognizer->attachNode;
623 }
624 extraData->targetReceiver(gestureEvent, extraData->extraParam);
625 }
626
SetGestureInterrupterToNode(ArkUI_NodeHandle node,ArkUI_GestureInterruptResult (* interrupter)(ArkUI_GestureInterruptInfo * info))627 int32_t SetGestureInterrupterToNode(
628 ArkUI_NodeHandle node, ArkUI_GestureInterruptResult (*interrupter)(ArkUI_GestureInterruptInfo* info))
629 {
630 auto callback = reinterpret_cast<int32_t (*)(ArkUIGestureInterruptInfo*)>(interrupter);
631 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->setGestureInterrupterToNode(
632 node->uiNodeHandle, callback);
633 return 0;
634 }
635
SetInnerGestureParallelTo(ArkUI_NodeHandle node,void * userData,ArkUI_GestureRecognizer * (* parallelInnerGesture)(ArkUI_ParallelInnerGestureEvent * event))636 int32_t SetInnerGestureParallelTo(ArkUI_NodeHandle node, void* userData,
637 ArkUI_GestureRecognizer* (*parallelInnerGesture)(ArkUI_ParallelInnerGestureEvent* event))
638 {
639 auto callback =
640 reinterpret_cast<ArkUIGestureRecognizer* (*)(ArkUIParallelInnerGestureEvent * current)>(parallelInnerGesture);
641 OHOS::Ace::NodeModel::GetFullImpl()->getNodeModifiers()->getGestureModifier()->setInnerGestureParallelTo(
642 node->uiNodeHandle, userData, callback);
643 return 0;
644 }
645
646 }; // namespace OHOS::Ace::GestureModel