1 /*
2 * Copyright (c) 2023 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 "adapter/ohos/entrance/mmi_event_convertor.h"
17
18 #include "adapter/ohos/entrance/ace_application_info.h"
19 #include "adapter/ohos/entrance/ace_extra_input_data.h"
20 #include "adapter/ohos/entrance/ace_container.h"
21 #include "adapter/ohos/entrance/tsa_advanced_feature.h"
22
23 namespace OHOS::Ace::Platform {
24 namespace {
25 constexpr int32_t ANGLE_0 = 0;
26 constexpr int32_t ANGLE_90 = 90;
27 constexpr int32_t ANGLE_180 = 180;
28 constexpr int32_t ANGLE_270 = 270;
29 constexpr double SIZE_DIVIDE = 2.0;
30
ConvertTouchEventType(int32_t originAction)31 TouchType ConvertTouchEventType(int32_t originAction)
32 {
33 std::map<int32_t, TouchType> actionMap = {
34 { OHOS::MMI::PointerEvent::POINTER_ACTION_CANCEL, TouchType::CANCEL },
35 { OHOS::MMI::PointerEvent::POINTER_ACTION_DOWN, TouchType::DOWN },
36 { OHOS::MMI::PointerEvent::POINTER_ACTION_MOVE, TouchType::MOVE },
37 { OHOS::MMI::PointerEvent::POINTER_ACTION_UP, TouchType::UP },
38 { OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_DOWN, TouchType::PULL_DOWN },
39 { OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_MOVE, TouchType::PULL_MOVE },
40 { OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_UP, TouchType::PULL_UP },
41 { OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_IN_WINDOW, TouchType::PULL_IN_WINDOW },
42 { OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_OUT_WINDOW, TouchType::PULL_OUT_WINDOW },
43 { OHOS::MMI::PointerEvent::POINTER_ACTION_HOVER_ENTER, TouchType::HOVER_ENTER },
44 { OHOS::MMI::PointerEvent::POINTER_ACTION_HOVER_MOVE, TouchType::HOVER_MOVE },
45 { OHOS::MMI::PointerEvent::POINTER_ACTION_HOVER_EXIT, TouchType::HOVER_EXIT },
46 { OHOS::MMI::PointerEvent::POINTER_ACTION_HOVER_CANCEL, TouchType::HOVER_CANCEL },
47 { OHOS::MMI::PointerEvent::POINTER_ACTION_PROXIMITY_IN, TouchType::PROXIMITY_IN },
48 { OHOS::MMI::PointerEvent::POINTER_ACTION_PROXIMITY_OUT, TouchType::PROXIMITY_OUT },
49 };
50 auto typeIter = actionMap.find(originAction);
51 if (typeIter == actionMap.end()) {
52 return TouchType::UNKNOWN;
53 }
54 return typeIter->second;
55 }
56
ConvertMouseEventAction(int32_t originAction)57 MouseAction ConvertMouseEventAction(int32_t originAction)
58 {
59 switch (originAction) {
60 case OHOS::MMI::PointerEvent::POINTER_ACTION_BUTTON_DOWN:
61 return MouseAction::PRESS;
62 case OHOS::MMI::PointerEvent::POINTER_ACTION_BUTTON_UP:
63 return MouseAction::RELEASE;
64 case OHOS::MMI::PointerEvent::POINTER_ACTION_ENTER_WINDOW:
65 return MouseAction::WINDOW_ENTER;
66 case OHOS::MMI::PointerEvent::POINTER_ACTION_LEAVE_WINDOW:
67 return MouseAction::WINDOW_LEAVE;
68 case OHOS::MMI::PointerEvent::POINTER_ACTION_MOVE:
69 return MouseAction::MOVE;
70 case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_DOWN:
71 return MouseAction::PRESS;
72 case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_MOVE:
73 return MouseAction::MOVE;
74 case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_IN_WINDOW:
75 return MouseAction::WINDOW_ENTER;
76 case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_OUT_WINDOW:
77 return MouseAction::WINDOW_LEAVE;
78 case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_UP:
79 return MouseAction::RELEASE;
80 case OHOS::MMI::PointerEvent::POINTER_ACTION_CANCEL:
81 return MouseAction::CANCEL;
82 default:
83 return MouseAction::NONE;
84 }
85 }
86
ConvertAxisEventAction(int32_t originAction)87 AxisAction ConvertAxisEventAction(int32_t originAction)
88 {
89 switch (originAction) {
90 case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_BEGIN:
91 case OHOS::MMI::PointerEvent::POINTER_ACTION_ROTATE_BEGIN:
92 return AxisAction::BEGIN;
93 case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_UPDATE:
94 case OHOS::MMI::PointerEvent::POINTER_ACTION_ROTATE_UPDATE:
95 return AxisAction::UPDATE;
96 case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_END:
97 case OHOS::MMI::PointerEvent::POINTER_ACTION_ROTATE_END:
98 return AxisAction::END;
99 case OHOS::MMI::PointerEvent::POINTER_ACTION_CANCEL:
100 return AxisAction::CANCEL;
101 default:
102 return AxisAction::NONE;
103 }
104 }
105 } // namespace
106
GetSourceTool(int32_t orgToolType)107 SourceTool GetSourceTool(int32_t orgToolType)
108 {
109 switch (orgToolType) {
110 case OHOS::MMI::PointerEvent::TOOL_TYPE_FINGER:
111 return SourceTool::FINGER;
112 case OHOS::MMI::PointerEvent::TOOL_TYPE_PEN:
113 return SourceTool::PEN;
114 case OHOS::MMI::PointerEvent::TOOL_TYPE_RUBBER:
115 return SourceTool::RUBBER;
116 case OHOS::MMI::PointerEvent::TOOL_TYPE_BRUSH:
117 return SourceTool::BRUSH;
118 case OHOS::MMI::PointerEvent::TOOL_TYPE_PENCIL:
119 return SourceTool::PENCIL;
120 case OHOS::MMI::PointerEvent::TOOL_TYPE_AIRBRUSH:
121 return SourceTool::AIRBRUSH;
122 case OHOS::MMI::PointerEvent::TOOL_TYPE_MOUSE:
123 return SourceTool::MOUSE;
124 case OHOS::MMI::PointerEvent::TOOL_TYPE_LENS:
125 return SourceTool::LENS;
126 case OHOS::MMI::PointerEvent::TOOL_TYPE_TOUCHPAD:
127 return SourceTool::TOUCHPAD;
128 default:
129 LOGW("unknown tool type");
130 return SourceTool::UNKNOWN;
131 }
132 }
133
GetPointerSensorTime(const std::shared_ptr<MMI::PointerEvent> & pointerEvent)134 uint64_t GetPointerSensorTime(const std::shared_ptr<MMI::PointerEvent>& pointerEvent)
135 {
136 if (AceApplicationInfo::GetInstance().GetTouchEventPassMode() != TouchPassMode::ACCELERATE) {
137 return pointerEvent->GetActionTime();
138 }
139 auto inputTime = pointerEvent->GetSensorInputTime();
140 if (inputTime == 0) {
141 // inject event has no sensor time.
142 inputTime = static_cast<uint64_t>(pointerEvent->GetActionTime());
143 }
144 return inputTime;
145 }
146
ConvertTouchPoint(const MMI::PointerEvent::PointerItem & pointerItem,int32_t sourceType,bool useHighPrecision)147 TouchPoint ConvertTouchPoint(const MMI::PointerEvent::PointerItem& pointerItem, int32_t sourceType,
148 bool useHighPrecision)
149 {
150 TouchPoint touchPoint;
151 // just get the max of width and height
152 touchPoint.size = std::max(pointerItem.GetWidth(), pointerItem.GetHeight()) / 2.0;
153 touchPoint.id = pointerItem.GetPointerId();
154 touchPoint.downTime = TimeStamp(std::chrono::microseconds(pointerItem.GetDownTime()));
155 if (useHighPrecision && sourceType == OHOS::MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
156 touchPoint.x = NearZero(pointerItem.GetWindowXPos()) ? pointerItem.GetWindowX()
157 : static_cast<float>(pointerItem.GetWindowXPos());
158 touchPoint.y = NearZero(pointerItem.GetWindowYPos()) ? pointerItem.GetWindowY()
159 : static_cast<float>(pointerItem.GetWindowYPos());
160 touchPoint.screenX = NearZero(pointerItem.GetDisplayXPos()) ? pointerItem.GetDisplayX()
161 : static_cast<float>(pointerItem.GetDisplayXPos());
162 touchPoint.screenY = NearZero(pointerItem.GetDisplayYPos()) ? pointerItem.GetDisplayY()
163 : static_cast<float>(pointerItem.GetDisplayYPos());
164 } else {
165 touchPoint.x = pointerItem.GetWindowX();
166 touchPoint.y = pointerItem.GetWindowY();
167 touchPoint.screenX = pointerItem.GetDisplayX();
168 touchPoint.screenY = pointerItem.GetDisplayY();
169 }
170 touchPoint.globalDisplayX = pointerItem.GetGlobalX();
171 touchPoint.globalDisplayY = pointerItem.GetGlobalY();
172 touchPoint.isPressed = pointerItem.IsPressed();
173 touchPoint.force = static_cast<float>(pointerItem.GetPressure());
174 touchPoint.tiltX = pointerItem.GetTiltX();
175 touchPoint.tiltY = pointerItem.GetTiltY();
176 touchPoint.rollAngle = pointerItem.GetTwist();
177 touchPoint.sourceTool = GetSourceTool(pointerItem.GetToolType());
178 touchPoint.originalId = pointerItem.GetOriginPointerId();
179 touchPoint.width = pointerItem.GetWidth();
180 touchPoint.height = pointerItem.GetHeight();
181 int32_t blobId = pointerItem.GetBlobId();
182 if (blobId < 0) {
183 touchPoint.operatingHand = 0;
184 } else {
185 touchPoint.operatingHand = static_cast<int32_t>(static_cast<uint32_t>(blobId) &
186 (OPERATING_HAND_LEFT | OPERATING_HAND_RIGHT));
187 }
188 return touchPoint;
189 }
190
UpdateTouchEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,TouchEvent & touchEvent)191 void UpdateTouchEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, TouchEvent& touchEvent)
192 {
193 CHECK_NULL_VOID(pointerEvent);
194 auto ids = pointerEvent->GetPointerIds();
195 for (auto&& id : ids) {
196 MMI::PointerEvent::PointerItem item;
197 bool ret = pointerEvent->GetPointerItem(id, item);
198 if (!ret) {
199 LOGE("get pointer item failed.");
200 continue;
201 }
202 auto touchPoint = ConvertTouchPoint(item, pointerEvent->GetSourceType(), true);
203 touchPoint.CovertId();
204 touchEvent.pointers.emplace_back(std::move(touchPoint));
205 }
206 touchEvent.CovertId();
207 }
208
GetTouchEventOriginOffset(const TouchEvent & event)209 Offset GetTouchEventOriginOffset(const TouchEvent& event)
210 {
211 auto pointerEvent = event.pointerEvent;
212 if (!pointerEvent) {
213 return Offset();
214 }
215 int32_t pointerID = pointerEvent->GetPointerId();
216 MMI::PointerEvent::PointerItem item;
217 bool ret = pointerEvent->GetPointerItem(pointerID, item);
218 if (!ret) {
219 return Offset();
220 }
221 if (pointerEvent->GetSourceType() == OHOS::MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
222 return Offset(
223 NearZero(item.GetWindowXPos()) ? item.GetWindowX()
224 : static_cast<float>(item.GetWindowXPos()),
225 NearZero(item.GetWindowYPos()) ? item.GetWindowY()
226 : static_cast<float>(item.GetWindowYPos()));
227 } else {
228 return Offset(item.GetWindowX(), item.GetWindowY());
229 }
230 }
231
GetTouchEventOriginTimeStamp(const TouchEvent & event)232 TimeStamp GetTouchEventOriginTimeStamp(const TouchEvent& event)
233 {
234 auto pointerEvent = event.pointerEvent;
235 if (!pointerEvent) {
236 return event.time;
237 }
238 std::chrono::microseconds microseconds(pointerEvent->GetActionTime());
239 TimeStamp time(microseconds);
240 return time;
241 }
242
UpdatePressedKeyCodes(std::vector<KeyCode> & pressedKeyCodes)243 void UpdatePressedKeyCodes(std::vector<KeyCode>& pressedKeyCodes)
244 {
245 auto inputManager = MMI::InputManager::GetInstance();
246 CHECK_NULL_VOID(inputManager);
247
248 std::vector<int32_t> pressedKeys;
249 std::map<int32_t, int32_t> specialKeysState;
250 pressedKeyCodes.clear();
251 auto ret = inputManager->GetKeyState(pressedKeys, specialKeysState);
252 if (ret == 0) {
253 for (const auto& curCode : pressedKeys) {
254 pressedKeyCodes.emplace_back(static_cast<KeyCode>(curCode));
255 }
256 }
257 }
258
UpdateMouseEventForPen(const MMI::PointerEvent::PointerItem & pointerItem,MouseEvent & mouseEvent)259 void UpdateMouseEventForPen(const MMI::PointerEvent::PointerItem& pointerItem, MouseEvent& mouseEvent)
260 {
261 if (mouseEvent.sourceType != SourceType::TOUCH || mouseEvent.sourceTool != SourceTool::PEN) {
262 return;
263 }
264 mouseEvent.id = TOUCH_TOOL_BASE_ID + static_cast<int32_t>(mouseEvent.sourceTool);
265 // Pen use type double XY position.
266 mouseEvent.x = pointerItem.GetWindowXPos();
267 mouseEvent.y = pointerItem.GetWindowYPos();
268 mouseEvent.screenX = pointerItem.GetDisplayXPos();
269 mouseEvent.screenY = pointerItem.GetDisplayYPos();
270 mouseEvent.originalId = mouseEvent.id;
271 mouseEvent.globalDisplayX = pointerItem.GetGlobalX();
272 mouseEvent.globalDisplayY = pointerItem.GetGlobalY();
273 }
274
ConvertTouchEventFromTouchPoint(TouchPoint touchPoint)275 TouchEvent ConvertTouchEventFromTouchPoint(TouchPoint touchPoint)
276 {
277 TouchEvent event;
278 event.SetId(touchPoint.id)
279 .SetX(touchPoint.x)
280 .SetY(touchPoint.y)
281 .SetScreenX(touchPoint.screenX)
282 .SetScreenY(touchPoint.screenY)
283 .SetGlobalDisplayX(touchPoint.globalDisplayX)
284 .SetGlobalDisplayY(touchPoint.globalDisplayY)
285 .SetType(TouchType::UNKNOWN)
286 .SetPullType(TouchType::UNKNOWN)
287 .SetSize(touchPoint.size)
288 .SetForce(touchPoint.force)
289 .SetTiltX(touchPoint.tiltX)
290 .SetTiltY(touchPoint.tiltY)
291 .SetRollAngle(touchPoint.rollAngle)
292 .SetSourceType(SourceType::NONE)
293 .SetSourceTool(touchPoint.sourceTool)
294 .SetOriginalId(touchPoint.originalId)
295 .SetSourceType(SourceType::NONE)
296 .SetOperatingHand(touchPoint.operatingHand)
297 .SetPressedTime(touchPoint.downTime)
298 .SetWidth(touchPoint.width)
299 .SetHeight(touchPoint.height);
300 return event;
301 }
302
SetClonedPointerEvent(const MMI::PointerEvent * pointerEvent,ArkUITouchEvent * arkUITouchEventCloned)303 void SetClonedPointerEvent(const MMI::PointerEvent* pointerEvent, ArkUITouchEvent* arkUITouchEventCloned)
304 {
305 if (pointerEvent) {
306 MMI::PointerEvent* clonedEvent = new MMI::PointerEvent(*pointerEvent);
307 arkUITouchEventCloned->rawPointerEvent = clonedEvent;
308 }
309 }
310
SetPostPointerEvent(TouchEvent & touchEvent,ArkUITouchEvent * arkUITouchEventCloned)311 void SetPostPointerEvent(TouchEvent& touchEvent, ArkUITouchEvent* arkUITouchEventCloned)
312 {
313 MMI::PointerEvent* pointerEvent = reinterpret_cast<MMI::PointerEvent*>(arkUITouchEventCloned->rawPointerEvent);
314 if (pointerEvent) {
315 MMI::PointerEvent* clonedEvent = new MMI::PointerEvent(*pointerEvent);
316 arkUITouchEventCloned->rawPointerEvent = clonedEvent;
317 }
318 std::shared_ptr<const MMI::PointerEvent> pointer(pointerEvent);
319 touchEvent.SetPointerEvent(pointer);
320 }
321
DestroyRawPointerEvent(ArkUITouchEvent * arkUITouchEvent)322 void DestroyRawPointerEvent(ArkUITouchEvent* arkUITouchEvent)
323 {
324 MMI::PointerEvent* pointerEvent = reinterpret_cast<MMI::PointerEvent*>(arkUITouchEvent->rawPointerEvent);
325 if (pointerEvent) {
326 delete pointerEvent;
327 pointerEvent = nullptr;
328 }
329 }
330
ConvertTouchEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent)331 TouchEvent ConvertTouchEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent)
332 {
333 CHECK_NULL_RETURN(pointerEvent, TouchEvent());
334 int32_t pointerID = pointerEvent->GetPointerId();
335 MMI::PointerEvent::PointerItem item;
336 bool ret = pointerEvent->GetPointerItem(pointerID, item);
337 if (!ret) {
338 LOGE("get pointer item failed.");
339 return TouchEvent();
340 }
341 auto touchPoint = ConvertTouchPoint(item, pointerEvent->GetSourceType(), true);
342 TouchEvent event = ConvertTouchEventFromTouchPoint(touchPoint);
343 std::chrono::microseconds microseconds(GetPointerSensorTime(pointerEvent));
344 TimeStamp time(microseconds);
345 event.SetTime(time)
346 .SetDeviceId(pointerEvent->GetDeviceId())
347 .SetTargetDisplayId(pointerEvent->GetTargetDisplayId())
348 .SetTouchEventId(pointerEvent->GetId());
349 AceExtraInputData::ReadToTouchEvent(pointerEvent, event);
350 event.pointerEvent = pointerEvent;
351 int32_t orgDevice = pointerEvent->GetSourceType();
352 GetEventDevice(orgDevice, event);
353 int32_t orgAction = pointerEvent->GetPointerAction();
354 SetTouchEventType(orgAction, event);
355 event.isPrivacyMode = pointerEvent->HasFlag(OHOS::MMI::InputEvent::EVENT_FLAG_PRIVACY_MODE);
356 UpdateTouchEvent(pointerEvent, event);
357 if (event.sourceType == SourceType::TOUCH && event.sourceTool == SourceTool::PEN) {
358 // Pen use type double XY position.
359 event.x = item.GetWindowXPos();
360 event.y = item.GetWindowYPos();
361 event.screenX = item.GetDisplayXPos();
362 event.screenY = item.GetDisplayYPos();
363 event.globalDisplayX = item.GetGlobalX();
364 event.globalDisplayY = item.GetGlobalY();
365 }
366 event.pressedKeyCodes_.clear();
367 for (const auto& curCode : pointerEvent->GetPressedKeys()) {
368 event.pressedKeyCodes_.emplace_back(static_cast<KeyCode>(curCode));
369 }
370 return event;
371 }
372
SetTouchEventType(int32_t orgAction,TouchEvent & event)373 void SetTouchEventType(int32_t orgAction, TouchEvent& event)
374 {
375 auto touchType = ConvertTouchEventType(orgAction);
376 if (touchType == TouchType::UNKNOWN) {
377 TAG_LOGE(AceLogTag::ACE_INPUTKEYFLOW, "unknown touch type");
378 return;
379 }
380 event.type = touchType;
381 if (touchType == TouchType::PULL_DOWN || touchType == TouchType::PULL_MOVE || touchType == TouchType::PULL_UP ||
382 touchType == TouchType::PULL_IN_WINDOW || touchType == TouchType::PULL_OUT_WINDOW) {
383 event.pullType = touchType;
384 }
385 }
386
GetMouseEventAction(int32_t action,MouseEvent & events,bool isSceneBoardWindow)387 void GetMouseEventAction(int32_t action, MouseEvent& events, bool isSceneBoardWindow)
388 {
389 events.action = ConvertMouseEventAction(action);
390 switch (action) {
391 case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_DOWN:
392 events.pullAction = MouseAction::PULL_DOWN;
393 break;
394 case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_MOVE:
395 events.pullAction = MouseAction::PULL_MOVE;
396 break;
397 case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_IN_WINDOW:
398 events.pullAction = MouseAction::PULL_MOVE;
399 return;
400 case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_OUT_WINDOW:
401 events.pullAction = MouseAction::PULL_MOVE;
402 return;
403 case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_UP:
404 events.pullAction = MouseAction::PULL_UP;
405 break;
406 default:
407 break;
408 }
409 }
410
GetMouseEventButton(int32_t button)411 MouseButton GetMouseEventButton(int32_t button)
412 {
413 switch (button) {
414 case OHOS::MMI::PointerEvent::MOUSE_BUTTON_LEFT:
415 return MouseButton::LEFT_BUTTON;
416 case OHOS::MMI::PointerEvent::MOUSE_BUTTON_RIGHT:
417 return MouseButton::RIGHT_BUTTON;
418 case OHOS::MMI::PointerEvent::MOUSE_BUTTON_MIDDLE:
419 return MouseButton::MIDDLE_BUTTON;
420 case OHOS::MMI::PointerEvent::MOUSE_BUTTON_SIDE:
421 return MouseButton::BACK_BUTTON;
422 case OHOS::MMI::PointerEvent::MOUSE_BUTTON_EXTRA:
423 return MouseButton::FORWARD_BUTTON;
424 case OHOS::MMI::PointerEvent::MOUSE_BUTTON_FORWARD:
425 return MouseButton::FORWARD_BUTTON;
426 case OHOS::MMI::PointerEvent::MOUSE_BUTTON_BACK:
427 return MouseButton::BACK_BUTTON;
428 default:
429 return MouseButton::NONE_BUTTON;
430 }
431 }
432
ConvertMouseEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,MouseEvent & events,bool isSceneBoardWindow)433 void ConvertMouseEvent(
434 const std::shared_ptr<MMI::PointerEvent>& pointerEvent, MouseEvent& events, bool isSceneBoardWindow)
435 {
436 int32_t pointerID = pointerEvent->GetPointerId();
437 MMI::PointerEvent::PointerItem item;
438 bool ret = pointerEvent->GetPointerItem(pointerID, item);
439 if (!ret) {
440 LOGE("get pointer: %{public}d item failed.", pointerID);
441 return;
442 }
443 events.id = pointerID;
444 if (pointerEvent->GetSourceType() == OHOS::MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
445 events.x = NearZero(item.GetWindowXPos()) ? item.GetWindowX() : static_cast<float>(item.GetWindowXPos());
446 events.y = NearZero(item.GetWindowYPos()) ? item.GetWindowY() : static_cast<float>(item.GetWindowYPos());
447 events.screenX =
448 NearZero(item.GetDisplayXPos()) ? item.GetDisplayX() : static_cast<float>(item.GetDisplayXPos());
449 events.screenY =
450 NearZero(item.GetDisplayYPos()) ? item.GetDisplayY() : static_cast<float>(item.GetDisplayYPos());
451 } else {
452 events.x = item.GetWindowX();
453 events.y = item.GetWindowY();
454 events.screenX = item.GetDisplayX();
455 events.screenY = item.GetDisplayY();
456 }
457 events.globalDisplayX = item.GetGlobalX();
458 events.globalDisplayY = item.GetGlobalY();
459 events.rawDeltaX = item.GetRawDx();
460 events.rawDeltaY = item.GetRawDy();
461 GetMouseEventAction(pointerEvent->GetPointerAction(), events, isSceneBoardWindow);
462 events.button = GetMouseEventButton(pointerEvent->GetButtonId());
463 GetEventDevice(pointerEvent->GetSourceType(), events);
464 events.isPrivacyMode = pointerEvent->HasFlag(OHOS::MMI::InputEvent::EVENT_FLAG_PRIVACY_MODE);
465 events.targetDisplayId = pointerEvent->GetTargetDisplayId();
466 events.originalId = item.GetOriginPointerId();
467 events.deviceId = pointerEvent->GetDeviceId();
468
469 std::set<int32_t> pressedSet = pointerEvent->GetPressedButtons();
470 uint32_t pressedButtons = 0;
471 if (pressedSet.find(OHOS::MMI::PointerEvent::MOUSE_BUTTON_LEFT) != pressedSet.end()) {
472 pressedButtons &= static_cast<uint32_t>(MouseButton::LEFT_BUTTON);
473 }
474 if (pressedSet.find(OHOS::MMI::PointerEvent::MOUSE_BUTTON_RIGHT) != pressedSet.end()) {
475 pressedButtons &= static_cast<uint32_t>(MouseButton::RIGHT_BUTTON);
476 }
477 if (pressedSet.find(OHOS::MMI::PointerEvent::MOUSE_BUTTON_MIDDLE) != pressedSet.end()) {
478 pressedButtons &= static_cast<uint32_t>(MouseButton::MIDDLE_BUTTON);
479 }
480 events.pressedButtons = static_cast<int32_t>(pressedButtons);
481
482 for (const auto& pressedButton : pressedSet) {
483 auto convertedButton = GetMouseEventButton(pressedButton);
484 if (convertedButton != MouseButton::NONE_BUTTON) {
485 events.pressedButtonsArray.emplace_back(convertedButton);
486 }
487 }
488 events.time = TimeStamp(std::chrono::microseconds(pointerEvent->GetActionTime()));
489 events.pressedTime = TimeStamp(std::chrono::microseconds(item.GetDownTime()));
490 events.pointerEvent = pointerEvent;
491 events.sourceTool = GetSourceTool(item.GetToolType());
492 UpdateMouseEventForPen(item, events);
493 events.touchEventId = pointerEvent->GetId();
494 events.pressedKeyCodes_.clear();
495 for (const auto& curCode : pointerEvent->GetPressedKeys()) {
496 events.pressedKeyCodes_.emplace_back(static_cast<KeyCode>(curCode));
497 }
498 }
499
GetAxisEventAction(int32_t action,AxisEvent & event)500 void GetAxisEventAction(int32_t action, AxisEvent& event)
501 {
502 event.action = ConvertAxisEventAction(action);
503 }
504
GetNonPointerAxisEventAction(int32_t action,NG::FocusAxisEvent & event)505 void GetNonPointerAxisEventAction(int32_t action, NG::FocusAxisEvent& event)
506 {
507 switch (action) {
508 case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_BEGIN:
509 event.action = AxisAction::BEGIN;
510 break;
511 case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_UPDATE:
512 event.action = AxisAction::UPDATE;
513 break;
514 case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_END:
515 event.action = AxisAction::END;
516 break;
517 case OHOS::MMI::PointerEvent::POINTER_ACTION_CANCEL:
518 event.action = AxisAction::CANCEL;
519 break;
520 default:
521 event.action = AxisAction::NONE;
522 break;
523 }
524 }
525
ConvertCrownEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,CrownEvent & event)526 void ConvertCrownEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, CrownEvent& event)
527 {
528 event.touchEventId = pointerEvent->GetId();
529 int32_t pointerAction = pointerEvent->GetPointerAction();
530 if (pointerAction == MMI::PointerEvent::POINTER_ACTION_AXIS_BEGIN) {
531 event.action = Ace::CrownAction::BEGIN;
532 } else if (pointerAction == MMI::PointerEvent::POINTER_ACTION_AXIS_UPDATE) {
533 event.action = Ace::CrownAction::UPDATE;
534 } else if (pointerAction == MMI::PointerEvent::POINTER_ACTION_AXIS_END) {
535 event.action = Ace::CrownAction::END;
536 } else {
537 event.action = Ace::CrownAction::UNKNOWN;
538 }
539 int32_t orgDevice = pointerEvent->GetSourceType();
540 GetEventDevice(orgDevice, event);
541 event.angularVelocity = pointerEvent->GetVelocity();
542 event.degree = pointerEvent->GetAxisValue(MMI::PointerEvent::AXIS_TYPE_SCROLL_VERTICAL);
543 std::chrono::microseconds microseconds(pointerEvent->GetActionTime());
544 TimeStamp time(microseconds);
545 event.timeStamp = time;
546 event.SetPointerEvent(pointerEvent);
547 }
548
ConvertAxisEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,AxisEvent & event)549 void ConvertAxisEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, AxisEvent& event)
550 {
551 int32_t pointerID = pointerEvent->GetPointerId();
552 MMI::PointerEvent::PointerItem item;
553 bool ret = pointerEvent->GetPointerItem(pointerID, item);
554 if (!ret) {
555 LOGE("get pointer: %{public}d item failed.", pointerID);
556 return;
557 }
558
559 event.id = item.GetPointerId();
560 if (pointerEvent->GetSourceType() == OHOS::MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
561 event.x = NearZero(item.GetWindowXPos()) ? item.GetWindowX() : static_cast<float>(item.GetWindowXPos());
562 event.y = NearZero(item.GetWindowYPos()) ? item.GetWindowY() : static_cast<float>(item.GetWindowYPos());
563 event.screenX =
564 NearZero(item.GetDisplayXPos()) ? item.GetDisplayX() : static_cast<float>(item.GetDisplayXPos());
565 event.screenY =
566 NearZero(item.GetDisplayYPos()) ? item.GetDisplayY() : static_cast<float>(item.GetDisplayYPos());
567 } else {
568 event.x = static_cast<float>(item.GetWindowX());
569 event.y = static_cast<float>(item.GetWindowY());
570 event.screenX = static_cast<float>(item.GetDisplayX());
571 event.screenY = static_cast<float>(item.GetDisplayY());
572 }
573 event.globalDisplayX = item.GetGlobalX();
574 event.globalDisplayY = item.GetGlobalY();
575 event.horizontalAxis = pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_SCROLL_HORIZONTAL);
576 event.verticalAxis = pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_SCROLL_VERTICAL);
577 event.pinchAxisScale = pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_PINCH);
578 event.rotateAxisAngle = pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_ROTATE);
579 int32_t orgAction = pointerEvent->GetPointerAction();
580 GetAxisEventAction(orgAction, event);
581 event.isRotationEvent = (orgAction >= MMI::PointerEvent::POINTER_ACTION_ROTATE_BEGIN) &&
582 (orgAction <= MMI::PointerEvent::POINTER_ACTION_ROTATE_END);
583 event.scrollStep = pointerEvent->GetScrollRows();
584 int32_t orgDevice = pointerEvent->GetSourceType();
585 GetEventDevice(orgDevice, event);
586 event.sourceTool = GetSourceTool(item.GetToolType());
587 event.pointerEvent = pointerEvent;
588 event.originalId = item.GetOriginPointerId();
589 event.deviceId = pointerEvent->GetDeviceId();
590
591 std::chrono::microseconds microseconds(pointerEvent->GetActionTime());
592 TimeStamp time(microseconds);
593 event.time = time;
594 event.touchEventId = pointerEvent->GetId();
595 event.targetDisplayId = pointerEvent->GetTargetDisplayId();
596 event.pressedCodes.clear();
597 for (const auto& curCode : pointerEvent->GetPressedKeys()) {
598 event.pressedCodes.emplace_back(static_cast<KeyCode>(curCode));
599 }
600 }
601
ConvertRawAxisActionToTouch(int32_t rawAxisAction)602 static TouchType ConvertRawAxisActionToTouch(int32_t rawAxisAction)
603 {
604 switch (rawAxisAction) {
605 case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_BEGIN:
606 case OHOS::MMI::PointerEvent::POINTER_ACTION_ROTATE_BEGIN:
607 return TouchType::DOWN;
608 case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_UPDATE:
609 case OHOS::MMI::PointerEvent::POINTER_ACTION_ROTATE_UPDATE:
610 return TouchType::MOVE;
611 case MMI::PointerEvent::POINTER_ACTION_AXIS_END:
612 case MMI::PointerEvent::POINTER_ACTION_ROTATE_END:
613 return TouchType::UP;
614 case OHOS::MMI::PointerEvent::POINTER_ACTION_CANCEL:
615 return TouchType::CANCEL;
616 default:
617 return TouchType::UNKNOWN;
618 }
619 }
620
SetAxisEvent(PointerEvent & axisFakePntEvt,TouchPoint & touchPoint)621 void SetAxisEvent(PointerEvent& axisFakePntEvt, TouchPoint& touchPoint)
622 {
623 axisFakePntEvt.x = touchPoint.x;
624 axisFakePntEvt.y = touchPoint.y;
625 axisFakePntEvt.screenX = touchPoint.screenX;
626 axisFakePntEvt.screenY = touchPoint.screenY;
627 axisFakePntEvt.globalDisplayX = touchPoint.globalDisplayX;
628 axisFakePntEvt.globalDisplayY = touchPoint.globalDisplayY;
629 touchPoint.downTime = axisFakePntEvt.time;
630 }
631
ConvertAxisEventToTouchPoint(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,MMI::PointerEvent::PointerItem & pointerItem,TouchPoint & touchPoint,PointerEvent & axisFakePntEvt)632 static void ConvertAxisEventToTouchPoint(const std::shared_ptr<MMI::PointerEvent>& pointerEvent,
633 MMI::PointerEvent::PointerItem& pointerItem, TouchPoint& touchPoint, PointerEvent& axisFakePntEvt)
634 {
635 constexpr float FAKE_TOUCH_PRESSURE = 3.0f;
636 float cvtStep = SystemProperties::GetScrollCoefficients();
637 touchPoint.id = pointerItem.GetPointerId();
638 touchPoint.isPressed = !(pointerEvent->GetPointerAction() == MMI::PointerEvent::POINTER_ACTION_AXIS_END ||
639 pointerEvent->GetPointerAction() == OHOS::MMI::PointerEvent::POINTER_ACTION_ROTATE_END);
640 touchPoint.force = FAKE_TOUCH_PRESSURE;
641 touchPoint.tiltX = 0.0;
642 touchPoint.tiltY = 0.0;
643 touchPoint.rollAngle = 0.0;
644 touchPoint.sourceTool = SourceTool::FINGER;
645 touchPoint.originalId = pointerItem.GetOriginPointerId();
646 touchPoint.width = 0;
647 touchPoint.height = 0;
648 touchPoint.size = 0.0;
649 touchPoint.operatingHand = 0;
650
651 if (pointerEvent->GetPointerAction() == MMI::PointerEvent::POINTER_ACTION_AXIS_BEGIN ||
652 pointerEvent->GetPointerAction() == MMI::PointerEvent::POINTER_ACTION_ROTATE_BEGIN) {
653 axisFakePntEvt.time = TimeStamp(std::chrono::microseconds(pointerEvent->GetActionTime()));
654 if (pointerEvent->GetSourceType() == OHOS::MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
655 touchPoint.x = NearZero(pointerItem.GetWindowXPos()) ? pointerItem.GetWindowX()
656 : static_cast<float>(pointerItem.GetWindowXPos());
657 touchPoint.y = NearZero(pointerItem.GetWindowYPos()) ? pointerItem.GetWindowY()
658 : static_cast<float>(pointerItem.GetWindowYPos());
659 touchPoint.screenX = NearZero(pointerItem.GetDisplayXPos())
660 ? pointerItem.GetDisplayX()
661 : static_cast<float>(pointerItem.GetDisplayXPos());
662 touchPoint.screenY = NearZero(pointerItem.GetDisplayYPos())
663 ? pointerItem.GetDisplayY()
664 : static_cast<float>(pointerItem.GetDisplayYPos());
665 } else {
666 touchPoint.x = pointerItem.GetWindowX();
667 touchPoint.y = pointerItem.GetWindowY();
668 touchPoint.screenX = pointerItem.GetDisplayX();
669 touchPoint.screenY = pointerItem.GetDisplayY();
670 }
671 touchPoint.globalDisplayX = pointerItem.GetGlobalX();
672 touchPoint.globalDisplayY = pointerItem.GetGlobalY();
673 } else {
674 const float xOffset =
675 cvtStep * pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_SCROLL_HORIZONTAL);
676 const float yOffset =
677 cvtStep * pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_SCROLL_VERTICAL);
678 touchPoint.x = axisFakePntEvt.x - xOffset;
679 touchPoint.y = axisFakePntEvt.y - yOffset;
680 touchPoint.screenX = axisFakePntEvt.screenX - xOffset;
681 touchPoint.screenY = axisFakePntEvt.screenY - yOffset;
682 touchPoint.globalDisplayX = axisFakePntEvt.globalDisplayX - xOffset;
683 touchPoint.globalDisplayY = axisFakePntEvt.globalDisplayY - yOffset;
684 }
685 SetAxisEvent(axisFakePntEvt, touchPoint);
686 }
687
ConvertAxisEventToTouchEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,TouchEvent & touchEvt,OHOS::Ace::PointerEvent & axisFakePntEvt)688 void ConvertAxisEventToTouchEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, TouchEvent& touchEvt,
689 OHOS::Ace::PointerEvent& axisFakePntEvt)
690 {
691 CHECK_NULL_VOID(pointerEvent);
692
693 int32_t pointerID = pointerEvent->GetPointerId();
694 MMI::PointerEvent::PointerItem pointerItem;
695 if (!pointerEvent->GetPointerItem(pointerID, pointerItem)) {
696 return;
697 }
698 TouchPoint touchPoint;
699 ConvertAxisEventToTouchPoint(pointerEvent, pointerItem, touchPoint, axisFakePntEvt);
700 touchEvt = ConvertTouchEventFromTouchPoint(touchPoint);
701 touchEvt.SetSourceType(SourceType::TOUCH)
702 .SetType(ConvertRawAxisActionToTouch(pointerEvent->GetPointerAction()))
703 .SetPullType(TouchType::UNKNOWN)
704 .SetTime(TimeStamp(std::chrono::microseconds(pointerEvent->GetActionTime())))
705 .SetDeviceId(pointerEvent->GetDeviceId())
706 .SetTargetDisplayId(pointerEvent->GetTargetDisplayId())
707 .SetTouchEventId(pointerEvent->GetId())
708 .SetPointerEvent(pointerEvent);
709 touchEvt.convertInfo.first = UIInputEventType::AXIS;
710 touchEvt.convertInfo.second = UIInputEventType::TOUCH;
711
712 touchEvt.pointers.emplace_back(std::move(touchPoint));
713 }
714
ConvertKeyEvent(const std::shared_ptr<MMI::KeyEvent> & keyEvent,KeyEvent & event)715 void ConvertKeyEvent(const std::shared_ptr<MMI::KeyEvent>& keyEvent, KeyEvent& event)
716 {
717 CHECK_NULL_VOID(keyEvent);
718 event.rawKeyEvent = keyEvent;
719 event.code = static_cast<KeyCode>(keyEvent->GetKeyCode());
720 event.numLock = keyEvent->GetFunctionKey(MMI::KeyEvent::NUM_LOCK_FUNCTION_KEY);
721 event.enableCapsLock = keyEvent->GetFunctionKey(MMI::KeyEvent::CAPS_LOCK_FUNCTION_KEY);
722 event.scrollLock = keyEvent->GetFunctionKey(MMI::KeyEvent::SCROLL_LOCK_FUNCTION_KEY);
723 event.keyIntention = static_cast<KeyIntention>(keyEvent->GetKeyIntention());
724 event.targetDisplayId = keyEvent->GetTargetDisplayId();
725 if (keyEvent->GetKeyAction() == OHOS::MMI::KeyEvent::KEY_ACTION_UP) {
726 event.action = KeyAction::UP;
727 } else if (keyEvent->GetKeyAction() == OHOS::MMI::KeyEvent::KEY_ACTION_DOWN) {
728 event.action = KeyAction::DOWN;
729 } else {
730 event.action = KeyAction::UNKNOWN;
731 }
732 auto keyItems = keyEvent->GetKeyItems();
733 for (auto item = keyItems.rbegin(); item != keyItems.rend(); item++) {
734 if (item->GetKeyCode() == keyEvent->GetKeyCode()) {
735 event.unicode = item->GetUnicode();
736 break;
737 } else {
738 event.unicode = 0;
739 }
740 }
741
742 std::chrono::microseconds microseconds(keyEvent->GetActionTime());
743 TimeStamp time(microseconds);
744 event.timeStamp = time;
745 event.key.assign(MMI::KeyEvent::KeyCodeToString(keyEvent->GetKeyCode()));
746 event.deviceId = keyEvent->GetDeviceId();
747 int32_t orgDevice = keyEvent->GetSourceType();
748 event.sourceType =
749 orgDevice == MMI::PointerEvent::SOURCE_TYPE_JOYSTICK ? SourceType::JOYSTICK : SourceType::KEYBOARD;
750 #ifdef SECURITY_COMPONENT_ENABLE
751 event.enhanceData = keyEvent->GetEnhanceData();
752 #endif
753 event.pressedCodes.clear();
754 for (const auto& curCode : keyEvent->GetPressedKeys()) {
755 event.pressedCodes.emplace_back(static_cast<KeyCode>(curCode));
756 }
757 event.enableCapsLock = keyEvent->GetFunctionKey(MMI::KeyEvent::CAPS_LOCK_FUNCTION_KEY);
758 event.numLock = keyEvent->GetFunctionKey(MMI::KeyEvent::NUM_LOCK_FUNCTION_KEY);
759 if (keyEvent->IsFlag(OHOS::MMI::InputEvent::EVENT_FLAG_KEYBOARD_ENTER_FOCUS)) {
760 event.activeMark = true;
761 } else if (keyEvent->IsFlag(OHOS::MMI::InputEvent::EVENT_FLAG_KEYBOARD_EXIT_FOCUS)) {
762 event.activeMark = false;
763 }
764 }
765
ConvertFocusAxisEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,NG::FocusAxisEvent & event)766 void ConvertFocusAxisEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, NG::FocusAxisEvent& event)
767 {
768 int32_t pointerID = pointerEvent->GetPointerId();
769 MMI::PointerEvent::PointerItem item;
770 bool ret = pointerEvent->GetPointerItem(pointerID, item);
771 if (!ret) {
772 LOGE("get pointer: %{public}d item failed.", pointerID);
773 return;
774 }
775
776 event.id = item.GetPointerId();
777 event.absXValue = pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_ABS_X);
778 event.absYValue = pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_ABS_Y);
779 event.absZValue = pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_ABS_Z);
780 event.absRzValue = pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_ABS_RZ);
781 event.absHat0XValue = pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_ABS_HAT0X);
782 event.absHat0YValue = pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_ABS_HAT0Y);
783 event.absBrakeValue = pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_ABS_BRAKE);
784 event.absGasValue = pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_ABS_GAS);
785 int32_t orgAction = pointerEvent->GetPointerAction();
786 GetNonPointerAxisEventAction(orgAction, event);
787 int32_t orgDevice = pointerEvent->GetSourceType();
788 GetEventDevice(orgDevice, event);
789 event.sourceTool = SourceTool::JOYSTICK;
790 event.pointerEvent = pointerEvent;
791 event.originalId = item.GetOriginPointerId();
792 event.deviceId = pointerEvent->GetDeviceId();
793
794 std::chrono::microseconds microseconds(pointerEvent->GetActionTime());
795 TimeStamp time(microseconds);
796 event.time = time;
797 event.touchEventId = pointerEvent->GetId();
798 event.targetDisplayId = pointerEvent->GetTargetDisplayId();
799 event.pressedCodes.clear();
800 for (const auto& curCode : pointerEvent->GetPressedKeys()) {
801 event.pressedCodes.emplace_back(static_cast<KeyCode>(curCode));
802 }
803 }
804
GetPointerEventAction(int32_t action,DragPointerEvent & event)805 void GetPointerEventAction(int32_t action, DragPointerEvent& event)
806 {
807 switch (action) {
808 case OHOS::MMI::PointerEvent::POINTER_ACTION_CANCEL:
809 event.action = PointerAction::CANCEL;
810 break;
811 case OHOS::MMI::PointerEvent::POINTER_ACTION_DOWN:
812 event.action = PointerAction::DOWN;
813 break;
814 case OHOS::MMI::PointerEvent::POINTER_ACTION_MOVE:
815 event.action = PointerAction::MOVE;
816 break;
817 case OHOS::MMI::PointerEvent::POINTER_ACTION_UP:
818 event.action = PointerAction::UP;
819 break;
820 case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_MOVE:
821 event.action = PointerAction::PULL_MOVE;
822 break;
823 case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_UP:
824 event.action = PointerAction::PULL_UP;
825 break;
826 case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_IN_WINDOW:
827 event.action = PointerAction::PULL_IN_WINDOW;
828 break;
829 case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_OUT_WINDOW:
830 event.action = PointerAction::PULL_OUT_WINDOW;
831 break;
832 case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_CANCEL:
833 event.action = PointerAction::PULL_CANCEL;
834 break;
835 default:
836 event.action = PointerAction::UNKNOWN;
837 break;
838 }
839 }
840
841 /**
842 * Only for UIExtension to convert drag event type and dispatch.
843 */
UpdatePointerAction(std::shared_ptr<MMI::PointerEvent> & pointerEvent,const PointerAction action)844 void UpdatePointerAction(std::shared_ptr<MMI::PointerEvent>& pointerEvent, const PointerAction action)
845 {
846 if (action == PointerAction::PULL_IN_WINDOW) {
847 pointerEvent->SetPointerAction(OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_IN_WINDOW);
848 }
849 if (action == PointerAction::PULL_OUT_WINDOW) {
850 pointerEvent->SetPointerAction(OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_OUT_WINDOW);
851 }
852 if (action == PointerAction::UP) {
853 pointerEvent->SetPointerAction(OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_UP);
854 }
855 if (action == PointerAction::PULL_CANCEL) {
856 pointerEvent->SetPointerAction(OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_CANCEL);
857 }
858 }
859
GetPointerEventToolType(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,int32_t & toolType)860 bool GetPointerEventToolType(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, int32_t& toolType)
861 {
862 int32_t pointerID = pointerEvent->GetPointerId();
863 MMI::PointerEvent::PointerItem item;
864 bool ret = pointerEvent->GetPointerItem(pointerID, item);
865 if (!ret) {
866 TAG_LOGE(AceLogTag::ACE_INPUTTRACKING, "get pointer: %{public}d item failed.", pointerID);
867 return false;
868 }
869 toolType = item.GetToolType();
870 return true;
871 }
872
ConvertPointerEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,DragPointerEvent & event)873 void ConvertPointerEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, DragPointerEvent& event)
874 {
875 event.rawPointerEvent = pointerEvent;
876 event.pointerEventId = pointerEvent->GetId();
877 event.pointerId = pointerEvent->GetPointerId();
878 event.pullId = pointerEvent->GetPullId();
879 MMI::PointerEvent::PointerItem pointerItem;
880 pointerEvent->GetPointerItem(pointerEvent->GetPointerId(), pointerItem);
881 event.pressed = pointerItem.IsPressed();
882 if (pointerEvent->GetSourceType() == OHOS::MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
883 event.windowX = NearZero(pointerItem.GetWindowXPos()) ? pointerItem.GetWindowX()
884 : static_cast<float>(pointerItem.GetWindowXPos());
885 event.windowY = NearZero(pointerItem.GetWindowYPos()) ? pointerItem.GetWindowY()
886 : static_cast<float>(pointerItem.GetWindowYPos());
887 event.displayX = NearZero(pointerItem.GetDisplayXPos()) ? pointerItem.GetDisplayX()
888 : static_cast<float>(pointerItem.GetDisplayXPos());
889 event.displayY = NearZero(pointerItem.GetDisplayYPos()) ? pointerItem.GetDisplayY()
890 : static_cast<float>(pointerItem.GetDisplayYPos());
891 } else {
892 event.windowX = pointerItem.GetWindowX();
893 event.windowY = pointerItem.GetWindowY();
894 event.displayX = pointerItem.GetDisplayX();
895 event.displayY = pointerItem.GetDisplayY();
896 }
897 event.globalDisplayX = pointerItem.GetGlobalX();
898 event.globalDisplayY = pointerItem.GetGlobalY();
899 event.displayId = pointerEvent->GetTargetDisplayId();
900 event.size = std::max(pointerItem.GetWidth(), pointerItem.GetHeight()) / SIZE_DIVIDE;
901 event.force = static_cast<float>(pointerItem.GetPressure());
902 event.deviceId = pointerItem.GetDeviceId();
903 event.downTime = TimeStamp(std::chrono::microseconds(pointerItem.GetDownTime()));
904 event.time = TimeStamp(std::chrono::microseconds(pointerEvent->GetActionTime()));
905 event.sourceTool = GetSourceTool(pointerItem.GetToolType());
906 event.targetWindowId = pointerItem.GetTargetWindowId();
907 event.x = event.windowX;
908 event.y = event.windowY;
909 event.pressedKeyCodes.clear();
910 for (const auto& curCode : pointerEvent->GetPressedKeys()) {
911 event.pressedKeyCodes.emplace_back(static_cast<KeyCode>(curCode));
912 }
913 int32_t orgAction = pointerEvent->GetPointerAction();
914 GetPointerEventAction(orgAction, event);
915 }
916
LogPointInfo(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,int32_t instanceId)917 void LogPointInfo(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, int32_t instanceId)
918 {
919 if (pointerEvent->GetSourceType() != OHOS::MMI::PointerEvent::SOURCE_TYPE_MOUSE &&
920 (pointerEvent->GetPointerAction() == OHOS::MMI::PointerEvent::POINTER_ACTION_ENTER_WINDOW ||
921 pointerEvent->GetPointerAction() == OHOS::MMI::PointerEvent::POINTER_ACTION_LEAVE_WINDOW)) {
922 TAG_LOGI(AceLogTag::ACE_INPUTTRACKING, "SourceType:%{public}d error, PointerAction:%{public}d "
923 "instanceId:%{public}d",
924 pointerEvent->GetSourceType(), pointerEvent->GetPointerAction(), instanceId);
925 }
926
927 if (pointerEvent->GetPointerAction() == OHOS::MMI::PointerEvent::POINTER_ACTION_DOWN) {
928 auto container = Platform::AceContainer::GetContainer(instanceId);
929 if (container) {
930 auto pipelineContext = container->GetPipelineContext();
931 if (pipelineContext) {
932 uint32_t windowId = pipelineContext->GetWindowId();
933 TAG_LOGD(AceLogTag::ACE_INPUTTRACKING, "pointdown windowId: %{public}u", windowId);
934 }
935 }
936 }
937 if (SystemProperties::GetDebugEnabled()) {
938 TAG_LOGD(AceLogTag::ACE_DRAG, "point source: %{public}d", pointerEvent->GetSourceType());
939 auto actionId = pointerEvent->GetPointerId();
940 MMI::PointerEvent::PointerItem item;
941 if (pointerEvent->GetPointerItem(actionId, item)) {
942 TAG_LOGD(AceLogTag::ACE_DRAG,
943 "action point info: id: %{public}d, pointerId: %{public}d, action: "
944 "%{public}d, pressure: %{public}f, tiltX: %{public}f, tiltY: %{public}f",
945 pointerEvent->GetId(), actionId, pointerEvent->GetPointerAction(),
946 item.GetPressure(), item.GetTiltX(), item.GetTiltY());
947 }
948 auto ids = pointerEvent->GetPointerIds();
949 for (auto&& id : ids) {
950 MMI::PointerEvent::PointerItem item;
951 if (pointerEvent->GetPointerItem(id, item)) {
952 TAG_LOGD(AceLogTag::ACE_UIEVENT,
953 "all point info: id: %{public}d, x: %{public}d/%{public}f, y: %{public}d/%{public}f, isPressed: "
954 "%{public}d, pressure: %{public}f, tiltX: %{public}f, tiltY: %{public}f",
955 actionId, item.GetWindowX(), static_cast<float>(item.GetWindowXPos()), item.GetWindowY(),
956 static_cast<float>(item.GetWindowYPos()), item.IsPressed(), item.GetPressure(), item.GetTiltX(),
957 item.GetTiltY());
958 }
959 }
960 }
961 }
962
CalculatePointerEvent(const std::shared_ptr<MMI::PointerEvent> & point,const RefPtr<NG::FrameNode> & frameNode,bool useRealtimeMatrix)963 void CalculatePointerEvent(const std::shared_ptr<MMI::PointerEvent>& point, const RefPtr<NG::FrameNode>& frameNode,
964 bool useRealtimeMatrix)
965 {
966 CHECK_NULL_VOID(point);
967 int32_t pointerId = point->GetPointerId();
968 MMI::PointerEvent::PointerItem item;
969 bool ret = point->GetPointerItem(pointerId, item);
970 if (ret) {
971 float xRelative = item.GetWindowX();
972 float yRelative = item.GetWindowY();
973 if (point->GetSourceType() == OHOS::MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
974 xRelative = NearZero(item.GetWindowXPos()) ? item.GetWindowX() : item.GetWindowXPos();
975 yRelative = NearZero(item.GetWindowYPos()) ? item.GetWindowY() : item.GetWindowYPos();
976 }
977 NG::PointF transformPoint(xRelative, yRelative);
978 NG::NGGestureRecognizer::Transform(transformPoint, frameNode, useRealtimeMatrix);
979 item.SetWindowX(static_cast<int32_t>(transformPoint.GetX()));
980 item.SetWindowY(static_cast<int32_t>(transformPoint.GetY()));
981 item.SetWindowXPos(transformPoint.GetX());
982 item.SetWindowYPos(transformPoint.GetY());
983 point->UpdatePointerItem(pointerId, item);
984 }
985 }
986
CalculatePointerEvent(const NG::OffsetF & offsetF,const std::shared_ptr<MMI::PointerEvent> & point,const NG::VectorF & scale,int32_t udegree)987 void CalculatePointerEvent(const NG::OffsetF& offsetF, const std::shared_ptr<MMI::PointerEvent>& point,
988 const NG::VectorF& scale, int32_t udegree)
989 {
990 CHECK_NULL_VOID(point);
991 int32_t pointerId = point->GetPointerId();
992 MMI::PointerEvent::PointerItem item;
993 bool ret = point->GetPointerItem(pointerId, item);
994 if (ret) {
995 float xRelative = item.GetWindowX();
996 float yRelative = item.GetWindowY();
997 if (point->GetSourceType() == OHOS::MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
998 xRelative = NearZero(item.GetWindowXPos()) ? item.GetWindowX() : item.GetWindowXPos();
999 yRelative = NearZero(item.GetWindowYPos()) ? item.GetWindowY() : item.GetWindowYPos();
1000 }
1001 auto windowX = xRelative;
1002 auto windowY = yRelative;
1003 auto pipelineContext = PipelineBase::GetCurrentContextSafelyWithCheck();
1004 CHECK_NULL_VOID(pipelineContext);
1005 auto displayWindowRect = pipelineContext->GetDisplayWindowRectInfo();
1006 auto windowWidth = displayWindowRect.Width();
1007 auto windowHeight = displayWindowRect.Height();
1008 switch (udegree) {
1009 case ANGLE_0:
1010 windowX = xRelative - offsetF.GetX();
1011 windowY = yRelative - offsetF.GetY();
1012 break;
1013 case ANGLE_90:
1014 windowX = yRelative - offsetF.GetX();
1015 windowY = windowWidth - offsetF.GetY() - xRelative;
1016 break;
1017 case ANGLE_180:
1018 windowX = windowWidth - offsetF.GetX() - xRelative;
1019 windowY = windowHeight - offsetF.GetY() - yRelative;
1020 break;
1021 case ANGLE_270:
1022 windowX = windowHeight - offsetF.GetX() - yRelative;
1023 windowY = xRelative - offsetF.GetY();
1024 break;
1025 default:
1026 break;
1027 }
1028 windowX = NearZero(scale.x) ? windowX : windowX / scale.x;
1029 windowY = NearZero(scale.y) ? windowY : windowY / scale.y;
1030
1031 item.SetWindowX(static_cast<int32_t>(windowX));
1032 item.SetWindowY(static_cast<int32_t>(windowY));
1033 item.SetWindowXPos(windowX);
1034 item.SetWindowYPos(windowY);
1035 point->UpdatePointerItem(pointerId, item);
1036 }
1037 }
1038
CalculateWindowCoordinate(const NG::OffsetF & offsetF,const std::shared_ptr<MMI::PointerEvent> & point,const NG::VectorF & scale,const int32_t udegree)1039 void CalculateWindowCoordinate(const NG::OffsetF& offsetF, const std::shared_ptr<MMI::PointerEvent>& point,
1040 const NG::VectorF& scale, const int32_t udegree)
1041 {
1042 CHECK_NULL_VOID(point);
1043 auto ids = point->GetPointerIds();
1044 for (auto&& id : ids) {
1045 MMI::PointerEvent::PointerItem item;
1046 bool ret = point->GetPointerItem(id, item);
1047 if (!ret) {
1048 LOGE("get pointer:%{public}d item failed", id);
1049 continue;
1050 }
1051 float xRelative = item.GetDisplayX();
1052 float yRelative = item.GetDisplayY();
1053 if (point->GetSourceType() == OHOS::MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
1054 xRelative = NearZero(item.GetDisplayXPos()) ? item.GetDisplayX() : item.GetDisplayXPos();
1055 yRelative = NearZero(item.GetDisplayYPos()) ? item.GetDisplayY() : item.GetDisplayYPos();
1056 }
1057 float windowX = xRelative;
1058 float windowY = yRelative;
1059 int32_t deviceWidth = SystemProperties::GetDevicePhysicalWidth();
1060 int32_t deviceHeight = SystemProperties::GetDevicePhysicalHeight();
1061
1062 if (udegree == ANGLE_0) {
1063 windowX = xRelative - offsetF.GetX();
1064 windowY = yRelative - offsetF.GetY();
1065 }
1066 if (udegree == ANGLE_90) {
1067 windowX = yRelative - offsetF.GetX();
1068 windowY = deviceWidth - offsetF.GetY() - xRelative;
1069 }
1070 if (udegree == ANGLE_180) {
1071 windowX = deviceWidth - offsetF.GetX() - xRelative;
1072 windowY = deviceHeight - offsetF.GetY() - yRelative;
1073 }
1074 if (udegree == ANGLE_270) {
1075 windowX = deviceHeight - offsetF.GetX() - yRelative;
1076 windowY = xRelative - offsetF.GetY();
1077 }
1078
1079 windowX = NearZero(scale.x) ? windowX : windowX / scale.x;
1080 windowY = NearZero(scale.y) ? windowY : windowY / scale.y;
1081
1082 item.SetWindowX(static_cast<int32_t>(windowX));
1083 item.SetWindowY(static_cast<int32_t>(windowY));
1084 item.SetWindowXPos(windowX);
1085 item.SetWindowYPos(windowY);
1086 point->UpdatePointerItem(id, item);
1087 }
1088 }
1089
GetTouchTypeFromPointerEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent)1090 TouchType GetTouchTypeFromPointerEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent)
1091 {
1092 CHECK_NULL_RETURN(pointerEvent, TouchType::UNKNOWN);
1093 auto pointerAction = pointerEvent->GetPointerAction();
1094 return ConvertTouchEventType(pointerAction);
1095 }
1096
GetAxisActionFromPointerEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent)1097 AxisAction GetAxisActionFromPointerEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent)
1098 {
1099 CHECK_NULL_RETURN(pointerEvent, AxisAction::NONE);
1100 auto pointerAction = pointerEvent->GetPointerAction();
1101 return ConvertAxisEventAction(pointerAction);
1102 }
1103
GetMouseActionFromPointerEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent)1104 MouseAction GetMouseActionFromPointerEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent)
1105 {
1106 CHECK_NULL_RETURN(pointerEvent, MouseAction::NONE);
1107 auto pointerAction = pointerEvent->GetPointerAction();
1108 return ConvertMouseEventAction(pointerAction);
1109 }
1110 } // namespace OHOS::Ace::Platform
1111