• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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