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 "core/event/mouse_event.h"
17
18 #include "base/geometry/ng/point_t.h"
19 #include "base/geometry/offset.h"
20 #include "base/input_manager/input_manager.h"
21 #include "core/common/ace_application_info.h"
22 #include "core/components_ng/gestures/recognizers/gesture_recognizer.h"
23 #include "core/pipeline/pipeline_base.h"
24
25 namespace OHOS::Ace {
HandleHoverEvent(bool isHovered,const MouseEvent & event)26 bool HoverEventTarget::HandleHoverEvent(bool isHovered, const MouseEvent& event)
27 {
28 if (!onHoverEventCallback_) {
29 return false;
30 }
31 HoverInfo hoverInfo;
32 hoverInfo.SetTimeStamp(event.time);
33 hoverInfo.SetDeviceId(event.deviceId);
34 hoverInfo.SetSourceDevice(event.sourceType);
35 hoverInfo.SetSourceTool(event.sourceTool);
36 hoverInfo.SetTarget(GetEventTarget().value_or(EventTarget()));
37 hoverInfo.SetPressedKeyCodes(event.pressedKeyCodes_);
38 // onHoverEventCallback_ may be overwritten in its invoke so we copy it first
39 auto onHoverEventCallback = onHoverEventCallback_;
40 onHoverEventCallback(isHovered, hoverInfo);
41 return !hoverInfo.IsStopPropagation();
42 }
43
HandlePenHoverEvent(bool isHovered,const TouchEvent & event)44 bool HoverEventTarget::HandlePenHoverEvent(bool isHovered, const TouchEvent& event)
45 {
46 if (!onPenHoverEventCallback_) {
47 return false;
48 }
49 HoverInfo hoverInfo;
50 hoverInfo.SetTimeStamp(event.time);
51 hoverInfo.SetDeviceId(event.deviceId);
52 hoverInfo.SetSourceDevice(event.sourceType);
53 hoverInfo.SetSourceTool(event.sourceTool);
54 if (event.tiltX.has_value()) {
55 hoverInfo.SetTiltX(event.tiltX.value_or(0.0f));
56 }
57 if (event.tiltY.has_value()) {
58 hoverInfo.SetTiltY(event.tiltY.value_or(0.0f));
59 }
60 if (event.rollAngle.has_value()) {
61 hoverInfo.SetRollAngle(event.rollAngle.value_or(0.0f));
62 }
63 NG::PointF lastLocalPoint(event.x, event.y);
64 NG::NGGestureRecognizer::Transform(lastLocalPoint, GetAttachedNode(), false,
65 isPostEventResult_, event.postEventNodeId);
66 auto localX = static_cast<float>(lastLocalPoint.GetX());
67 auto localY = static_cast<float>(lastLocalPoint.GetY());
68 hoverInfo.SetLocalLocation(Offset(localX, localY));
69 hoverInfo.SetGlobalLocation(Offset(event.x, event.y));
70 hoverInfo.SetScreenLocation(Offset(event.screenX, event.screenY));
71 hoverInfo.SetTarget(GetEventTarget().value_or(EventTarget()));
72 // onPenHoverEventCallback_ may be overwritten in its invoke so we copy it first
73 auto onPenHoverEventCallback = onPenHoverEventCallback_;
74 onPenHoverEventCallback(isHovered, hoverInfo);
75 return !hoverInfo.IsStopPropagation();
76 }
77
HandlePenHoverMoveEvent(const TouchEvent & event)78 bool HoverEventTarget::HandlePenHoverMoveEvent(const TouchEvent& event)
79 {
80 if (!onPenHoverMoveEventCallback_) {
81 return false;
82 }
83 HoverInfo hoverInfo;
84 hoverInfo.SetTimeStamp(event.time);
85 hoverInfo.SetDeviceId(event.deviceId);
86 hoverInfo.SetSourceDevice(event.sourceType);
87 hoverInfo.SetSourceTool(event.sourceTool);
88 if (event.tiltX.has_value()) {
89 hoverInfo.SetTiltX(event.tiltX.value_or(0.0f));
90 }
91 if (event.tiltY.has_value()) {
92 hoverInfo.SetTiltY(event.tiltY.value_or(0.0f));
93 }
94 if (event.rollAngle.has_value()) {
95 hoverInfo.SetRollAngle(event.rollAngle.value_or(0.0f));
96 }
97 NG::PointF lastLocalPoint(event.x, event.y);
98 NG::NGGestureRecognizer::Transform(lastLocalPoint, GetAttachedNode(), false,
99 isPostEventResult_, event.postEventNodeId);
100 auto localX = static_cast<float>(lastLocalPoint.GetX());
101 auto localY = static_cast<float>(lastLocalPoint.GetY());
102 hoverInfo.SetLocalLocation(Offset(localX, localY));
103 hoverInfo.SetGlobalLocation(Offset(event.x, event.y));
104 hoverInfo.SetScreenLocation(Offset(event.screenX, event.screenY));
105 hoverInfo.SetTarget(GetEventTarget().value_or(EventTarget()));
106 // onPenHoverMoveEventCallback_ may be overwritten in its invoke so we copy it first
107 auto onPenHoverMoveEventCallback = onPenHoverMoveEventCallback_;
108 onPenHoverMoveEventCallback(hoverInfo);
109 return !hoverInfo.IsStopPropagation();
110 }
111
HandleAccessibilityHoverEvent(bool isHovered,const TouchEvent & event)112 void HoverEventTarget::HandleAccessibilityHoverEvent(bool isHovered, const TouchEvent& event)
113 {
114 if (!onAccessibilityHoverCallback_) {
115 return;
116 }
117 AccessibilityHoverInfo hoverInfo;
118 hoverInfo.SetTimeStamp(event.time);
119 hoverInfo.SetDeviceId(event.deviceId);
120 hoverInfo.SetSourceDevice(event.sourceType);
121 hoverInfo.SetSourceTool(event.sourceTool);
122 hoverInfo.SetPressedKeyCodes(event.pressedKeyCodes_);
123 NG::PointF lastLocalPoint(event.x, event.y);
124 NG::NGGestureRecognizer::Transform(lastLocalPoint, GetAttachedNode(), false,
125 isPostEventResult_, event.postEventNodeId);
126 auto localX = static_cast<float>(lastLocalPoint.GetX());
127 auto localY = static_cast<float>(lastLocalPoint.GetY());
128 hoverInfo.SetLocalLocation(Offset(localX, localY));
129 hoverInfo.SetGlobalLocation(Offset(event.x, event.y));
130 hoverInfo.SetScreenLocation(Offset(event.screenX, event.screenY));
131 hoverInfo.SetActionType(ConvertAccessibilityHoverAction(event.type));
132 hoverInfo.SetTarget(GetEventTarget().value_or(EventTarget()));
133 // onAccessibilityHoverCallback_ may be overwritten in its invoke so we copy it first
134 auto onAccessibilityHoverCallback = onAccessibilityHoverCallback_;
135 onAccessibilityHoverCallback(isHovered, hoverInfo);
136 }
137
ConvertAccessibilityHoverAction(TouchType type)138 AccessibilityHoverAction HoverEventTarget::ConvertAccessibilityHoverAction(TouchType type)
139 {
140 switch (type) {
141 case TouchType::HOVER_ENTER:
142 return AccessibilityHoverAction::HOVER_ENTER;
143 case TouchType::HOVER_MOVE:
144 return AccessibilityHoverAction::HOVER_MOVE;
145 case TouchType::HOVER_EXIT:
146 return AccessibilityHoverAction::HOVER_EXIT;
147 case TouchType::HOVER_CANCEL:
148 return AccessibilityHoverAction::HOVER_CANCEL;
149 case TouchType::DOWN:
150 case TouchType::UP:
151 case TouchType::MOVE:
152 case TouchType::CANCEL:
153 case TouchType::PULL_DOWN:
154 case TouchType::PULL_UP:
155 case TouchType::PULL_MOVE:
156 case TouchType::PULL_IN_WINDOW:
157 case TouchType::PULL_OUT_WINDOW:
158 case TouchType::PROXIMITY_IN:
159 case TouchType::PROXIMITY_OUT:
160 case TouchType::UNKNOWN:
161 return AccessibilityHoverAction::UNKNOWN;
162 }
163 }
164
HandleMouseEvent(const MouseEvent & event)165 bool MouseEventTarget::HandleMouseEvent(const MouseEvent& event)
166 {
167 if (!onMouseCallback_) {
168 return false;
169 }
170 MouseInfo info;
171 info.SetPointerEvent(event.GetMouseEventPointerEvent());
172 info.SetButton(event.button);
173 info.SetAction(event.action);
174 info.SetPullAction(event.pullAction);
175 info.SetGlobalLocation(event.GetOffset());
176 NG::PointF localPoint(event.x, event.y);
177 NG::NGGestureRecognizer::Transform(localPoint, GetAttachedNode(), false, isPostEventResult_);
178 auto localX = static_cast<float>(localPoint.GetX());
179 auto localY = static_cast<float>(localPoint.GetY());
180 info.SetLocalLocation(Offset(localX, localY));
181 info.SetScreenLocation(event.GetScreenOffset());
182 info.SetTimeStamp(event.time);
183 info.SetDeviceId(event.deviceId);
184 info.SetTargetDisplayId(event.targetDisplayId);
185 info.SetSourceDevice(event.sourceType);
186 info.SetSourceTool(event.sourceTool);
187 info.SetTarget(GetEventTarget().value_or(EventTarget()));
188 info.SetPressedKeyCodes(event.pressedKeyCodes_);
189 info.SetRawDeltaX(event.rawDeltaX);
190 info.SetRawDeltaY(event.rawDeltaY);
191 info.SetPressedButtons(event.pressedButtonsArray);
192 // onMouseCallback_ may be overwritten in its invoke so we copy it first
193 auto onMouseCallback = onMouseCallback_;
194 onMouseCallback(info);
195 return info.IsStopPropagation();
196 }
GetMouseEventPointerEvent() const197 std::shared_ptr<MMI::PointerEvent> MouseEvent::GetMouseEventPointerEvent() const
198 {
199 return InputManager::CreatePointerEvent(pointerEvent);
200 }
201
operator -(const Offset & offset) const202 MouseEvent MouseEvent::operator-(const Offset& offset) const
203 {
204 MouseEvent mouseEvent;
205 mouseEvent.x = x - offset.GetX();
206 mouseEvent.x = x - offset.GetX();
207 mouseEvent.y = y - offset.GetY();
208 mouseEvent.z = z;
209 mouseEvent.deltaX = deltaX;
210 mouseEvent.deltaY = deltaY;
211 mouseEvent.deltaZ = deltaZ;
212 mouseEvent.scrollX = scrollX;
213 mouseEvent.scrollY = scrollY;
214 mouseEvent.scrollZ = scrollZ;
215 mouseEvent.screenX = screenX - offset.GetX();
216 mouseEvent.screenY = screenY - offset.GetY();
217 mouseEvent.action = action;
218 mouseEvent.button = button;
219 mouseEvent.pressedButtons = pressedButtons;
220 mouseEvent.time = time;
221 mouseEvent.deviceId = deviceId;
222 mouseEvent.targetDisplayId = targetDisplayId;
223 mouseEvent.sourceType = sourceType;
224 mouseEvent.sourceTool = sourceTool;
225 mouseEvent.pointerEvent = pointerEvent;
226 mouseEvent.originalId = originalId;
227 mouseEvent.pressedKeyCodes_ = pressedKeyCodes_;
228 mouseEvent.isInjected = isInjected;
229 mouseEvent.isPrivacyMode = isPrivacyMode;
230 mouseEvent.rawDeltaX = rawDeltaX;
231 mouseEvent.rawDeltaY = rawDeltaY;
232 mouseEvent.pressedButtonsArray = pressedButtonsArray;
233 return mouseEvent;
234 }
235 } // namespace OHOS::Ace
236