• 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/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