• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
18 namespace OHOS {
19 namespace MMI {
20 namespace {
21 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, MMI_LOG_DOMAIN, "JsPointerContext" };
22 constexpr int32_t STANDARD_SPEED = 5;
23 constexpr int32_t MAX_SPEED = 11;
24 constexpr int32_t MIN_SPEED = 1;
25 } // namespace
26 
JsPointerContext()27 JsPointerContext::JsPointerContext() : mgr_(std::make_shared<JsPointerManager>()) {}
28 
CreateInstance(napi_env env)29 napi_value JsPointerContext::CreateInstance(napi_env env)
30 {
31     CALL_DEBUG_ENTER;
32     napi_value global = nullptr;
33     CHKRP(env, napi_get_global(env, &global), GET_GLOBAL);
34 
35     constexpr char className[] = "JsPointerContext";
36     napi_value jsClass = nullptr;
37     napi_property_descriptor desc[] = {};
38     napi_status status = napi_define_class(env, className, sizeof(className), JsPointerContext::CreateJsObject,
39                                            nullptr, sizeof(desc) / sizeof(desc[0]), nullptr, &jsClass);
40     CHKRP(env, status, DEFINE_CLASS);
41 
42     status = napi_set_named_property(env, global, "multimodalinput_pointer_class", jsClass);
43     CHKRP(env, status, SET_NAMED_PROPERTY);
44 
45     napi_value jsInstance = nullptr;
46     CHKRP(env, napi_new_instance(env, jsClass, 0, nullptr, &jsInstance), NEW_INSTANCE);
47     CHKRP(env, napi_set_named_property(env, global, "multimodal_pointer", jsInstance), SET_NAMED_PROPERTY);
48 
49     JsPointerContext *jsContext = nullptr;
50     CHKRP(env, napi_unwrap(env, jsInstance, (void**)&jsContext), UNWRAP);
51     CHKPP(jsContext);
52     CHKRP(env, napi_create_reference(env, jsInstance, 1, &(jsContext->contextRef_)), CREATE_REFERENCE);
53 
54     uint32_t refCount = 0;
55     CHKRP(env, napi_reference_ref(env, jsContext->contextRef_, &refCount), REFERENCE_REF);
56     return jsInstance;
57 }
58 
CreateJsObject(napi_env env,napi_callback_info info)59 napi_value JsPointerContext::CreateJsObject(napi_env env, napi_callback_info info)
60 {
61     CALL_DEBUG_ENTER;
62     napi_value thisVar = nullptr;
63     void *data = nullptr;
64     CHKRP(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, &data), GET_CB_INFO);
65 
66     JsPointerContext *jsContext = new (std::nothrow) JsPointerContext();
67     CHKPP(jsContext);
68     napi_status status = napi_wrap(env, thisVar, jsContext, [](napi_env env, void* data, void* hin) {
69         MMI_HILOGI("jsvm ends");
70         JsPointerContext *context = static_cast<JsPointerContext*>(data);
71         delete context;
72     }, nullptr, nullptr);
73     if (status != napi_ok) {
74         delete jsContext;
75         THROWERR(env, "Failed to wrap native instance");
76         return nullptr;
77     }
78     return thisVar;
79 }
80 
GetInstance(napi_env env)81 JsPointerContext* JsPointerContext::GetInstance(napi_env env)
82 {
83     CALL_DEBUG_ENTER;
84     napi_value global = nullptr;
85     CHKRP(env, napi_get_global(env, &global), GET_GLOBAL);
86 
87     bool result = false;
88     CHKRP(env, napi_has_named_property(env, global, "multimodal_pointer", &result), HAS_NAMED_PROPERTY);
89     if (!result) {
90         THROWERR(env, "multimodal_pointer was not found");
91         return nullptr;
92     }
93 
94     napi_value object = nullptr;
95     CHKRP(env, napi_get_named_property(env, global, "multimodal_pointer", &object), SET_NAMED_PROPERTY);
96     if (object == nullptr) {
97         THROWERR(env, "object is nullptr");
98         return nullptr;
99     }
100 
101     JsPointerContext *instance = nullptr;
102     CHKRP(env, napi_unwrap(env, object, (void**)&instance), UNWRAP);
103     if (instance == nullptr) {
104         THROWERR(env, "instance is nullptr");
105         return nullptr;
106     }
107     return instance;
108 }
109 
GetJsPointerMgr() const110 std::shared_ptr<JsPointerManager> JsPointerContext::GetJsPointerMgr() const
111 {
112     return mgr_;
113 }
114 
SetPointerVisible(napi_env env,napi_callback_info info)115 napi_value JsPointerContext::SetPointerVisible(napi_env env, napi_callback_info info)
116 {
117     CALL_DEBUG_ENTER;
118     size_t argc = 2;
119     napi_value argv[2];
120     CHKRP(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
121     if (argc == 0) {
122         MMI_HILOGE("At least one parameter is required");
123         THROWERR_API9(env, COMMON_PARAMETER_ERROR, "visible", "boolean");
124         return nullptr;
125     }
126     if (!JsCommon::TypeOf(env, argv[0], napi_boolean)) {
127         MMI_HILOGE("visible parameter type is wrong");
128         THROWERR_API9(env, COMMON_PARAMETER_ERROR, "visible", "boolean");
129         return nullptr;
130     }
131     bool visible = true;
132     CHKRP(env, napi_get_value_bool(env, argv[0], &visible), GET_BOOL);
133 
134     JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
135     auto jsPointerMgr = jsPointer->GetJsPointerMgr();
136     if (argc == 1) {
137         return jsPointerMgr->SetPointerVisible(env, visible);
138     }
139     if (!JsCommon::TypeOf(env, argv[1], napi_function)) {
140         MMI_HILOGE("callback parameter type is wrong ");
141         THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
142         return nullptr;
143     }
144     return jsPointerMgr->SetPointerVisible(env, visible, argv[1]);
145 }
146 
IsPointerVisible(napi_env env,napi_callback_info info)147 napi_value JsPointerContext::IsPointerVisible(napi_env env, napi_callback_info info)
148 {
149     CALL_DEBUG_ENTER;
150     size_t argc = 1;
151     napi_value argv[1];
152     CHKRP(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
153 
154     JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
155     auto jsPointerMgr = jsPointer->GetJsPointerMgr();
156     if (argc == 0) {
157         return jsPointerMgr->IsPointerVisible(env);
158     }
159     if (!JsCommon::TypeOf(env, argv[0], napi_function)) {
160         MMI_HILOGE("callback parameter type is wrong");
161         THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
162         return nullptr;
163     }
164 
165     return jsPointerMgr->IsPointerVisible(env, argv[0]);
166 }
167 
SetPointerSpeed(napi_env env,napi_callback_info info)168 napi_value JsPointerContext::SetPointerSpeed(napi_env env, napi_callback_info info)
169 {
170     CALL_DEBUG_ENTER;
171     size_t argc = 2;
172     napi_value argv[2];
173     CHKRP(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
174     if (argc == 0) {
175         MMI_HILOGE("At least 1 parameter is required");
176         THROWERR_API9(env, COMMON_PARAMETER_ERROR, "speed", "number");
177         return nullptr;
178     }
179     if (!JsCommon::TypeOf(env, argv[0], napi_number)) {
180         MMI_HILOGE("speed parameter type is wrong");
181         THROWERR_API9(env, COMMON_PARAMETER_ERROR, "speed", "number");
182         return nullptr;
183     }
184     int32_t pointerSpeed = STANDARD_SPEED;
185     CHKRP(env, napi_get_value_int32(env, argv[0], &pointerSpeed), GET_INT32);
186     if (pointerSpeed < MIN_SPEED) {
187         pointerSpeed = MIN_SPEED;
188     } else if (pointerSpeed > MAX_SPEED) {
189         pointerSpeed = MAX_SPEED;
190     }
191     JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
192     auto jsPointerMgr = jsPointer->GetJsPointerMgr();
193     if (argc == 1) {
194         return jsPointerMgr->SetPointerSpeed(env, pointerSpeed);
195     }
196     if (!JsCommon::TypeOf(env, argv[1], napi_function)) {
197         MMI_HILOGE("callback parameter type is wrong");
198         THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
199         return nullptr;
200     }
201     return jsPointerMgr->SetPointerSpeed(env, pointerSpeed, argv[1]);
202 }
203 
GetPointerSpeed(napi_env env,napi_callback_info info)204 napi_value JsPointerContext::GetPointerSpeed(napi_env env, napi_callback_info info)
205 {
206     CALL_DEBUG_ENTER;
207     size_t argc = 1;
208     napi_value argv[1];
209     CHKRP(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
210     JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
211     auto jsPointerMgr = jsPointer->GetJsPointerMgr();
212     if (argc == 0) {
213         return jsPointerMgr->GetPointerSpeed(env);
214     }
215     if (!JsCommon::TypeOf(env, argv[0], napi_function)) {
216         MMI_HILOGE("callback parameter type is wrong");
217         THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
218         return nullptr;
219     }
220 
221     return jsPointerMgr->GetPointerSpeed(env, argv[0]);
222 }
223 
SetPointerStyle(napi_env env,napi_callback_info info)224 napi_value JsPointerContext::SetPointerStyle(napi_env env, napi_callback_info info)
225 {
226     CALL_DEBUG_ENTER;
227     size_t argc = 3;
228     napi_value argv[3];
229     CHKRP(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
230     if (argc < 2) {
231         MMI_HILOGE("At least 2 parameter is required");
232         THROWERR_API9(env, COMMON_PARAMETER_ERROR, "windowId", "number");
233         return nullptr;
234     }
235     if (!JsCommon::TypeOf(env, argv[0], napi_number)) {
236         MMI_HILOGE("windowId parameter type is wrong");
237         THROWERR_API9(env, COMMON_PARAMETER_ERROR, "windowId", "number");
238         return nullptr;
239     }
240     int32_t windowid = 0;
241     CHKRP(env, napi_get_value_int32(env, argv[0], &windowid), GET_INT32);
242     if (windowid < 0) {
243         MMI_HILOGE("Invalid windowid");
244         THROWERR_CUSTOM(env, COMMON_PARAMETER_ERROR, "Windowid is invalid");
245         return nullptr;
246     }
247     if (!JsCommon::TypeOf(env, argv[1], napi_number)) {
248         MMI_HILOGE("pointerStyle parameter type is wrong");
249         THROWERR_API9(env, COMMON_PARAMETER_ERROR, "pointerStyle", "number");
250         return nullptr;
251     }
252     int32_t pointerStyle = 0;
253     CHKRP(env, napi_get_value_int32(env, argv[1], &pointerStyle), GET_INT32);
254     if (pointerStyle < DEFAULT || pointerStyle > MIDDLE_BTN_NORTH_SOUTH_WEST_EAST) {
255         MMI_HILOGE("Undefined pointer style");
256         THROWERR_CUSTOM(env, COMMON_PARAMETER_ERROR, "Pointer style does not exist");
257         return nullptr;
258     }
259     JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
260     auto jsPointerMgr = jsPointer->GetJsPointerMgr();
261     if (argc == 2) {
262         return jsPointerMgr->SetPointerStyle(env, windowid, pointerStyle);
263     }
264     if (!JsCommon::TypeOf(env, argv[2], napi_function)) {
265         MMI_HILOGE("callback parameter type is wrong");
266         THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
267         return nullptr;
268     }
269     return jsPointerMgr->SetPointerStyle(env, windowid, pointerStyle, argv[2]);
270 }
271 
GetPointerStyle(napi_env env,napi_callback_info info)272 napi_value JsPointerContext::GetPointerStyle(napi_env env, napi_callback_info info)
273 {
274     CALL_DEBUG_ENTER;
275     size_t argc = 2;
276     napi_value argv[2];
277     CHKRP(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO);
278     if (argc == 0) {
279         MMI_HILOGE("At least 1 parameter is required");
280         THROWERR_API9(env, COMMON_PARAMETER_ERROR, "windowId", "number");
281         return nullptr;
282     }
283     if (!JsCommon::TypeOf(env, argv[0], napi_number)) {
284         MMI_HILOGE("windowId parameter type is wrong");
285         THROWERR_API9(env, COMMON_PARAMETER_ERROR, "windowId", "number");
286         return nullptr;
287     }
288     int32_t windowid = 0;
289     CHKRP(env, napi_get_value_int32(env, argv[0], &windowid), GET_INT32);
290     if (windowid < 0) {
291         MMI_HILOGE("Invalid windowid");
292         THROWERR_CUSTOM(env, COMMON_PARAMETER_ERROR, "Windowid is invalid");
293         return nullptr;
294     }
295     JsPointerContext *jsPointer = JsPointerContext::GetInstance(env);
296     auto jsPointerMgr = jsPointer->GetJsPointerMgr();
297     if (argc == 1) {
298         return jsPointerMgr->GetPointerStyle(env, windowid);
299     }
300     if (!JsCommon::TypeOf(env, argv[1], napi_function)) {
301         MMI_HILOGE("callback parameter type is wrong");
302         THROWERR_API9(env, COMMON_PARAMETER_ERROR, "callback", "function");
303         return nullptr;
304     }
305     return jsPointerMgr->GetPointerStyle(env, windowid, argv[1]);
306 }
307 
CreatePointerStyle(napi_env env,napi_value exports)308 napi_value JsPointerContext::CreatePointerStyle(napi_env env, napi_value exports)
309 {
310     CALL_DEBUG_ENTER;
311     napi_value defaults = nullptr;
312     CHKRP(env, napi_create_int32(env, MOUSE_ICON::DEFAULT, &defaults), CREATE_INT32);
313     napi_value east = nullptr;
314     CHKRP(env, napi_create_int32(env, MOUSE_ICON::EAST, &east), CREATE_INT32);
315     napi_value west = nullptr;
316     CHKRP(env, napi_create_int32(env, MOUSE_ICON::WEST, &west), CREATE_INT32);
317     napi_value south = nullptr;
318     CHKRP(env, napi_create_int32(env, MOUSE_ICON::SOUTH, &south), CREATE_INT32);
319     napi_value north = nullptr;
320     CHKRP(env, napi_create_int32(env, MOUSE_ICON::NORTH, &north), CREATE_INT32);
321     napi_value west_east = nullptr;
322     CHKRP(env, napi_create_int32(env, MOUSE_ICON::WEST_EAST, &west_east), CREATE_INT32);
323     napi_value north_south = nullptr;
324     CHKRP(env, napi_create_int32(env, MOUSE_ICON::NORTH_SOUTH, &north_south), CREATE_INT32);
325     napi_value north_east = nullptr;
326     CHKRP(env, napi_create_int32(env, MOUSE_ICON::NORTH_EAST, &north_east), CREATE_INT32);
327     napi_value north_west = nullptr;
328     CHKRP(env, napi_create_int32(env, MOUSE_ICON::NORTH_WEST, &north_west), CREATE_INT32);
329     napi_value south_east = nullptr;
330     CHKRP(env, napi_create_int32(env, MOUSE_ICON::SOUTH_EAST, &south_east), CREATE_INT32);
331     napi_value south_west = nullptr;
332     CHKRP(env, napi_create_int32(env, MOUSE_ICON::SOUTH_WEST, &south_west), CREATE_INT32);
333     napi_value north_east_south_west = nullptr;
334     CHKRP(env, napi_create_int32(env, MOUSE_ICON::NORTH_EAST_SOUTH_WEST, &north_east_south_west), CREATE_INT32);
335     napi_value north_west_south_east = nullptr;
336     CHKRP(env, napi_create_int32(env, MOUSE_ICON::NORTH_WEST_SOUTH_EAST, &north_west_south_east), CREATE_INT32);
337     napi_value cross = nullptr;
338     CHKRP(env, napi_create_int32(env, MOUSE_ICON::CROSS, &cross), CREATE_INT32);
339     napi_value cursor_copy = nullptr;
340     CHKRP(env, napi_create_int32(env, MOUSE_ICON::CURSOR_COPY, &cursor_copy), CREATE_INT32);
341     napi_value cursor_forbid = nullptr;
342     CHKRP(env, napi_create_int32(env, MOUSE_ICON::CURSOR_FORBID, &cursor_forbid), CREATE_INT32);
343     napi_value color_sucker = nullptr;
344     CHKRP(env, napi_create_int32(env, MOUSE_ICON::COLOR_SUCKER, &color_sucker), CREATE_INT32);
345     napi_value hand_grabbing = nullptr;
346     CHKRP(env, napi_create_int32(env, MOUSE_ICON::HAND_GRABBING, &hand_grabbing), CREATE_INT32);
347     napi_value hand_open = nullptr;
348     CHKRP(env, napi_create_int32(env, MOUSE_ICON::HAND_OPEN, &hand_open), CREATE_INT32);
349     napi_value hand_pointing = nullptr;
350     CHKRP(env, napi_create_int32(env, MOUSE_ICON::HAND_POINTING, &hand_pointing), CREATE_INT32);
351     napi_value help = nullptr;
352     CHKRP(env, napi_create_int32(env, MOUSE_ICON::HELP, &help), CREATE_INT32);
353     napi_value move = nullptr;
354     CHKRP(env, napi_create_int32(env, MOUSE_ICON::CURSOR_MOVE, &move), CREATE_INT32);
355     napi_value resize_up_down = nullptr;
356     CHKRP(env, napi_create_int32(env, MOUSE_ICON::RESIZE_LEFT_RIGHT, &resize_up_down), CREATE_INT32);
357     napi_value resize_left_right = nullptr;
358     CHKRP(env, napi_create_int32(env, MOUSE_ICON::RESIZE_UP_DOWN, &resize_left_right), CREATE_INT32);
359     napi_value screenshot_choose = nullptr;
360     CHKRP(env, napi_create_int32(env, MOUSE_ICON::SCREENSHOT_CHOOSE, &screenshot_choose), CREATE_INT32);
361     napi_value screenshot_cursor = nullptr;
362     CHKRP(env, napi_create_int32(env, MOUSE_ICON::SCREENSHOT_CURSOR, &screenshot_cursor), CREATE_INT32);
363     napi_value text_cursor = nullptr;
364     CHKRP(env, napi_create_int32(env, MOUSE_ICON::TEXT_CURSOR, &text_cursor), CREATE_INT32);
365     napi_value zoom_in = nullptr;
366     CHKRP(env, napi_create_int32(env, MOUSE_ICON::ZOOM_IN, &zoom_in), CREATE_INT32);
367     napi_value zoom_out = nullptr;
368     CHKRP(env, napi_create_int32(env, MOUSE_ICON::ZOOM_OUT, &zoom_out), CREATE_INT32);
369     napi_value middle_btn_east = nullptr;
370     CHKRP(env, napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_EAST, &middle_btn_east), CREATE_INT32);
371     napi_value middle_btn_west = nullptr;
372     CHKRP(env, napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_WEST, &middle_btn_west), CREATE_INT32);
373     napi_value middle_btn_south = nullptr;
374     CHKRP(env, napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_SOUTH, &middle_btn_south), CREATE_INT32);
375     napi_value middle_btn_north = nullptr;
376     CHKRP(env, napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_NORTH, &middle_btn_north), CREATE_INT32);
377     napi_value middle_btn_north_south = nullptr;
378     CHKRP(env, napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_NORTH_SOUTH, &middle_btn_north_south), CREATE_INT32);
379     napi_value middle_btn_north_east = nullptr;
380     CHKRP(env, napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_NORTH_EAST, &middle_btn_north_east), CREATE_INT32);
381     napi_value middle_btn_north_west = nullptr;
382     CHKRP(env, napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_NORTH_WEST, &middle_btn_north_west), CREATE_INT32);
383     napi_value middle_btn_south_east = nullptr;
384     CHKRP(env, napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_SOUTH_EAST, &middle_btn_south_east), CREATE_INT32);
385     napi_value middle_btn_south_west = nullptr;
386     CHKRP(env, napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_SOUTH_WEST, &middle_btn_south_west), CREATE_INT32);
387     napi_value middle_btn_north_south_west_east = nullptr;
388     CHKRP(env, napi_create_int32(env, MOUSE_ICON::MIDDLE_BTN_NORTH_SOUTH_WEST_EAST,
389         &middle_btn_north_south_west_east), CREATE_INT32);
390 
391     napi_property_descriptor desc[] = {
392         DECLARE_NAPI_STATIC_PROPERTY("DEFAULT", defaults),
393         DECLARE_NAPI_STATIC_PROPERTY("EAST", east),
394         DECLARE_NAPI_STATIC_PROPERTY("WEST", west),
395         DECLARE_NAPI_STATIC_PROPERTY("SOUTH", south),
396         DECLARE_NAPI_STATIC_PROPERTY("NORTH", north),
397         DECLARE_NAPI_STATIC_PROPERTY("WEST_EAST", west_east),
398         DECLARE_NAPI_STATIC_PROPERTY("NORTH_SOUTH", north_south),
399         DECLARE_NAPI_STATIC_PROPERTY("NORTH_EAST", north_east),
400         DECLARE_NAPI_STATIC_PROPERTY("NORTH_WEST", north_west),
401         DECLARE_NAPI_STATIC_PROPERTY("SOUTH_EAST", south_east),
402         DECLARE_NAPI_STATIC_PROPERTY("SOUTH_WEST", south_west),
403         DECLARE_NAPI_STATIC_PROPERTY("NORTH_EAST_SOUTH_WEST", north_east_south_west),
404         DECLARE_NAPI_STATIC_PROPERTY("NORTH_WEST_SOUTH_EAST", north_west_south_east),
405         DECLARE_NAPI_STATIC_PROPERTY("CROSS", cross),
406         DECLARE_NAPI_STATIC_PROPERTY("CURSOR_COPY", cursor_copy),
407         DECLARE_NAPI_STATIC_PROPERTY("CURSOR_FORBID", cursor_forbid),
408         DECLARE_NAPI_STATIC_PROPERTY("COLOR_SUCKER", color_sucker),
409         DECLARE_NAPI_STATIC_PROPERTY("HAND_GRABBING", hand_grabbing),
410         DECLARE_NAPI_STATIC_PROPERTY("HAND_OPEN", hand_open),
411         DECLARE_NAPI_STATIC_PROPERTY("HAND_POINTING", hand_pointing),
412         DECLARE_NAPI_STATIC_PROPERTY("HELP", help),
413         DECLARE_NAPI_STATIC_PROPERTY("MOVE", move),
414         DECLARE_NAPI_STATIC_PROPERTY("RESIZE_LEFT_RIGHT", resize_left_right),
415         DECLARE_NAPI_STATIC_PROPERTY("RESIZE_UP_DOWN", resize_up_down),
416         DECLARE_NAPI_STATIC_PROPERTY("SCREENSHOT_CHOOSE", screenshot_choose),
417         DECLARE_NAPI_STATIC_PROPERTY("SCREENSHOT_CURSOR", screenshot_cursor),
418         DECLARE_NAPI_STATIC_PROPERTY("TEXT_CURSOR", text_cursor),
419         DECLARE_NAPI_STATIC_PROPERTY("ZOOM_IN", zoom_in),
420         DECLARE_NAPI_STATIC_PROPERTY("ZOOM_OUT", zoom_out),
421         DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_EAST", middle_btn_east),
422         DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_WEST", middle_btn_west),
423         DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_SOUTH", middle_btn_south),
424         DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_NORTH", middle_btn_north),
425         DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_NORTH_SOUTH", middle_btn_north_south),
426         DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_NORTH_EAST", middle_btn_north_east),
427         DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_NORTH_WEST", middle_btn_north_west),
428         DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_SOUTH_EAST", middle_btn_south_east),
429         DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_SOUTH_WEST", middle_btn_south_west),
430         DECLARE_NAPI_STATIC_PROPERTY("MIDDLE_BTN_NORTH_SOUTH_WEST_EAST", middle_btn_north_south_west_east),
431     };
432     napi_value result = nullptr;
433     CHKRP(env, napi_define_class(env, "PointerStyle", NAPI_AUTO_LENGTH, EnumConstructor, nullptr,
434         sizeof(desc) / sizeof(*desc), desc, &result), DEFINE_CLASS);
435     CHKRP(env, napi_set_named_property(env, exports, "PointerStyle", result), SET_NAMED_PROPERTY);
436     return exports;
437 }
438 
EnumConstructor(napi_env env,napi_callback_info info)439 napi_value JsPointerContext::EnumConstructor(napi_env env, napi_callback_info info)
440 {
441     CALL_DEBUG_ENTER;
442     size_t argc = 0;
443     napi_value args[1] = { 0 };
444     napi_value ret = nullptr;
445     void *data = nullptr;
446     CHKRP(env, napi_get_cb_info(env, info, &argc, args, &ret, &data), GET_CB_INFO);
447     return ret;
448 }
449 
Export(napi_env env,napi_value exports)450 napi_value JsPointerContext::Export(napi_env env, napi_value exports)
451 {
452     CALL_DEBUG_ENTER;
453     auto instance = CreateInstance(env);
454     if (instance == nullptr) {
455         THROWERR(env, "failed to create instance");
456         return nullptr;
457     }
458     napi_property_descriptor desc[] = {
459         DECLARE_NAPI_STATIC_FUNCTION("setPointerVisible", SetPointerVisible),
460         DECLARE_NAPI_STATIC_FUNCTION("isPointerVisible", IsPointerVisible),
461         DECLARE_NAPI_STATIC_FUNCTION("setPointerSpeed", SetPointerSpeed),
462         DECLARE_NAPI_STATIC_FUNCTION("getPointerSpeed", GetPointerSpeed),
463         DECLARE_NAPI_STATIC_FUNCTION("setPointerStyle", SetPointerStyle),
464         DECLARE_NAPI_STATIC_FUNCTION("getPointerStyle", GetPointerStyle),
465     };
466     CHKRP(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc), DEFINE_PROPERTIES);
467     if (CreatePointerStyle(env, exports) == nullptr) {
468         THROWERR(env, "Failed to create pointer style");
469         return nullptr;
470     }
471     return exports;
472 }
473 } // namespace MMI
474 } // namespace OHOS
475