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