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