1  /*
2   * Copyright (c) 2022 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 "js_pointer_context.h"
17  #include "pixel_map.h"
18  #include "pixel_map_napi.h"
19  
20  #undef MMI_LOG_TAG
21  #define MMI_LOG_TAG "JsPointerContext"
22  
23  namespace OHOS {
24  namespace MMI {
25  namespace {
26  constexpr int32_t STANDARD_SPEED { 5 };
27  constexpr int32_t MAX_SPEED { 11 };
28  constexpr int32_t MIN_SPEED { 1 };
29  constexpr int32_t DEFAULT_ROWS { 3 };
30  constexpr int32_t MIN_ROWS { 1 };
31  constexpr int32_t MAX_ROWS { 100 };
32  constexpr size_t INPUT_PARAMETER { 2 };
33  constexpr int32_t DEFAULT_POINTER_SIZE { 1 };
34  constexpr int32_t MIN_POINTER_SIZE { 1 };
35  constexpr int32_t MAX_POINTER_SIZE { 7 };
36  constexpr int32_t MIN_POINTER_COLOR { 0x000000 };
37  constexpr int32_t THREE_PARAMETERS { 3 };
38  constexpr int32_t INVALID_VALUE { -2 };
39  } // namespace
40  
JsPointerContext()41  JsPointerContext::JsPointerContext() : mgr_(std::make_shared<JsPointerManager>()) {}
42  
CreateInstance(napi_env env)43  napi_value JsPointerContext::CreateInstance(napi_env env)
44  {
45      CALL_DEBUG_ENTER;
46      napi_value global = nullptr;
47      CHKRP(napi_get_global(env, &global), GET_GLOBAL);
48  
49      constexpr char className[] = "JsPointerContext";
50      napi_value jsClass = nullptr;
51      napi_property_descriptor desc[] = {};
52      napi_status status = napi_define_class(env, className, sizeof(className), JsPointerContext::CreateJsObject,
53                                             nullptr, sizeof(desc) / sizeof(desc[0]), nullptr, &jsClass);
54      CHKRP(status, DEFINE_CLASS);
55  
56      status = napi_set_named_property(env, global, "multimodalinput_pointer_class", jsClass);
57      CHKRP(status, SET_NAMED_PROPERTY);
58  
59      napi_value jsInstance = nullptr;
60      CHKRP(napi_new_instance(env, jsClass, 0, nullptr, &jsInstance), NEW_INSTANCE);
61      CHKRP(napi_set_named_property(env, global, "multimodal_pointer", jsInstance), SET_NAMED_PROPERTY);
62  
63      JsPointerContext *jsContext = nullptr;
64      CHKRP(napi_unwrap(env, jsInstance, (void**)&jsContext), UNWRAP);
65      CHKPP(jsContext);
66      CHKRP(napi_create_reference(env, jsInstance, 1, &(jsContext->contextRef_)), CREATE_REFERENCE);
67  
68      uint32_t refCount = 0;
69      CHKRP(napi_reference_ref(env, jsContext->contextRef_, &refCount), REFERENCE_REF);
70      return jsInstance;
71  }
72  
CreateJsObject(napi_env env,napi_callback_info info)73  napi_value JsPointerContext::CreateJsObject(napi_env env, napi_callback_info info)
74  {
75      CALL_DEBUG_ENTER;
76      napi_value thisVar = nullptr;
77      void *data = nullptr;
78      CHKRP(napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, &data), GET_CB_INFO);
79  
80      JsPointerContext *jsContext = new (std::nothrow) JsPointerContext();
81      CHKPP(jsContext);
82      napi_status status = napi_wrap(env, thisVar, jsContext, [](napi_env env, void* data, void* hin) {
83          MMI_HILOGI("jsvm ends");
84          JsPointerContext *context = static_cast<JsPointerContext*>(data);
85          delete context;
86      }, nullptr, nullptr);
87      if (status != napi_ok) {
88          delete jsContext;
89          THROWERR(env, "Failed to wrap native instance");
90          return nullptr;
91      }
92      return thisVar;
93  }
94  
GetInstance(napi_env env)95  JsPointerContext* JsPointerContext::GetInstance(napi_env env)
96  {
97      CALL_DEBUG_ENTER;
98      napi_value global = nullptr;
99      CHKRP(napi_get_global(env, &global), GET_GLOBAL);
100  
101      bool result = false;
102      CHKRP(napi_has_named_property(env, global, "multimodal_pointer", &result), HAS_NAMED_PROPERTY);
103      if (!result) {
104          THROWERR(env, "multimodal_pointer was not found");
105          return nullptr;
106      }
107  
108      napi_value object = nullptr;
109      CHKRP(napi_get_named_property(env, global, "multimodal_pointer", &object), SET_NAMED_PROPERTY);
110      if (object == nullptr) {
111          THROWERR(env, "object is nullptr");
112          return nullptr;
113      }
114  
115      JsPointerContext *instance = nullptr;
116      CHKRP(napi_unwrap(env, object, (void**)&instance), UNWRAP);
117      if (instance == nullptr) {
118          THROWERR(env, "instance is nullptr");
119          return nullptr;
120      }
121      return instance;
122  }
123  
GetJsPointerMgr() const124  std::shared_ptr<JsPointerManager> JsPointerContext::GetJsPointerMgr() const
125  {
126      return mgr_;
127  }
128  
SetPointerVisible(napi_env env,napi_callback_info info)129  napi_value JsPointerContext::SetPointerVisible(napi_env env, napi_callback_info info)
130  {
131      CALL_DEBUG_ENTER;
132      size_t argc = 2;
133      napi_value argv[2] = { 0 };
134      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
135      if (argc < 1) {
136          MMI_HILOGE("At least one parameter is required");
137          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "visible", "boolean");
138          return nullptr;
139      }
140      if (!JsCommon::TypeOf(env, argv[0], napi_boolean)) {
141          MMI_HILOGE("visible parameter type is invalid");
142          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "visible", "boolean");
143          return nullptr;
144      }
145      bool visible = true;
146      CHKRP(napi_get_value_bool(env, argv[0], &visible), GET_VALUE_BOOL);
147  
148      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
149      CHKPP(jsPointer);
150      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
151      if (argc == 1) {
152          return jsPointerMgr->SetPointerVisible(env, visible);
153      }
154      if (!JsCommon::TypeOf(env, argv[1], napi_function)) {
155          MMI_HILOGE("callback parameter type is invalid");
156          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
157          return nullptr;
158      }
159      return jsPointerMgr->SetPointerVisible(env, visible, argv[1]);
160  }
161  
SetPointerVisibleSync(napi_env env,napi_callback_info info)162  napi_value JsPointerContext::SetPointerVisibleSync(napi_env env, napi_callback_info info)
163  {
164      CALL_DEBUG_ENTER;
165      size_t argc = 1;
166      napi_value argv[1] = { 0 };
167      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
168      if (argc < 1) {
169          MMI_HILOGE("At least one parameter is required");
170          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "visible", "boolean");
171          return nullptr;
172      }
173      if (!JsCommon::TypeOf(env, argv[0], napi_boolean)) {
174          MMI_HILOGE("visible parameter type is invalid");
175          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "visible", "boolean");
176          return nullptr;
177      }
178      bool visible = true;
179      CHKRP(napi_get_value_bool(env, argv[0], &visible), GET_VALUE_BOOL);
180  
181      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
182      CHKPP(jsPointer);
183      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
184      return jsPointerMgr->SetPointerVisibleSync(env, visible);
185  }
186  
IsPointerVisible(napi_env env,napi_callback_info info)187  napi_value JsPointerContext::IsPointerVisible(napi_env env, napi_callback_info info)
188  {
189      CALL_DEBUG_ENTER;
190      size_t argc = 1;
191      napi_value argv[1] = { 0 };
192      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
193  
194      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
195      CHKPP(jsPointer);
196      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
197      if (argc < 1) {
198          return jsPointerMgr->IsPointerVisible(env);
199      }
200      if (!JsCommon::TypeOf(env, argv[0], napi_function)) {
201          MMI_HILOGE("callback parameter type is invalid");
202          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
203          return nullptr;
204      }
205  
206      return jsPointerMgr->IsPointerVisible(env, argv[0]);
207  }
208  
IsPointerVisibleSync(napi_env env,napi_callback_info info)209  napi_value JsPointerContext::IsPointerVisibleSync(napi_env env, napi_callback_info info)
210  {
211      CALL_DEBUG_ENTER;
212      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
213      CHKPP(jsPointer);
214      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
215      return jsPointerMgr->IsPointerVisibleSync(env);
216  }
217  
SetPointerColor(napi_env env,napi_callback_info info)218  napi_value JsPointerContext::SetPointerColor(napi_env env, napi_callback_info info)
219  {
220      CALL_DEBUG_ENTER;
221      size_t argc = 2;
222      napi_value argv[2] = { 0 };
223      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
224      if (argc < 1) {
225          MMI_HILOGE("At least 1 parameter is required");
226          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "color", "number");
227          return nullptr;
228      }
229      if (!JsCommon::TypeOf(env, argv[0], napi_number)) {
230          MMI_HILOGE("Color parameter type is invalid");
231          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "color", "number");
232          return nullptr;
233      }
234      int32_t color = MIN_POINTER_COLOR;
235      CHKRP(napi_get_value_int32(env, argv[0], &color), GET_VALUE_INT32);
236      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
237      CHKPP(jsPointer);
238      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
239      if (argc == 1) {
240          return jsPointerMgr->SetPointerColor(env, color);
241      }
242      if (!JsCommon::TypeOf(env, argv[1], napi_function)) {
243          MMI_HILOGE("Callback parameter type is invalid");
244          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
245          return nullptr;
246      }
247      return jsPointerMgr->SetPointerColor(env, color, argv[1]);
248  }
249  
GetPointerColor(napi_env env,napi_callback_info info)250  napi_value JsPointerContext::GetPointerColor(napi_env env, napi_callback_info info)
251  {
252      CALL_DEBUG_ENTER;
253      size_t argc = 1;
254      napi_value argv[1] = { 0 };
255      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
256      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
257      CHKPP(jsPointer);
258      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
259      if (argc < 1) {
260          return jsPointerMgr->GetPointerColor(env);
261      }
262      if (!JsCommon::TypeOf(env, argv[0], napi_function)) {
263          MMI_HILOGE("Callback parameter type is invalid");
264          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
265          return nullptr;
266      }
267  
268      return jsPointerMgr->GetPointerColor(env, argv[0]);
269  }
270  
SetPointerColorSync(napi_env env,napi_callback_info info)271  napi_value JsPointerContext::SetPointerColorSync(napi_env env, napi_callback_info info)
272  {
273      CALL_DEBUG_ENTER;
274      size_t argc = 1;
275      napi_value argv[1] = { 0 };
276      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
277      if (argc < 1) {
278          MMI_HILOGE("At least 1 parameter is required");
279          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "color", "number");
280          return nullptr;
281      }
282      if (!JsCommon::TypeOf(env, argv[0], napi_number)) {
283          MMI_HILOGE("Color parameter type is invalid");
284          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "color", "number");
285          return nullptr;
286      }
287      int32_t color = MIN_POINTER_COLOR;
288      CHKRP(napi_get_value_int32(env, argv[0], &color), GET_VALUE_INT32);
289      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
290      CHKPP(jsPointer);
291      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
292      return jsPointerMgr->SetPointerColorSync(env, color);
293  }
294  
GetPointerColorSync(napi_env env,napi_callback_info info)295  napi_value JsPointerContext::GetPointerColorSync(napi_env env, napi_callback_info info)
296  {
297      CALL_DEBUG_ENTER;
298      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
299      CHKPP(jsPointer);
300      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
301      return jsPointerMgr->GetPointerColorSync(env);
302  }
303  
SetPointerSpeed(napi_env env,napi_callback_info info)304  napi_value JsPointerContext::SetPointerSpeed(napi_env env, napi_callback_info info)
305  {
306      CALL_DEBUG_ENTER;
307      size_t argc = 2;
308      napi_value argv[2] = { 0 };
309      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
310      if (argc < 1) {
311          MMI_HILOGE("At least 1 parameter is required");
312          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "speed", "number");
313          return nullptr;
314      }
315      if (!JsCommon::TypeOf(env, argv[0], napi_number)) {
316          MMI_HILOGE("Speed parameter type is invalid");
317          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "speed", "number");
318          return nullptr;
319      }
320      int32_t pointerSpeed = STANDARD_SPEED;
321      CHKRP(napi_get_value_int32(env, argv[0], &pointerSpeed), GET_VALUE_INT32);
322      if (pointerSpeed < MIN_SPEED) {
323          pointerSpeed = MIN_SPEED;
324      } else if (pointerSpeed > MAX_SPEED) {
325          pointerSpeed = MAX_SPEED;
326      }
327      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
328      CHKPP(jsPointer);
329      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
330      if (argc == 1) {
331          return jsPointerMgr->SetPointerSpeed(env, pointerSpeed);
332      }
333      if (!JsCommon::TypeOf(env, argv[1], napi_function)) {
334          MMI_HILOGE("Callback parameter type is invalid");
335          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
336          return nullptr;
337      }
338      return jsPointerMgr->SetPointerSpeed(env, pointerSpeed, argv[1]);
339  }
340  
SetPointerSpeedSync(napi_env env,napi_callback_info info)341  napi_value JsPointerContext::SetPointerSpeedSync(napi_env env, napi_callback_info info)
342  {
343      CALL_DEBUG_ENTER;
344      size_t argc = 1;
345      napi_value argv[1] = { 0 };
346      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
347      if (argc < 1) {
348          MMI_HILOGE("At least 1 parameter is required");
349          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "speed", "number");
350          return nullptr;
351      }
352      if (!JsCommon::TypeOf(env, argv[0], napi_number)) {
353          MMI_HILOGE("Speed parameter type is invalid");
354          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "speed", "number");
355          return nullptr;
356      }
357      int32_t pointerSpeed = STANDARD_SPEED;
358      CHKRP(napi_get_value_int32(env, argv[0], &pointerSpeed), GET_VALUE_INT32);
359      if (pointerSpeed < MIN_SPEED) {
360          pointerSpeed = MIN_SPEED;
361      } else if (pointerSpeed > MAX_SPEED) {
362          pointerSpeed = MAX_SPEED;
363      }
364      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
365      CHKPP(jsPointer);
366      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
367      return jsPointerMgr->SetPointerSpeedSync(env, pointerSpeed);
368  }
369  
GetPointerSpeed(napi_env env,napi_callback_info info)370  napi_value JsPointerContext::GetPointerSpeed(napi_env env, napi_callback_info info)
371  {
372      CALL_DEBUG_ENTER;
373      size_t argc = 1;
374      napi_value argv[1] = { 0 };
375      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
376      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
377      CHKPP(jsPointer);
378      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
379      if (argc < 1) {
380          return jsPointerMgr->GetPointerSpeed(env);
381      }
382      if (!JsCommon::TypeOf(env, argv[0], napi_function)) {
383          MMI_HILOGE("Callback parameter type is invalid");
384          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
385          return nullptr;
386      }
387  
388      return jsPointerMgr->GetPointerSpeed(env, argv[0]);
389  }
390  
GetPointerSpeedSync(napi_env env,napi_callback_info info)391  napi_value JsPointerContext::GetPointerSpeedSync(napi_env env, napi_callback_info info)
392  {
393      CALL_DEBUG_ENTER;
394      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
395      CHKPP(jsPointer);
396      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
397      return jsPointerMgr->GetPointerSpeedSync(env);
398  }
399  
SetMouseScrollRows(napi_env env,napi_callback_info info)400  napi_value JsPointerContext::SetMouseScrollRows(napi_env env, napi_callback_info info)
401  {
402      CALL_DEBUG_ENTER;
403      size_t argc = 2;
404      napi_value argv[2] = { 0 };
405      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
406      if (argc < 1) {
407          MMI_HILOGE("At least 1 parameter is required");
408          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "rows", "number");
409          return nullptr;
410      }
411      if (!JsCommon::TypeOf(env, argv[0], napi_number)) {
412          MMI_HILOGE("Rows parameter type is invalid");
413          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "rows", "number");
414          return nullptr;
415      }
416      int32_t rows = DEFAULT_ROWS;
417      CHKRP(napi_get_value_int32(env, argv[0], &rows), GET_VALUE_INT32);
418      if (rows < MIN_ROWS) {
419          rows = MIN_ROWS;
420      } else if (rows > MAX_ROWS) {
421          rows = MAX_ROWS;
422      }
423      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
424      CHKPP(jsPointer);
425      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
426      if (argc == 1) {
427          return jsPointerMgr->SetMouseScrollRows(env, rows);
428      }
429      if (!JsCommon::TypeOf(env, argv[1], napi_function)) {
430          MMI_HILOGE("Callback parameter type is invalid");
431          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
432          return nullptr;
433      }
434      return jsPointerMgr->SetMouseScrollRows(env, rows, argv[1]);
435  }
436  
GetMouseScrollRows(napi_env env,napi_callback_info info)437  napi_value JsPointerContext::GetMouseScrollRows(napi_env env, napi_callback_info info)
438  {
439      CALL_DEBUG_ENTER;
440      size_t argc = 1;
441      napi_value argv[1] = { 0 };
442      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
443      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
444      CHKPP(jsPointer);
445      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
446      if (argc < 1) {
447          return jsPointerMgr->GetMouseScrollRows(env);
448      }
449      if (!JsCommon::TypeOf(env, argv[0], napi_function)) {
450          MMI_HILOGE("Callback parameter type is invalid");
451          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
452          return nullptr;
453      }
454  
455      return jsPointerMgr->GetMouseScrollRows(env, argv[0]);
456  }
457  
SetPointerLocation(napi_env env,napi_callback_info info)458  napi_value JsPointerContext::SetPointerLocation(napi_env env, napi_callback_info info)
459  {
460      CALL_DEBUG_ENTER;
461      size_t argc = 3;
462      napi_value argv[3] = { 0 };
463      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
464      if (argc < INPUT_PARAMETER) {
465          MMI_HILOGE("At least 2 parameter is required");
466          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "x", "number");
467          return nullptr;
468      }
469      if (!JsCommon::TypeOf(env, argv[0], napi_number)) {
470          MMI_HILOGE("x parameter type is invalid");
471          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "x", "number");
472          return nullptr;
473      }
474      int32_t x = 0;
475      CHKRP(napi_get_value_int32(env, argv[0], &x), GET_VALUE_INT32);
476      if (x < 0) {
477          MMI_HILOGE("Invalid x");
478          THROWERR_CUSTOM(env, COMMON_PARAMETER_ERROR, "x is invalid");
479          return nullptr;
480      }
481      if (!JsCommon::TypeOf(env, argv[1], napi_number)) {
482          MMI_HILOGE("y parameter type is invalid");
483          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "y", "number");
484          return nullptr;
485      }
486      int32_t y = 0;
487      CHKRP(napi_get_value_int32(env, argv[1], &y), GET_VALUE_INT32);
488      if (y < 0) {
489          MMI_HILOGE("Invalid y");
490          THROWERR_CUSTOM(env, COMMON_PARAMETER_ERROR, "y is invalid");
491          return nullptr;
492      }
493      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
494      CHKPP(jsPointer);
495      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
496      if (argc == INPUT_PARAMETER) {
497          return jsPointerMgr->SetPointerLocation(env, x, y);
498      }
499      if (!JsCommon::TypeOf(env, argv[INPUT_PARAMETER], napi_function)) {
500          MMI_HILOGE("Callback parameter type is invalid");
501          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
502          return nullptr;
503      }
504      return jsPointerMgr->SetPointerLocation(env, x, y, argv[INPUT_PARAMETER]);
505  }
506  
SetCustomCursor(napi_env env,napi_callback_info info)507  napi_value JsPointerContext::SetCustomCursor(napi_env env, napi_callback_info info)
508  {
509      CALL_DEBUG_ENTER;
510      size_t argc = 4;
511      napi_value argv[4] = { 0 };
512      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
513      if (argc < INPUT_PARAMETER) {
514          MMI_HILOGE("At least 2 parameter is required");
515          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "windowId", "number");
516          return nullptr;
517      }
518  
519      int32_t windowId = GetWindowId(env, argv[0]);
520      if (windowId == INVALID_VALUE) {
521          return nullptr;
522      }
523  
524      if (!JsCommon::TypeOf(env, argv[1], napi_object)) {
525          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "pixelMap", "napi_object");
526          return nullptr;
527      }
528      std::shared_ptr<Media::PixelMap> pixelMap = Media::PixelMapNapi::GetPixelMap(env, argv[1]);
529      if (pixelMap == nullptr) {
530          THROWERR_CUSTOM(env, COMMON_PARAMETER_ERROR, "pixelMap is invalid");
531          return nullptr;
532      }
533      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
534      CHKPP(jsPointer);
535      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
536      CursorFocus cursorFocus;
537      if (argc == INPUT_PARAMETER) {
538          return jsPointerMgr->SetCustomCursor(env, windowId, (void *)pixelMap.get(), cursorFocus);
539      }
540  
541      cursorFocus.x = GetCursorFocusX(env, argv[INPUT_PARAMETER]);
542      if (cursorFocus.x == INVALID_VALUE) {
543          return nullptr;
544      }
545      if (argc == THREE_PARAMETERS) {
546          return jsPointerMgr->SetCustomCursor(env, windowId, (void *)pixelMap.get(), cursorFocus);
547      }
548  
549      cursorFocus.y = GetCursorFocusY(env, argv[THREE_PARAMETERS]);
550      if (cursorFocus.y == INVALID_VALUE) {
551          return nullptr;
552      }
553      return jsPointerMgr->SetCustomCursor(env, windowId, (void *)pixelMap.get(), cursorFocus);
554  }
555  
SetCustomCursorSync(napi_env env,napi_callback_info info)556  napi_value JsPointerContext::SetCustomCursorSync(napi_env env, napi_callback_info info)
557  {
558      CALL_DEBUG_ENTER;
559      size_t argc = 4;
560      napi_value argv[4] = { 0 };
561      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
562      if (argc < INPUT_PARAMETER) {
563          MMI_HILOGE("At least 2 parameter is required");
564          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "windowId", "number");
565          return nullptr;
566      }
567  
568      int32_t windowId = GetWindowId(env, argv[0]);
569      if (windowId == INVALID_VALUE) {
570          return nullptr;
571      }
572  
573      if (!JsCommon::TypeOf(env, argv[1], napi_object)) {
574          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "pixelMap", "napi_object");
575          return nullptr;
576      }
577      std::shared_ptr<Media::PixelMap> pixelMap = Media::PixelMapNapi::GetPixelMap(env, argv[1]);
578      if (pixelMap == nullptr) {
579          THROWERR_CUSTOM(env, COMMON_PARAMETER_ERROR, "pixelMap is invalid");
580          return nullptr;
581      }
582      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
583      CHKPP(jsPointer);
584      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
585      CursorFocus cursorFocus;
586      if (argc == INPUT_PARAMETER) {
587          return jsPointerMgr->SetCustomCursorSync(env, windowId, (void *)pixelMap.get(), cursorFocus);
588      }
589  
590      cursorFocus.x = GetCursorFocusX(env, argv[INPUT_PARAMETER]);
591      if (cursorFocus.x == INVALID_VALUE) {
592          return nullptr;
593      }
594      if (argc == THREE_PARAMETERS) {
595          return jsPointerMgr->SetCustomCursorSync(env, windowId, (void *)pixelMap.get(), cursorFocus);
596      }
597  
598      cursorFocus.y = GetCursorFocusY(env, argv[THREE_PARAMETERS]);
599      if (cursorFocus.y == INVALID_VALUE) {
600          return nullptr;
601      }
602      return jsPointerMgr->SetCustomCursorSync(env, windowId, (void *)pixelMap.get(), cursorFocus);
603  }
604  
GetWindowId(napi_env env,napi_value value)605  int32_t JsPointerContext::GetWindowId(napi_env env, napi_value value)
606  {
607      if (!JsCommon::TypeOf(env, value, napi_number)) {
608          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "windowId", "number");
609          return INVALID_VALUE;
610      }
611      int32_t windowId = 0;
612      CHKRR(napi_get_value_int32(env, value, &windowId), GET_VALUE_INT32, INVALID_VALUE);
613      if (windowId < 0 && windowId != GLOBAL_WINDOW_ID) {
614          THROWERR_CUSTOM(env, COMMON_PARAMETER_ERROR, "Windowid is invalid");
615          return INVALID_VALUE;
616      }
617      return windowId;
618  }
619  
GetCursorFocusX(napi_env env,napi_value value)620  int32_t JsPointerContext::GetCursorFocusX(napi_env env, napi_value value)
621  {
622      if (!JsCommon::TypeOf(env, value, napi_number)) {
623          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "focusX", "number");
624          return INVALID_VALUE;
625      }
626      int32_t focusX = 0;
627      CHKRR(napi_get_value_int32(env, value, &focusX), GET_VALUE_INT32, INVALID_VALUE);
628      if (focusX < 0) {
629          THROWERR_CUSTOM(env, COMMON_PARAMETER_ERROR, "focusX is invalid");
630          return INVALID_VALUE;
631      }
632      return focusX;
633  }
634  
GetCursorFocusY(napi_env env,napi_value value)635  int32_t JsPointerContext::GetCursorFocusY(napi_env env, napi_value value)
636  {
637      if (!JsCommon::TypeOf(env, value, napi_number)) {
638          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "focusY", "number");
639          return INVALID_VALUE;
640      }
641      int32_t focusY = 0;
642      CHKRR(napi_get_value_int32(env, value, &focusY), GET_VALUE_INT32, INVALID_VALUE);
643      if (focusY < 0) {
644          THROWERR_CUSTOM(env, COMMON_PARAMETER_ERROR, "focusY is invalid");
645          return INVALID_VALUE;
646      }
647      return focusY;
648  }
649  
SetPointerSize(napi_env env,napi_callback_info info)650  napi_value JsPointerContext::SetPointerSize(napi_env env, napi_callback_info info)
651  {
652      CALL_DEBUG_ENTER;
653      size_t argc = 2;
654      napi_value argv[2] = { 0 };
655      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
656      if (argc < 1) {
657          MMI_HILOGE("At least 1 parameter is required");
658          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "size", "number");
659          return nullptr;
660      }
661      if (!JsCommon::TypeOf(env, argv[0], napi_number)) {
662          MMI_HILOGE("Size parameter type is invalid");
663          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "size", "number");
664          return nullptr;
665      }
666      int32_t size = DEFAULT_POINTER_SIZE;
667      CHKRP(napi_get_value_int32(env, argv[0], &size), GET_VALUE_INT32);
668      if (size < MIN_POINTER_SIZE) {
669          size = MIN_POINTER_SIZE;
670      } else if (size > MAX_POINTER_SIZE) {
671          size = MAX_POINTER_SIZE;
672      }
673      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
674      CHKPP(jsPointer);
675      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
676      if (argc == 1) {
677          return jsPointerMgr->SetPointerSize(env, size);
678      }
679      if (!JsCommon::TypeOf(env, argv[1], napi_function)) {
680          MMI_HILOGE("Callback parameter type is invalid");
681          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
682          return nullptr;
683      }
684      return jsPointerMgr->SetPointerSize(env, size, argv[1]);
685  }
686  
GetPointerSize(napi_env env,napi_callback_info info)687  napi_value JsPointerContext::GetPointerSize(napi_env env, napi_callback_info info)
688  {
689      CALL_DEBUG_ENTER;
690      size_t argc = 1;
691      napi_value argv[1] = { 0 };
692      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
693      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
694      CHKPP(jsPointer);
695      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
696      if (argc < 1) {
697          return jsPointerMgr->GetPointerSize(env);
698      }
699      if (!JsCommon::TypeOf(env, argv[0], napi_function)) {
700          MMI_HILOGE("Callback parameter type is invalid");
701          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
702          return nullptr;
703      }
704  
705      return jsPointerMgr->GetPointerSize(env, argv[0]);
706  }
707  
SetPointerSizeSync(napi_env env,napi_callback_info info)708  napi_value JsPointerContext::SetPointerSizeSync(napi_env env, napi_callback_info info)
709  {
710      CALL_DEBUG_ENTER;
711      size_t argc = 1;
712      napi_value argv[1] = { 0 };
713      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
714      if (argc < 1) {
715          MMI_HILOGE("At least 1 parameter is required");
716          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "size", "number");
717          return nullptr;
718      }
719      if (!JsCommon::TypeOf(env, argv[0], napi_number)) {
720          MMI_HILOGE("Size parameter type is invalid");
721          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "size", "number");
722          return nullptr;
723      }
724      int32_t size = DEFAULT_POINTER_SIZE;
725      CHKRP(napi_get_value_int32(env, argv[0], &size), GET_VALUE_INT32);
726      if (size < MIN_POINTER_SIZE) {
727          size = MIN_POINTER_SIZE;
728      } else if (size > MAX_POINTER_SIZE) {
729          size = MAX_POINTER_SIZE;
730      }
731      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
732      CHKPP(jsPointer);
733      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
734      return jsPointerMgr->SetPointerSizeSync(env, size);
735  }
736  
GetPointerSizeSync(napi_env env,napi_callback_info info)737  napi_value JsPointerContext::GetPointerSizeSync(napi_env env, napi_callback_info info)
738  {
739      CALL_DEBUG_ENTER;
740      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
741      CHKPP(jsPointer);
742      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
743      return jsPointerMgr->GetPointerSizeSync(env);
744  }
745  
SetPointerStyle(napi_env env,napi_callback_info info)746  napi_value JsPointerContext::SetPointerStyle(napi_env env, napi_callback_info info)
747  {
748      CALL_DEBUG_ENTER;
749      size_t argc = 3;
750      napi_value argv[3] = { 0 };
751      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
752      if (argc < INPUT_PARAMETER) {
753          MMI_HILOGE("At least 2 parameter is required");
754          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "windowId", "number");
755          return nullptr;
756      }
757      if (!JsCommon::TypeOf(env, argv[0], napi_number)) {
758          MMI_HILOGE("windowId parameter type is invalid");
759          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "windowId", "number");
760          return nullptr;
761      }
762      int32_t windowid = 0;
763      CHKRP(napi_get_value_int32(env, argv[0], &windowid), GET_VALUE_INT32);
764      if (windowid < 0 && windowid != GLOBAL_WINDOW_ID) {
765          MMI_HILOGE("Invalid windowid");
766          THROWERR_CUSTOM(env, COMMON_PARAMETER_ERROR, "Windowid is invalid");
767          return nullptr;
768      }
769      if (!JsCommon::TypeOf(env, argv[1], napi_number)) {
770          MMI_HILOGE("pointerStyle parameter type is invalid");
771          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "pointerStyle", "number");
772          return nullptr;
773      }
774      int32_t pointerStyle = 0;
775      CHKRP(napi_get_value_int32(env, argv[1], &pointerStyle), GET_VALUE_INT32);
776      if ((pointerStyle < DEFAULT && pointerStyle != DEVELOPER_DEFINED_ICON) || pointerStyle > RUNNING) {
777          MMI_HILOGE("Undefined pointer style");
778          THROWERR_CUSTOM(env, COMMON_PARAMETER_ERROR, "Pointer style does not exist");
779          return nullptr;
780      }
781      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
782      CHKPP(jsPointer);
783      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
784      if (argc == INPUT_PARAMETER) {
785          return jsPointerMgr->SetPointerStyle(env, windowid, pointerStyle);
786      }
787      if (!JsCommon::TypeOf(env, argv[INPUT_PARAMETER], napi_function)) {
788          MMI_HILOGE("Callback parameter type is invalid");
789          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
790          return nullptr;
791      }
792      return jsPointerMgr->SetPointerStyle(env, windowid, pointerStyle, argv[INPUT_PARAMETER]);
793  }
794  
SetPointerStyleSync(napi_env env,napi_callback_info info)795  napi_value JsPointerContext::SetPointerStyleSync(napi_env env, napi_callback_info info)
796  {
797      CALL_DEBUG_ENTER;
798      size_t argc = 2;
799      napi_value argv[2] = { 0 };
800      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
801      if (argc < INPUT_PARAMETER) {
802          MMI_HILOGE("At least 2 parameter is required");
803          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "windowId", "number");
804          return nullptr;
805      }
806      if (!JsCommon::TypeOf(env, argv[0], napi_number)) {
807          MMI_HILOGE("windowId parameter type is invalid");
808          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "windowId", "number");
809          return nullptr;
810      }
811      int32_t windowid = 0;
812      CHKRP(napi_get_value_int32(env, argv[0], &windowid), GET_VALUE_INT32);
813      if (windowid < 0 && windowid != GLOBAL_WINDOW_ID) {
814          MMI_HILOGE("Invalid windowid");
815          THROWERR_CUSTOM(env, COMMON_PARAMETER_ERROR, "Windowid is invalid");
816          return nullptr;
817      }
818      if (!JsCommon::TypeOf(env, argv[1], napi_number)) {
819          MMI_HILOGE("pointerStyle parameter type is invalid");
820          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "pointerStyle", "number");
821          return nullptr;
822      }
823      int32_t pointerStyle = 0;
824      CHKRP(napi_get_value_int32(env, argv[1], &pointerStyle), GET_VALUE_INT32);
825      if ((pointerStyle < DEFAULT && pointerStyle != DEVELOPER_DEFINED_ICON) || pointerStyle > RUNNING) {
826          MMI_HILOGE("Undefined pointer style");
827          THROWERR_CUSTOM(env, COMMON_PARAMETER_ERROR, "Pointer style does not exist");
828          return nullptr;
829      }
830      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
831      CHKPP(jsPointer);
832      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
833      return jsPointerMgr->SetPointerStyleSync(env, windowid, pointerStyle);
834  }
835  
GetPointerStyle(napi_env env,napi_callback_info info)836  napi_value JsPointerContext::GetPointerStyle(napi_env env, napi_callback_info info)
837  {
838      CALL_DEBUG_ENTER;
839      size_t argc = 2;
840      napi_value argv[2] = { 0 };
841      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
842      if (argc < 1) {
843          MMI_HILOGE("At least 1 parameter is required");
844          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "windowId", "number");
845          return nullptr;
846      }
847      if (!JsCommon::TypeOf(env, argv[0], napi_number)) {
848          MMI_HILOGE("windowId parameter type is invalid");
849          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "windowId", "number");
850          return nullptr;
851      }
852      int32_t windowid = 0;
853      CHKRP(napi_get_value_int32(env, argv[0], &windowid), GET_VALUE_INT32);
854      if (windowid < 0 && windowid != GLOBAL_WINDOW_ID) {
855          MMI_HILOGE("Invalid windowid");
856          THROWERR_CUSTOM(env, COMMON_PARAMETER_ERROR, "Windowid is invalid");
857          return nullptr;
858      }
859      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
860      CHKPP(jsPointer);
861      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
862      if (argc == 1) {
863          return jsPointerMgr->GetPointerStyle(env, windowid);
864      }
865      if (!JsCommon::TypeOf(env, argv[1], napi_function)) {
866          MMI_HILOGE("Callback parameter type is invalid");
867          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
868          return nullptr;
869      }
870      return jsPointerMgr->GetPointerStyle(env, windowid, argv[1]);
871  }
872  
GetPointerStyleSync(napi_env env,napi_callback_info info)873  napi_value JsPointerContext::GetPointerStyleSync(napi_env env, napi_callback_info info)
874  {
875      CALL_DEBUG_ENTER;
876      size_t argc = 1;
877      napi_value argv[1] = { 0 };
878      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
879      if (argc < 1) {
880          MMI_HILOGE("At least 1 parameter is required");
881          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "windowId", "number");
882          return nullptr;
883      }
884      if (!JsCommon::TypeOf(env, argv[0], napi_number)) {
885          MMI_HILOGE("windowId parameter type is invalid");
886          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "windowId", "number");
887          return nullptr;
888      }
889      int32_t windowId = 0;
890      CHKRP(napi_get_value_int32(env, argv[0], &windowId), GET_VALUE_INT32);
891      if (windowId < 0 && windowId != GLOBAL_WINDOW_ID) {
892          MMI_HILOGE("Invalid windowId");
893          THROWERR_CUSTOM(env, COMMON_PARAMETER_ERROR, "WindowId is invalid");
894          return nullptr;
895      }
896      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
897      CHKPP(jsPointer);
898      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
899      return jsPointerMgr->GetPointerStyleSync(env, windowId);
900  }
901  
CreatePointerStyle(napi_env env,napi_value exports)902  napi_value JsPointerContext::CreatePointerStyle(napi_env env, napi_value exports)
903  {
904      CALL_DEBUG_ENTER;
905      napi_value defaults = nullptr;
906      CHKRP(napi_create_int32(env, MOUSE_ICON::DEFAULT, &defaults), CREATE_INT32);
907      napi_value east = nullptr;
908      CHKRP(napi_create_int32(env, MOUSE_ICON::EAST, &east), CREATE_INT32);
909      napi_value west = nullptr;
910      CHKRP(napi_create_int32(env, MOUSE_ICON::WEST, &west), CREATE_INT32);
911      napi_value south = nullptr;
912      CHKRP(napi_create_int32(env, MOUSE_ICON::SOUTH, &south), CREATE_INT32);
913      napi_value north = nullptr;
914      CHKRP(napi_create_int32(env, MOUSE_ICON::NORTH, &north), CREATE_INT32);
915      napi_value west_east = nullptr;
916      CHKRP(napi_create_int32(env, MOUSE_ICON::WEST_EAST, &west_east), CREATE_INT32);
917      napi_value north_south = nullptr;
918      CHKRP(napi_create_int32(env, MOUSE_ICON::NORTH_SOUTH, &north_south), CREATE_INT32);
919      napi_value north_east = nullptr;
920      CHKRP(napi_create_int32(env, MOUSE_ICON::NORTH_EAST, &north_east), CREATE_INT32);
921      napi_value north_west = nullptr;
922      CHKRP(napi_create_int32(env, MOUSE_ICON::NORTH_WEST, &north_west), CREATE_INT32);
923      napi_value south_east = nullptr;
924      CHKRP(napi_create_int32(env, MOUSE_ICON::SOUTH_EAST, &south_east), CREATE_INT32);
925      napi_value south_west = nullptr;
926      CHKRP(napi_create_int32(env, MOUSE_ICON::SOUTH_WEST, &south_west), CREATE_INT32);
927      napi_value north_east_south_west = nullptr;
928      CHKRP(napi_create_int32(env, MOUSE_ICON::NORTH_EAST_SOUTH_WEST, &north_east_south_west), CREATE_INT32);
929      napi_value north_west_south_east = nullptr;
930      CHKRP(napi_create_int32(env, MOUSE_ICON::NORTH_WEST_SOUTH_EAST, &north_west_south_east), CREATE_INT32);
931      napi_value cross = nullptr;
932      CHKRP(napi_create_int32(env, MOUSE_ICON::CROSS, &cross), CREATE_INT32);
933      napi_value cursor_copy = nullptr;
934      CHKRP(napi_create_int32(env, MOUSE_ICON::CURSOR_COPY, &cursor_copy), CREATE_INT32);
935      napi_value cursor_forbid = nullptr;
936      CHKRP(napi_create_int32(env, MOUSE_ICON::CURSOR_FORBID, &cursor_forbid), CREATE_INT32);
937      napi_value color_sucker = nullptr;
938      CHKRP(napi_create_int32(env, MOUSE_ICON::COLOR_SUCKER, &color_sucker), CREATE_INT32);
939      napi_value hand_grabbing = nullptr;
940      CHKRP(napi_create_int32(env, MOUSE_ICON::HAND_GRABBING, &hand_grabbing), CREATE_INT32);
941      napi_value hand_open = nullptr;
942      CHKRP(napi_create_int32(env, MOUSE_ICON::HAND_OPEN, &hand_open), CREATE_INT32);
943      napi_value hand_pointing = nullptr;
944      CHKRP(napi_create_int32(env, MOUSE_ICON::HAND_POINTING, &hand_pointing), CREATE_INT32);
945      napi_value help = nullptr;
946      CHKRP(napi_create_int32(env, MOUSE_ICON::HELP, &help), CREATE_INT32);
947      napi_value move = nullptr;
948      CHKRP(napi_create_int32(env, MOUSE_ICON::CURSOR_MOVE, &move), CREATE_INT32);
949      napi_value resize_left_right = nullptr;
950      CHKRP(napi_create_int32(env, MOUSE_ICON::RESIZE_LEFT_RIGHT, &resize_left_right), CREATE_INT32);
951      napi_value resize_up_down = nullptr;
952      CHKRP(napi_create_int32(env, MOUSE_ICON::RESIZE_UP_DOWN, &resize_up_down), CREATE_INT32);
953      napi_value screenshot_choose = nullptr;
954      CHKRP(napi_create_int32(env, MOUSE_ICON::SCREENSHOT_CHOOSE, &screenshot_choose), CREATE_INT32);
955      napi_value screenshot_cursor = nullptr;
956      CHKRP(napi_create_int32(env, MOUSE_ICON::SCREENSHOT_CURSOR, &screenshot_cursor), CREATE_INT32);
957      napi_value text_cursor = nullptr;
958      CHKRP(napi_create_int32(env, MOUSE_ICON::TEXT_CURSOR, &text_cursor), CREATE_INT32);
959      napi_value zoom_in = nullptr;
960      CHKRP(napi_create_int32(env, MOUSE_ICON::ZOOM_IN, &zoom_in), CREATE_INT32);
961      napi_value zoom_out = nullptr;
962      CHKRP(napi_create_int32(env, MOUSE_ICON::ZOOM_OUT, &zoom_out), CREATE_INT32);
963      napi_value middle_btn_east = nullptr;
964      CHKRP(napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_EAST, &middle_btn_east), CREATE_INT32);
965      napi_value middle_btn_west = nullptr;
966      CHKRP(napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_WEST, &middle_btn_west), CREATE_INT32);
967      napi_value middle_btn_south = nullptr;
968      CHKRP(napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_SOUTH, &middle_btn_south), CREATE_INT32);
969      napi_value middle_btn_north = nullptr;
970      CHKRP(napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_NORTH, &middle_btn_north), CREATE_INT32);
971      napi_value middle_btn_north_south = nullptr;
972      CHKRP(napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_NORTH_SOUTH, &middle_btn_north_south), CREATE_INT32);
973      napi_value middle_btn_north_east = nullptr;
974      CHKRP(napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_NORTH_EAST, &middle_btn_north_east), CREATE_INT32);
975      napi_value middle_btn_north_west = nullptr;
976      CHKRP(napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_NORTH_WEST, &middle_btn_north_west), CREATE_INT32);
977      napi_value middle_btn_south_east = nullptr;
978      CHKRP(napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_SOUTH_EAST, &middle_btn_south_east), CREATE_INT32);
979      napi_value middle_btn_south_west = nullptr;
980      CHKRP(napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_SOUTH_WEST, &middle_btn_south_west), CREATE_INT32);
981      napi_value middle_btn_north_south_west_east = nullptr;
982      CHKRP(napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_NORTH_SOUTH_WEST_EAST,
983          &middle_btn_north_south_west_east), CREATE_INT32);
984      napi_value horizontal_text_cursor = nullptr;
985      CHKRP(napi_create_int32(env, MOUSE_ICON::HORIZONTAL_TEXT_CURSOR, &horizontal_text_cursor), CREATE_INT32);
986      napi_value cursor_cross = nullptr;
987      CHKRP(napi_create_int32(env, MOUSE_ICON::CURSOR_CROSS, &cursor_cross), CREATE_INT32);
988      napi_value cursor_circle = nullptr;
989      CHKRP(napi_create_int32(env, MOUSE_ICON::CURSOR_CIRCLE, &cursor_circle), CREATE_INT32);
990      napi_value loading = nullptr;
991      CHKRP(napi_create_int32(env, MOUSE_ICON::LOADING, &loading), CREATE_INT32);
992      napi_value running = nullptr;
993      CHKRP(napi_create_int32(env, MOUSE_ICON::RUNNING, &running), CREATE_INT32);
994      napi_value developer_defined_icon = nullptr;
995      CHKRP(napi_create_int32(env, MOUSE_ICON::DEVELOPER_DEFINED_ICON, &developer_defined_icon), CREATE_INT32);
996  
997      napi_property_descriptor desc[] = {
998          DECLARE_NAPI_STATIC_PROPERTY("DEFAULT", defaults),
999          DECLARE_NAPI_STATIC_PROPERTY("EAST", east),
1000          DECLARE_NAPI_STATIC_PROPERTY("WEST", west),
1001          DECLARE_NAPI_STATIC_PROPERTY("SOUTH", south),
1002          DECLARE_NAPI_STATIC_PROPERTY("NORTH", north),
1003          DECLARE_NAPI_STATIC_PROPERTY("WEST_EAST", west_east),
1004          DECLARE_NAPI_STATIC_PROPERTY("NORTH_SOUTH", north_south),
1005          DECLARE_NAPI_STATIC_PROPERTY("NORTH_EAST", north_east),
1006          DECLARE_NAPI_STATIC_PROPERTY("NORTH_WEST", north_west),
1007          DECLARE_NAPI_STATIC_PROPERTY("SOUTH_EAST", south_east),
1008          DECLARE_NAPI_STATIC_PROPERTY("SOUTH_WEST", south_west),
1009          DECLARE_NAPI_STATIC_PROPERTY("NORTH_EAST_SOUTH_WEST", north_east_south_west),
1010          DECLARE_NAPI_STATIC_PROPERTY("NORTH_WEST_SOUTH_EAST", north_west_south_east),
1011          DECLARE_NAPI_STATIC_PROPERTY("CROSS", cross),
1012          DECLARE_NAPI_STATIC_PROPERTY("CURSOR_COPY", cursor_copy),
1013          DECLARE_NAPI_STATIC_PROPERTY("CURSOR_FORBID", cursor_forbid),
1014          DECLARE_NAPI_STATIC_PROPERTY("COLOR_SUCKER", color_sucker),
1015          DECLARE_NAPI_STATIC_PROPERTY("HAND_GRABBING", hand_grabbing),
1016          DECLARE_NAPI_STATIC_PROPERTY("HAND_OPEN", hand_open),
1017          DECLARE_NAPI_STATIC_PROPERTY("HAND_POINTING", hand_pointing),
1018          DECLARE_NAPI_STATIC_PROPERTY("HELP", help),
1019          DECLARE_NAPI_STATIC_PROPERTY("MOVE", move),
1020          DECLARE_NAPI_STATIC_PROPERTY("RESIZE_LEFT_RIGHT", resize_left_right),
1021          DECLARE_NAPI_STATIC_PROPERTY("RESIZE_UP_DOWN", resize_up_down),
1022          DECLARE_NAPI_STATIC_PROPERTY("SCREENSHOT_CHOOSE", screenshot_choose),
1023          DECLARE_NAPI_STATIC_PROPERTY("SCREENSHOT_CURSOR", screenshot_cursor),
1024          DECLARE_NAPI_STATIC_PROPERTY("TEXT_CURSOR", text_cursor),
1025          DECLARE_NAPI_STATIC_PROPERTY("ZOOM_IN", zoom_in),
1026          DECLARE_NAPI_STATIC_PROPERTY("ZOOM_OUT", zoom_out),
1027          DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_EAST", middle_btn_east),
1028          DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_WEST", middle_btn_west),
1029          DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_SOUTH", middle_btn_south),
1030          DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_NORTH", middle_btn_north),
1031          DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_NORTH_SOUTH", middle_btn_north_south),
1032          DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_NORTH_EAST", middle_btn_north_east),
1033          DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_NORTH_WEST", middle_btn_north_west),
1034          DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_SOUTH_EAST", middle_btn_south_east),
1035          DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_SOUTH_WEST", middle_btn_south_west),
1036          DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_NORTH_SOUTH_WEST_EAST", middle_btn_north_south_west_east),
1037          DECLARE_NAPI_STATIC_PROPERTY("HORIZONTAL_TEXT_CURSOR", horizontal_text_cursor),
1038          DECLARE_NAPI_STATIC_PROPERTY("CURSOR_CROSS", cursor_cross),
1039          DECLARE_NAPI_STATIC_PROPERTY("CURSOR_CIRCLE", cursor_circle),
1040          DECLARE_NAPI_STATIC_PROPERTY("LOADING", loading),
1041          DECLARE_NAPI_STATIC_PROPERTY("RUNNING", running),
1042          DECLARE_NAPI_STATIC_PROPERTY("DEVELOPER_DEFINED_ICON", developer_defined_icon),
1043      };
1044      napi_value result = nullptr;
1045      CHKRP(napi_define_class(env, "PointerStyle", NAPI_AUTO_LENGTH, EnumConstructor, nullptr,
1046          sizeof(desc) / sizeof(*desc), desc, &result), DEFINE_CLASS);
1047      CHKRP(napi_set_named_property(env, exports, "PointerStyle", result), SET_NAMED_PROPERTY);
1048      return exports;
1049  }
1050  
CreateTouchpadRightClickType(napi_env env,napi_value exports)1051  napi_value JsPointerContext::CreateTouchpadRightClickType(napi_env env, napi_value exports)
1052  {
1053      CALL_DEBUG_ENTER;
1054      napi_value touchpad_right_button = nullptr;
1055      CHKRP(napi_create_int32(env, RightClickType::TOUCHPAD_RIGHT_BUTTON, &touchpad_right_button), CREATE_INT32);
1056      napi_value touchpad_left_button = nullptr;
1057      CHKRP(napi_create_int32(env, RightClickType::TOUCHPAD_LEFT_BUTTON, &touchpad_left_button), CREATE_INT32);
1058      napi_value touchpad_two_finger_tap = nullptr;
1059      CHKRP(napi_create_int32(env, RightClickType::TOUCHPAD_TWO_FINGER_TAP, &touchpad_two_finger_tap), CREATE_INT32);
1060  
1061      napi_property_descriptor desc[] = {
1062          DECLARE_NAPI_STATIC_PROPERTY("TOUCHPAD_RIGHT_BUTTON", touchpad_right_button),
1063          DECLARE_NAPI_STATIC_PROPERTY("TOUCHPAD_LEFT_BUTTON", touchpad_left_button),
1064          DECLARE_NAPI_STATIC_PROPERTY("TOUCHPAD_TWO_FINGER_TAP", touchpad_two_finger_tap),
1065      };
1066      napi_value result = nullptr;
1067      CHKRP(napi_define_class(env, "RightClickType", NAPI_AUTO_LENGTH, EnumConstructor, nullptr,
1068          sizeof(desc) / sizeof(*desc), desc, &result), DEFINE_CLASS);
1069      CHKRP(napi_set_named_property(env, exports, "RightClickType", result), SET_NAMED_PROPERTY);
1070      return exports;
1071  }
1072  
EnumConstructor(napi_env env,napi_callback_info info)1073  napi_value JsPointerContext::EnumConstructor(napi_env env, napi_callback_info info)
1074  {
1075      CALL_DEBUG_ENTER;
1076      size_t argc = 0;
1077      napi_value args[1] = { 0 };
1078      napi_value ret = nullptr;
1079      void *data = nullptr;
1080      CHKRP(napi_get_cb_info(env, info, &argc, args, &ret, &data), GET_CB_INFO);
1081      return ret;
1082  }
1083  
EnterCaptureMode(napi_env env,napi_callback_info info)1084  napi_value JsPointerContext::EnterCaptureMode(napi_env env, napi_callback_info info)
1085  {
1086      CALL_DEBUG_ENTER;
1087      size_t argc = 2;
1088      napi_value argv[2] = { 0 };
1089      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
1090      if (argc < 1 || argc > INPUT_PARAMETER) {
1091          THROWERR(env, "The number of parameters is not as expected");
1092          return nullptr;
1093      }
1094      if (!JsCommon::TypeOf(env, argv[0], napi_number)) {
1095          THROWERR(env, "The first parameter type is invalid");
1096          return nullptr;
1097      }
1098  
1099      int32_t windowId = 0;
1100      CHKRP(napi_get_value_int32(env, argv[0], &windowId), GET_VALUE_INT32);
1101      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1102      CHKPP(jsPointer);
1103      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1104      if (argc == 1) {
1105          return jsPointerMgr->EnterCaptureMode(env, windowId);
1106      }
1107      if (!JsCommon::TypeOf(env, argv[1], napi_function)) {
1108          THROWERR(env, "The second parameter type is invalid");
1109          return nullptr;
1110      }
1111      return jsPointerMgr->EnterCaptureMode(env, windowId, argv[1]);
1112  }
1113  
LeaveCaptureMode(napi_env env,napi_callback_info info)1114  napi_value JsPointerContext::LeaveCaptureMode(napi_env env, napi_callback_info info)
1115  {
1116      CALL_DEBUG_ENTER;
1117      size_t argc = 2;
1118      napi_value argv[2] = { 0 };
1119      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
1120      if (argc < 1 || argc > INPUT_PARAMETER) {
1121          THROWERR(env, "The number of parameters is not as expected");
1122          return nullptr;
1123      }
1124      if (!JsCommon::TypeOf(env, argv[0], napi_number)) {
1125          THROWERR(env, "The first parameter type is invalid");
1126          return nullptr;
1127      }
1128  
1129      int32_t windowId = 0;
1130      CHKRP(napi_get_value_int32(env, argv[0], &windowId), GET_VALUE_INT32);
1131  
1132      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1133      CHKPP(jsPointer);
1134      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1135      if (argc == 1) {
1136          return jsPointerMgr->LeaveCaptureMode(env, windowId);
1137      }
1138      if (!JsCommon::TypeOf(env, argv[1], napi_function)) {
1139          THROWERR(env, "The second parameter type is invalid");
1140          return nullptr;
1141      }
1142      return jsPointerMgr->LeaveCaptureMode(env, windowId, argv[1]);
1143  }
1144  
CreateMousePrimaryButton(napi_env env,napi_value exports)1145  napi_value JsPointerContext::CreateMousePrimaryButton(napi_env env, napi_value exports)
1146  {
1147      CALL_DEBUG_ENTER;
1148      napi_value leftButton = nullptr;
1149      CHKRP(napi_create_int32(env, PrimaryButton::LEFT_BUTTON, &leftButton), CREATE_INT32);
1150      napi_value rightButton = nullptr;
1151      CHKRP(napi_create_int32(env, PrimaryButton::RIGHT_BUTTON, &rightButton), CREATE_INT32);
1152  
1153      napi_property_descriptor desc[] = {
1154          DECLARE_NAPI_STATIC_PROPERTY("LEFT", leftButton),
1155          DECLARE_NAPI_STATIC_PROPERTY("RIGHT", rightButton),
1156      };
1157      napi_value result = nullptr;
1158      CHKRP(napi_define_class(env, "PrimaryButton", NAPI_AUTO_LENGTH, EnumConstructor, nullptr,
1159          sizeof(desc) / sizeof(*desc), desc, &result), DEFINE_CLASS);
1160      CHKRP(napi_set_named_property(env, exports, "PrimaryButton", result), SET_NAMED_PROPERTY);
1161      return exports;
1162  }
1163  
SetMousePrimaryButton(napi_env env,napi_callback_info info)1164  napi_value JsPointerContext::SetMousePrimaryButton(napi_env env, napi_callback_info info)
1165  {
1166      CALL_DEBUG_ENTER;
1167      size_t argc = 2;
1168      napi_value argv[2] = { 0 };
1169      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
1170      if (argc < 1) {
1171          MMI_HILOGE("At least one parameter is required");
1172          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "primaryButton", "number");
1173          return nullptr;
1174      }
1175      if (!JsCommon::TypeOf(env, argv[0], napi_number)) {
1176          MMI_HILOGE("primaryButton parameter type is invalid");
1177          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "primaryButton", "number");
1178          return nullptr;
1179      }
1180      int32_t primaryButton = 0;
1181      CHKRP(napi_get_value_int32(env, argv[0], &primaryButton), GET_VALUE_INT32);
1182      if (primaryButton < LEFT_BUTTON || primaryButton > RIGHT_BUTTON) {
1183          MMI_HILOGE("Undefined mouse primary button");
1184          THROWERR_CUSTOM(env, COMMON_PARAMETER_ERROR, "Mouse primary button does not exist");
1185          return nullptr;
1186      }
1187      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1188      CHKPP(jsPointer);
1189      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1190      if (argc == 1) {
1191          return jsPointerMgr->SetMousePrimaryButton(env, primaryButton);
1192      }
1193      if (!JsCommon::TypeOf(env, argv[1], napi_function)) {
1194          MMI_HILOGE("Callback parameter type is invalid");
1195          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
1196          return nullptr;
1197      }
1198      return jsPointerMgr->SetMousePrimaryButton(env, primaryButton, argv[1]);
1199  }
1200  
GetMousePrimaryButton(napi_env env,napi_callback_info info)1201  napi_value JsPointerContext::GetMousePrimaryButton(napi_env env, napi_callback_info info)
1202  {
1203      CALL_DEBUG_ENTER;
1204      size_t argc = 1;
1205      napi_value argv[1] = { 0 };
1206      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
1207      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1208      CHKPP(jsPointer);
1209      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1210      if (argc < 1) {
1211          return jsPointerMgr->GetMousePrimaryButton(env);
1212      }
1213      if (!JsCommon::TypeOf(env, argv[0], napi_function)) {
1214          MMI_HILOGE("Callback parameter type is invalid");
1215          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
1216          return nullptr;
1217      }
1218      return jsPointerMgr->GetMousePrimaryButton(env, argv[0]);
1219  }
1220  
SetHoverScrollState(napi_env env,napi_callback_info info)1221  napi_value JsPointerContext::SetHoverScrollState(napi_env env, napi_callback_info info)
1222  {
1223      CALL_DEBUG_ENTER;
1224      size_t argc = 2;
1225      napi_value argv[2] = { 0 };
1226      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
1227      if (argc < 1) {
1228          MMI_HILOGE("At least one parameter is required");
1229          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "state", "boolean");
1230          return nullptr;
1231      }
1232      if (!JsCommon::TypeOf(env, argv[0], napi_boolean)) {
1233          MMI_HILOGE("State parameter type is invalid");
1234          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "state", "boolean");
1235          return nullptr;
1236      }
1237      bool state = true;
1238      CHKRP(napi_get_value_bool(env, argv[0], &state), GET_VALUE_BOOL);
1239  
1240      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1241      CHKPP(jsPointer);
1242      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1243      if (argc == 1) {
1244          return jsPointerMgr->SetHoverScrollState(env, state);
1245      }
1246      if (!JsCommon::TypeOf(env, argv[1], napi_function)) {
1247          MMI_HILOGE("Callback parameter type is invalid");
1248          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
1249          return nullptr;
1250      }
1251      return jsPointerMgr->SetHoverScrollState(env, state, argv[1]);
1252  }
1253  
GetHoverScrollState(napi_env env,napi_callback_info info)1254  napi_value JsPointerContext::GetHoverScrollState(napi_env env, napi_callback_info info)
1255  {
1256      CALL_DEBUG_ENTER;
1257      size_t argc = 1;
1258      napi_value argv[1] = { 0 };
1259      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
1260  
1261      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1262      CHKPP(jsPointer);
1263      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1264      if (argc < 1) {
1265          return jsPointerMgr->GetHoverScrollState(env);
1266      }
1267      if (!JsCommon::TypeOf(env, argv[0], napi_function)) {
1268          MMI_HILOGE("Callback parameter type is invalid");
1269          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
1270          return nullptr;
1271      }
1272      return jsPointerMgr->GetHoverScrollState(env, argv[0]);
1273  }
1274  
SetTouchpadBoolData(napi_env env,napi_callback_info info,SetTouchpadBoolDataFunc func)1275  napi_value JsPointerContext::SetTouchpadBoolData(napi_env env, napi_callback_info info, SetTouchpadBoolDataFunc func)
1276  {
1277      CALL_DEBUG_ENTER;
1278      if (!func) {
1279          MMI_HILOGE("func is nullptr");
1280          return nullptr;
1281      }
1282      size_t argc = 2;
1283      napi_value argv[2] = { 0 };
1284      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
1285      if (argc < 1) {
1286          MMI_HILOGE("At least one parameter is required");
1287          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "switchFlag", "boolean");
1288          return nullptr;
1289      }
1290      if (!JsCommon::TypeOf(env, argv[0], napi_boolean)) {
1291          MMI_HILOGE("Bool data parameter type is invalid");
1292          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "switchFlag", "boolean");
1293          return nullptr;
1294      }
1295      bool switchFlag = true;
1296      CHKRP(napi_get_value_bool(env, argv[0], &switchFlag), GET_VALUE_BOOL);
1297  
1298      if (argc == 1) {
1299          return func(env, switchFlag, nullptr);
1300      }
1301      if (!JsCommon::TypeOf(env, argv[1], napi_function)) {
1302          MMI_HILOGE("Callback parameter type is invalid");
1303          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
1304          return nullptr;
1305      }
1306      return func(env, switchFlag, argv[1]);
1307  }
1308  
SetTouchpadInt32Data(napi_env env,napi_callback_info info,SetTouchpadInt32DataFunc func,int32_t dataMax,int32_t dataMin)1309  napi_value JsPointerContext::SetTouchpadInt32Data(napi_env env, napi_callback_info info, SetTouchpadInt32DataFunc func,
1310      int32_t dataMax, int32_t dataMin)
1311  {
1312      CALL_DEBUG_ENTER;
1313      size_t argc = 2;
1314      napi_value argv[2] = { 0 };
1315      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
1316      if (argc < 1) {
1317          MMI_HILOGE("At least 1 parameter is required");
1318          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "data", "number");
1319          return nullptr;
1320      }
1321      if (!JsCommon::TypeOf(env, argv[0], napi_number)) {
1322          MMI_HILOGE("Int32 data parameter type is invalid");
1323          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "data", "number");
1324          return nullptr;
1325      }
1326      int32_t data = 0;
1327      CHKRP(napi_get_value_int32(env, argv[0], &data), GET_VALUE_INT32);
1328      if (data < dataMin) {
1329          data = dataMin;
1330      } else if (data > dataMax) {
1331          data = dataMax;
1332      }
1333  
1334      if (argc == 1) {
1335          return func(env, data, nullptr);
1336      }
1337      if (!JsCommon::TypeOf(env, argv[1], napi_function)) {
1338          MMI_HILOGE("Callback parameter type is invalid");
1339          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
1340          return nullptr;
1341      }
1342  
1343      return func(env, data, argv[1]);
1344  }
1345  
GetTouchpadData(napi_env env,napi_callback_info info,GetTouchpadFunc func)1346  napi_value JsPointerContext::GetTouchpadData(napi_env env, napi_callback_info info, GetTouchpadFunc func)
1347  {
1348      CALL_DEBUG_ENTER;
1349      size_t argc = 1;
1350      napi_value argv[1] = { 0 };
1351      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
1352  
1353      if (argc < 1) {
1354          return func(env, nullptr);
1355      }
1356      if (!JsCommon::TypeOf(env, argv[0], napi_function)) {
1357          MMI_HILOGE("Callback parameter type is invalid");
1358          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
1359          return nullptr;
1360      }
1361  
1362      return func(env, argv[0]);
1363  }
1364  
SetTouchpadScrollSwitch(napi_env env,napi_callback_info info)1365  napi_value JsPointerContext::SetTouchpadScrollSwitch(napi_env env, napi_callback_info info)
1366  {
1367      CALL_DEBUG_ENTER;
1368      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1369      CHKPP(jsPointer);
1370      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1371      CHKPP(jsPointerMgr);
1372      auto func = [jsPointerMgr] (napi_env env, bool switchFlag, napi_value handle) -> napi_value {
1373          return jsPointerMgr->SetTouchpadScrollSwitch(env, switchFlag, handle);
1374      };
1375      return SetTouchpadBoolData(env, info, func);
1376  }
1377  
GetTouchpadScrollSwitch(napi_env env,napi_callback_info info)1378  napi_value JsPointerContext::GetTouchpadScrollSwitch(napi_env env, napi_callback_info info)
1379  {
1380      CALL_DEBUG_ENTER;
1381      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1382      CHKPP(jsPointer);
1383      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1384      CHKPP(jsPointerMgr);
1385      auto func = [jsPointerMgr] (napi_env env, napi_value handle) -> napi_value {
1386          return jsPointerMgr->GetTouchpadScrollSwitch(env, handle);
1387      };
1388      return GetTouchpadData(env, info, func);
1389  }
1390  
SetTouchpadScrollDirection(napi_env env,napi_callback_info info)1391  napi_value JsPointerContext::SetTouchpadScrollDirection(napi_env env, napi_callback_info info)
1392  {
1393      CALL_DEBUG_ENTER;
1394      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1395      CHKPP(jsPointer);
1396      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1397      CHKPP(jsPointerMgr);
1398      auto func = [jsPointerMgr] (napi_env env, bool state, napi_value handle) -> napi_value {
1399          return jsPointerMgr->SetTouchpadScrollDirection(env, state, handle);
1400      };
1401      return SetTouchpadBoolData(env, info, func);
1402  }
1403  
GetTouchpadScrollDirection(napi_env env,napi_callback_info info)1404  napi_value JsPointerContext::GetTouchpadScrollDirection(napi_env env, napi_callback_info info)
1405  {
1406      CALL_DEBUG_ENTER;
1407      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1408      CHKPP(jsPointer);
1409      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1410      CHKPP(jsPointerMgr);
1411      auto func = [jsPointerMgr] (napi_env env, napi_value handle) -> napi_value {
1412          return jsPointerMgr->GetTouchpadScrollDirection(env, handle);
1413      };
1414      return GetTouchpadData(env, info, func);
1415  }
1416  
SetTouchpadTapSwitch(napi_env env,napi_callback_info info)1417  napi_value JsPointerContext::SetTouchpadTapSwitch(napi_env env, napi_callback_info info)
1418  {
1419      CALL_DEBUG_ENTER;
1420      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1421      CHKPP(jsPointer);
1422      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1423      CHKPP(jsPointerMgr);
1424      auto func = [jsPointerMgr] (napi_env env, bool switchFlag, napi_value handle) -> napi_value {
1425          return jsPointerMgr->SetTouchpadTapSwitch(env, switchFlag, handle);
1426      };
1427      return SetTouchpadBoolData(env, info, func);
1428  }
1429  
GetTouchpadTapSwitch(napi_env env,napi_callback_info info)1430  napi_value JsPointerContext::GetTouchpadTapSwitch(napi_env env, napi_callback_info info)
1431  {
1432      CALL_DEBUG_ENTER;
1433      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1434      CHKPP(jsPointer);
1435      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1436      CHKPP(jsPointerMgr);
1437      auto func = [jsPointerMgr] (napi_env env, napi_value handle) -> napi_value {
1438          return jsPointerMgr->GetTouchpadTapSwitch(env, handle);
1439      };
1440      return GetTouchpadData(env, info, func);
1441  }
1442  
SetTouchpadPointerSpeed(napi_env env,napi_callback_info info)1443  napi_value JsPointerContext::SetTouchpadPointerSpeed(napi_env env, napi_callback_info info)
1444  {
1445      CALL_DEBUG_ENTER;
1446      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1447      CHKPP(jsPointer);
1448      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1449      CHKPP(jsPointerMgr);
1450      auto func = [jsPointerMgr] (napi_env env, int32_t data, napi_value handle) -> napi_value {
1451          return jsPointerMgr->SetTouchpadPointerSpeed(env, data, handle);
1452      };
1453      return SetTouchpadInt32Data(env, info, func, MAX_SPEED, MIN_SPEED);
1454  }
1455  
GetTouchpadPointerSpeed(napi_env env,napi_callback_info info)1456  napi_value JsPointerContext::GetTouchpadPointerSpeed(napi_env env, napi_callback_info info)
1457  {
1458      CALL_DEBUG_ENTER;
1459      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1460      CHKPP(jsPointer);
1461      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1462      CHKPP(jsPointerMgr);
1463      auto func = [jsPointerMgr] (napi_env env, napi_value handle) -> napi_value {
1464          return jsPointerMgr->GetTouchpadPointerSpeed(env, handle);
1465      };
1466      return GetTouchpadData(env, info, func);
1467  }
1468  
SetTouchpadPinchSwitch(napi_env env,napi_callback_info info)1469  napi_value JsPointerContext::SetTouchpadPinchSwitch(napi_env env, napi_callback_info info)
1470  {
1471      CALL_DEBUG_ENTER;
1472      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1473      CHKPP(jsPointer);
1474      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1475      CHKPP(jsPointerMgr);
1476      auto func = [jsPointerMgr] (napi_env env, bool switchFlag, napi_value handle) -> napi_value {
1477          return jsPointerMgr->SetTouchpadPinchSwitch(env, switchFlag, handle);
1478      };
1479      return SetTouchpadBoolData(env, info, func);
1480  }
1481  
GetTouchpadPinchSwitch(napi_env env,napi_callback_info info)1482  napi_value JsPointerContext::GetTouchpadPinchSwitch(napi_env env, napi_callback_info info)
1483  {
1484      CALL_DEBUG_ENTER;
1485      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1486      CHKPP(jsPointer);
1487      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1488      CHKPP(jsPointerMgr);
1489      auto func = [jsPointerMgr] (napi_env env, napi_value handle) -> napi_value {
1490          return jsPointerMgr->GetTouchpadPinchSwitch(env, handle);
1491      };
1492      return GetTouchpadData(env, info, func);
1493  }
1494  
SetTouchpadSwipeSwitch(napi_env env,napi_callback_info info)1495  napi_value JsPointerContext::SetTouchpadSwipeSwitch(napi_env env, napi_callback_info info)
1496  {
1497      CALL_DEBUG_ENTER;
1498      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1499      CHKPP(jsPointer);
1500      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1501      CHKPP(jsPointerMgr);
1502      auto func = [jsPointerMgr] (napi_env env, bool switchFlag, napi_value handle) -> napi_value {
1503          return jsPointerMgr->SetTouchpadSwipeSwitch(env, switchFlag, handle);
1504      };
1505      return SetTouchpadBoolData(env, info, func);
1506  }
1507  
GetTouchpadSwipeSwitch(napi_env env,napi_callback_info info)1508  napi_value JsPointerContext::GetTouchpadSwipeSwitch(napi_env env, napi_callback_info info)
1509  {
1510      CALL_DEBUG_ENTER;
1511      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1512      CHKPP(jsPointer);
1513      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1514      CHKPP(jsPointerMgr);
1515      auto func = [jsPointerMgr] (napi_env env, napi_value handle) -> napi_value {
1516          return jsPointerMgr->GetTouchpadSwipeSwitch(env, handle);
1517      };
1518      return GetTouchpadData(env, info, func);
1519  }
1520  
SetTouchpadRightClickType(napi_env env,napi_callback_info info)1521  napi_value JsPointerContext::SetTouchpadRightClickType(napi_env env, napi_callback_info info)
1522  {
1523      CALL_DEBUG_ENTER;
1524      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1525      CHKPP(jsPointer);
1526      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1527      CHKPP(jsPointerMgr);
1528      auto func = [jsPointerMgr] (napi_env env, int32_t data, napi_value handle) -> napi_value {
1529          return jsPointerMgr->SetTouchpadRightClickType(env, data, handle);
1530      };
1531      return SetTouchpadInt32Data(env, info, func, MAX_SPEED, MIN_SPEED);
1532  }
1533  
GetTouchpadRightClickType(napi_env env,napi_callback_info info)1534  napi_value JsPointerContext::GetTouchpadRightClickType(napi_env env, napi_callback_info info)
1535  {
1536      CALL_DEBUG_ENTER;
1537      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1538      CHKPP(jsPointer);
1539      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1540      CHKPP(jsPointerMgr);
1541      auto func = [jsPointerMgr] (napi_env env, napi_value handle) -> napi_value {
1542          return jsPointerMgr->GetTouchpadRightClickType(env, handle);
1543      };
1544      return GetTouchpadData(env, info, func);
1545  }
1546  
SetTouchpadRotateSwitch(napi_env env,napi_callback_info info)1547  napi_value JsPointerContext::SetTouchpadRotateSwitch(napi_env env, napi_callback_info info)
1548  {
1549      CALL_DEBUG_ENTER;
1550      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1551      CHKPP(jsPointer);
1552      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1553      CHKPP(jsPointerMgr);
1554      auto func = [jsPointerMgr] (napi_env env, bool rotateSwitch, napi_value handle) -> napi_value {
1555          return jsPointerMgr->SetTouchpadRotateSwitch(env, rotateSwitch, handle);
1556      };
1557      return SetTouchpadBoolData(env, info, func);
1558  }
1559  
GetTouchpadRotateSwitch(napi_env env,napi_callback_info info)1560  napi_value JsPointerContext::GetTouchpadRotateSwitch(napi_env env, napi_callback_info info)
1561  {
1562      CALL_DEBUG_ENTER;
1563      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1564      CHKPP(jsPointer);
1565      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1566      CHKPP(jsPointerMgr);
1567      auto func = [jsPointerMgr] (napi_env env, napi_value handle) -> napi_value {
1568          return jsPointerMgr->GetTouchpadRotateSwitch(env, handle);
1569      };
1570      return GetTouchpadData(env, info, func);
1571  }
1572  
SetTouchpadDoubleTapAndDragState(napi_env env,napi_callback_info info)1573  napi_value JsPointerContext::SetTouchpadDoubleTapAndDragState(napi_env env, napi_callback_info info)
1574  {
1575      CALL_DEBUG_ENTER;
1576      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1577      CHKPP(jsPointer);
1578      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1579      CHKPP(jsPointerMgr);
1580      auto func = [jsPointerMgr] (napi_env env, bool switchFlag, napi_value handle) -> napi_value {
1581          return jsPointerMgr->SetTouchpadDoubleTapAndDragState(env, switchFlag, handle);
1582      };
1583      return SetTouchpadBoolData(env, info, func);
1584  }
1585  
GetTouchpadDoubleTapAndDragState(napi_env env,napi_callback_info info)1586  napi_value JsPointerContext::GetTouchpadDoubleTapAndDragState(napi_env env, napi_callback_info info)
1587  {
1588      CALL_DEBUG_ENTER;
1589      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1590      CHKPP(jsPointer);
1591      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1592      CHKPP(jsPointerMgr);
1593      auto func = [jsPointerMgr] (napi_env env, napi_value handle) -> napi_value {
1594          return jsPointerMgr->GetTouchpadDoubleTapAndDragState(env, handle);
1595      };
1596      return GetTouchpadData(env, info, func);
1597  }
1598  
EnableHardwareCursorStats(napi_env env,napi_callback_info info)1599  napi_value JsPointerContext::EnableHardwareCursorStats(napi_env env, napi_callback_info info)
1600  {
1601      CALL_DEBUG_ENTER;
1602      size_t argc = 1;
1603      napi_value argv[1];
1604      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
1605      if (argc == 0) {
1606          MMI_HILOGE("At least one parameter is required");
1607          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "enable", "boolean");
1608          return nullptr;
1609      }
1610      if (!JsCommon::TypeOf(env, argv[0], napi_boolean)) {
1611          MMI_HILOGE("Enable parameter type is invalid");
1612          THROWERR_API9(env, COMMON_PARAMETER_ERROR, "enable", "boolean");
1613          return nullptr;
1614      }
1615      bool enable = true;
1616      CHKRP(napi_get_value_bool(env, argv[0], &enable), GET_VALUE_BOOL);
1617  
1618      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1619      CHKPP(jsPointer);
1620      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1621      return jsPointerMgr->EnableHardwareCursorStats(env, enable);
1622  }
1623  
GetHardwareCursorStats(napi_env env,napi_callback_info info)1624  napi_value JsPointerContext::GetHardwareCursorStats(napi_env env, napi_callback_info info)
1625  {
1626      CALL_DEBUG_ENTER;
1627      size_t argc = 1;
1628      napi_value argv[1];
1629      CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
1630      JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
1631      CHKPP(jsPointer);
1632      auto jsPointerMgr = jsPointer->GetJsPointerMgr();
1633      if (argc == 0) {
1634          return jsPointerMgr->GetHardwareCursorStats(env);
1635      }
1636      return nullptr;
1637  }
1638  
Export(napi_env env,napi_value exports)1639  napi_value JsPointerContext::Export(napi_env env, napi_value exports)
1640  {
1641      CALL_DEBUG_ENTER;
1642      auto instance = CreateInstance(env);
1643      if (instance == nullptr) {
1644          THROWERR(env, "failed to create instance");
1645          return nullptr;
1646      }
1647      napi_property_descriptor desc[] = {
1648          DECLARE_NAPI_STATIC_FUNCTION("setPointerVisible", SetPointerVisible),
1649          DECLARE_NAPI_STATIC_FUNCTION("setPointerVisibleSync", SetPointerVisibleSync),
1650          DECLARE_NAPI_STATIC_FUNCTION("isPointerVisible", IsPointerVisible),
1651          DECLARE_NAPI_STATIC_FUNCTION("isPointerVisibleSync", IsPointerVisibleSync),
1652          DECLARE_NAPI_STATIC_FUNCTION("setPointerColor", SetPointerColor),
1653          DECLARE_NAPI_STATIC_FUNCTION("getPointerColor", GetPointerColor),
1654          DECLARE_NAPI_STATIC_FUNCTION("setPointerColorSync", SetPointerColorSync),
1655          DECLARE_NAPI_STATIC_FUNCTION("getPointerColorSync", GetPointerColorSync),
1656          DECLARE_NAPI_STATIC_FUNCTION("setPointerSpeed", SetPointerSpeed),
1657          DECLARE_NAPI_STATIC_FUNCTION("setPointerSpeedSync", SetPointerSpeedSync),
1658          DECLARE_NAPI_STATIC_FUNCTION("getPointerSpeed", GetPointerSpeed),
1659          DECLARE_NAPI_STATIC_FUNCTION("getPointerSpeedSync", GetPointerSpeedSync),
1660          DECLARE_NAPI_STATIC_FUNCTION("setPointerStyle", SetPointerStyle),
1661          DECLARE_NAPI_STATIC_FUNCTION("setPointerStyleSync", SetPointerStyleSync),
1662          DECLARE_NAPI_STATIC_FUNCTION("getPointerStyle", GetPointerStyle),
1663          DECLARE_NAPI_STATIC_FUNCTION("getPointerStyleSync", GetPointerStyleSync),
1664          DECLARE_NAPI_STATIC_FUNCTION("enterCaptureMode", EnterCaptureMode),
1665          DECLARE_NAPI_STATIC_FUNCTION("leaveCaptureMode", LeaveCaptureMode),
1666          DECLARE_NAPI_STATIC_FUNCTION("setMouseScrollRows", SetMouseScrollRows),
1667          DECLARE_NAPI_STATIC_FUNCTION("getMouseScrollRows", GetMouseScrollRows),
1668          DECLARE_NAPI_STATIC_FUNCTION("setPointerSize", SetPointerSize),
1669          DECLARE_NAPI_STATIC_FUNCTION("getPointerSize", GetPointerSize),
1670          DECLARE_NAPI_STATIC_FUNCTION("setPointerSizeSync", SetPointerSizeSync),
1671          DECLARE_NAPI_STATIC_FUNCTION("getPointerSizeSync", GetPointerSizeSync),
1672          DECLARE_NAPI_STATIC_FUNCTION("setMousePrimaryButton", SetMousePrimaryButton),
1673          DECLARE_NAPI_STATIC_FUNCTION("getMousePrimaryButton", GetMousePrimaryButton),
1674          DECLARE_NAPI_STATIC_FUNCTION("setHoverScrollState", SetHoverScrollState),
1675          DECLARE_NAPI_STATIC_FUNCTION("getHoverScrollState", GetHoverScrollState),
1676          DECLARE_NAPI_STATIC_FUNCTION("setTouchpadScrollSwitch", SetTouchpadScrollSwitch),
1677          DECLARE_NAPI_STATIC_FUNCTION("getTouchpadScrollSwitch", GetTouchpadScrollSwitch),
1678          DECLARE_NAPI_STATIC_FUNCTION("setTouchpadScrollDirection", SetTouchpadScrollDirection),
1679          DECLARE_NAPI_STATIC_FUNCTION("getTouchpadScrollDirection", GetTouchpadScrollDirection),
1680          DECLARE_NAPI_STATIC_FUNCTION("setTouchpadTapSwitch", SetTouchpadTapSwitch),
1681          DECLARE_NAPI_STATIC_FUNCTION("getTouchpadTapSwitch", GetTouchpadTapSwitch),
1682          DECLARE_NAPI_STATIC_FUNCTION("setTouchpadPointerSpeed", SetTouchpadPointerSpeed),
1683          DECLARE_NAPI_STATIC_FUNCTION("getTouchpadPointerSpeed", GetTouchpadPointerSpeed),
1684          DECLARE_NAPI_STATIC_FUNCTION("setTouchpadPinchSwitch", SetTouchpadPinchSwitch),
1685          DECLARE_NAPI_STATIC_FUNCTION("getTouchpadPinchSwitch", GetTouchpadPinchSwitch),
1686          DECLARE_NAPI_STATIC_FUNCTION("setTouchpadSwipeSwitch", SetTouchpadSwipeSwitch),
1687          DECLARE_NAPI_STATIC_FUNCTION("getTouchpadSwipeSwitch", GetTouchpadSwipeSwitch),
1688          DECLARE_NAPI_STATIC_FUNCTION("setTouchpadRightClickType", SetTouchpadRightClickType),
1689          DECLARE_NAPI_STATIC_FUNCTION("getTouchpadRightClickType", GetTouchpadRightClickType),
1690          DECLARE_NAPI_STATIC_FUNCTION("setTouchpadRotateSwitch", SetTouchpadRotateSwitch),
1691          DECLARE_NAPI_STATIC_FUNCTION("getTouchpadRotateSwitch", GetTouchpadRotateSwitch),
1692          DECLARE_NAPI_STATIC_FUNCTION("setTouchpadDoubleTapAndDragState", SetTouchpadDoubleTapAndDragState),
1693          DECLARE_NAPI_STATIC_FUNCTION("getTouchpadDoubleTapAndDragState", GetTouchpadDoubleTapAndDragState),
1694          DECLARE_NAPI_STATIC_FUNCTION("setPointerLocation", SetPointerLocation),
1695          DECLARE_NAPI_STATIC_FUNCTION("setCustomCursor", SetCustomCursor),
1696          DECLARE_NAPI_STATIC_FUNCTION("setCustomCursorSync", SetCustomCursorSync),
1697          DECLARE_NAPI_STATIC_FUNCTION("enableHardwareCursorStats", EnableHardwareCursorStats),
1698          DECLARE_NAPI_STATIC_FUNCTION("getHardwareCursorStats", GetHardwareCursorStats),
1699      };
1700      CHKRP(napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc), DEFINE_PROPERTIES);
1701      if (CreatePointerStyle(env, exports) == nullptr) {
1702          THROWERR(env, "Failed to create pointer style");
1703          return nullptr;
1704      }
1705      if (CreateMousePrimaryButton(env, exports) == nullptr) {
1706          THROWERR(env, "Failed to create mouse primary button");
1707          return nullptr;
1708      }
1709      if (CreateTouchpadRightClickType(env, exports) == nullptr) {
1710          THROWERR(env, "Failed to create touchpad right click type");
1711          return nullptr;
1712      }
1713      return exports;
1714  }
1715  } // namespace MMI
1716  } // namespace OHOS
1717