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 "input_binding.h"
17
18 #include <vector>
19
20 #include "input_manager.h"
21
22 #include "devicestatus_define.h"
23 #include "input_binding_internal.h"
24
25 #undef LOG_TAG
26 #define LOG_TAG "InputBinding"
27
28 namespace {
29 #define INPUT_MANAGER OHOS::MMI::InputManager::GetInstance()
30 } // namespace
31
DragMonitorConsumer(void (* cb)(CPointerEvent *))32 DragMonitorConsumer::DragMonitorConsumer(void (*cb)(CPointerEvent *)) : callback_(cb)
33 {
34 }
35
OnInputEvent(std::shared_ptr<OHOS::MMI::AxisEvent> axisEvent) const36 void DragMonitorConsumer::OnInputEvent(std::shared_ptr<OHOS::MMI::AxisEvent> axisEvent) const
37 {
38 }
39
OnInputEvent(std::shared_ptr<OHOS::MMI::KeyEvent> keyEvent) const40 void DragMonitorConsumer::OnInputEvent(std::shared_ptr<OHOS::MMI::KeyEvent> keyEvent) const
41 {
42 }
43
OnInputEvent(std::shared_ptr<OHOS::MMI::PointerEvent> pointerEvent) const44 void DragMonitorConsumer::OnInputEvent(std::shared_ptr<OHOS::MMI::PointerEvent> pointerEvent) const
45 {
46 CALL_DEBUG_ENTER;
47 CHKPV(pointerEvent);
48 auto cPointerEvent = new (std::nothrow) CPointerEvent(pointerEvent);
49 CHKPV(cPointerEvent);
50 CHKPV(callback_);
51 callback_(cPointerEvent);
52 }
53
CGetPointerId(const CPointerEvent * cPointerEvent)54 int32_t CGetPointerId(const CPointerEvent* cPointerEvent)
55 {
56 CALL_DEBUG_ENTER;
57 CHKPR(cPointerEvent, RET_ERR);
58 CHKPR(cPointerEvent->event, RET_ERR);
59 return cPointerEvent->event->GetPointerId();
60 }
61
CGetPointerAction(const CPointerEvent * cPointerEvent)62 int32_t CGetPointerAction(const CPointerEvent* cPointerEvent)
63 {
64 CALL_DEBUG_ENTER;
65 CHKPR(cPointerEvent, RET_ERR);
66 CHKPR(cPointerEvent->event, RET_ERR);
67 auto ret = cPointerEvent->event->GetPointerAction();
68 FI_HILOGD("action:%{public}d", ret);
69 return ret;
70 }
71
CGetTargetWindowId(const CPointerEvent * cPointerEvent)72 int32_t CGetTargetWindowId(const CPointerEvent* cPointerEvent)
73 {
74 CALL_DEBUG_ENTER;
75 CHKPR(cPointerEvent, RET_ERR);
76 CHKPR(cPointerEvent->event, RET_ERR);
77 return cPointerEvent->event->GetTargetWindowId();
78 }
79
CGetSourceType(const CPointerEvent * cPointerEvent)80 int32_t CGetSourceType(const CPointerEvent* cPointerEvent)
81 {
82 CALL_DEBUG_ENTER;
83 CHKPR(cPointerEvent, RET_ERR);
84 CHKPR(cPointerEvent->event, RET_ERR);
85 return cPointerEvent->event->GetSourceType();
86 }
87
CGetTargetDisplayId(const CPointerEvent * cPointerEvent)88 int32_t CGetTargetDisplayId(const CPointerEvent* cPointerEvent)
89 {
90 CALL_DEBUG_ENTER;
91 CHKPR(cPointerEvent, RET_ERR);
92 CHKPR(cPointerEvent->event, RET_ERR);
93 return cPointerEvent->event->GetTargetDisplayId();
94 }
95
CGetDisplayX(const CPointerEvent * cPointerEvent)96 int32_t CGetDisplayX(const CPointerEvent* cPointerEvent)
97 {
98 CALL_DEBUG_ENTER;
99 CHKPR(cPointerEvent, RET_ERR);
100 CHKPR(cPointerEvent->event, RET_ERR);
101 OHOS::MMI::PointerEvent::PointerItem pointerItem;
102 cPointerEvent->event->GetPointerItem(CGetPointerId(cPointerEvent), pointerItem);
103 return pointerItem.GetDisplayX();
104 }
105
CGetDisplayY(const CPointerEvent * cPointerEvent)106 int32_t CGetDisplayY(const CPointerEvent* cPointerEvent)
107 {
108 CALL_DEBUG_ENTER;
109 CHKPR(cPointerEvent, RET_ERR);
110 CHKPR(cPointerEvent->event, RET_ERR);
111 OHOS::MMI::PointerEvent::PointerItem pointerItem;
112 cPointerEvent->event->GetPointerItem(CGetPointerId(cPointerEvent), pointerItem);
113 return pointerItem.GetDisplayY();
114 }
115
CPointerEventAddFlag(const CPointerEvent * cPointerEvent)116 void CPointerEventAddFlag(const CPointerEvent* cPointerEvent)
117 {
118 CALL_DEBUG_ENTER;
119 CHKPV(cPointerEvent);
120 CHKPV(cPointerEvent->event);
121 cPointerEvent->event->AddFlag(OHOS::MMI::InputEvent::EVENT_FLAG_NO_INTERCEPT);
122 }
123
CKeyEventAddFlag(const CKeyEvent * cKeyEvent)124 void CKeyEventAddFlag(const CKeyEvent* cKeyEvent)
125 {
126 CALL_DEBUG_ENTER;
127 CHKPV(cKeyEvent);
128 CHKPV(cKeyEvent->event);
129 cKeyEvent->event->AddFlag(OHOS::MMI::AxisEvent::EVENT_FLAG_NO_INTERCEPT);
130 }
131
CGetDeviceId(const CPointerEvent * cPointerEvent)132 int32_t CGetDeviceId(const CPointerEvent* cPointerEvent)
133 {
134 CALL_DEBUG_ENTER;
135 CHKPR(cPointerEvent, RET_ERR);
136 CHKPR(cPointerEvent->event, RET_ERR);
137 return cPointerEvent->event->GetDeviceId();
138 }
139
CGetKeyCode(const CKeyEvent * cKeyEvent)140 int32_t CGetKeyCode(const CKeyEvent* cKeyEvent)
141 {
142 CALL_DEBUG_ENTER;
143 CHKPR(cKeyEvent, RET_ERR);
144 CHKPR(cKeyEvent->event, RET_ERR);
145 return cKeyEvent->event->GetKeyCode();
146 }
147
CAddMonitor(void (* callback)(CPointerEvent *))148 int32_t CAddMonitor(void (*callback)(CPointerEvent *))
149 {
150 CALL_DEBUG_ENTER;
151 CHKPR(callback, RET_ERR);
152 auto consumer = std::make_shared<DragMonitorConsumer>(callback);
153 auto ret = INPUT_MANAGER->AddMonitor(consumer);
154 if (ret < 0) {
155 FI_HILOGE("Failed to add monitor");
156 return RET_ERR;
157 }
158 return RET_OK;
159 }
160
CGetWindowPid(const CPointerEvent * cPointerEvent)161 int32_t CGetWindowPid(const CPointerEvent* cPointerEvent)
162 {
163 CALL_DEBUG_ENTER;
164 CHKPR(cPointerEvent, RET_ERR);
165 CHKPR(cPointerEvent->event, RET_ERR);
166 return INPUT_MANAGER->GetWindowPid(CGetTargetWindowId(cPointerEvent));
167 }
168
CGetPointerStyle(CPointerStyle * cPointerStyle)169 int32_t CGetPointerStyle(CPointerStyle* cPointerStyle)
170 {
171 CALL_DEBUG_ENTER;
172 CHKPR(cPointerStyle, RET_ERR);
173 OHOS::MMI::PointerStyle pointerStyle;
174 if (INPUT_MANAGER->GetPointerStyle(OHOS::MMI::GLOBAL_WINDOW_ID, pointerStyle) != RET_OK) {
175 FI_HILOGE("Failed to get pointer style");
176 return RET_ERR;
177 }
178
179 cPointerStyle->size = pointerStyle.size;
180 cPointerStyle->color = pointerStyle.color;
181 cPointerStyle->id = pointerStyle.id;
182 return RET_OK;
183 }
184
CAppendExtraData(CExtraData cExtraData)185 void CAppendExtraData(CExtraData cExtraData)
186 {
187 CALL_DEBUG_ENTER;
188 CHKPV(cExtraData.buffer);
189 uint8_t* uData = cExtraData.buffer;
190 CHKPV(uData);
191 OHOS::MMI::ExtraData extraData;
192 extraData.appended = cExtraData.appended;
193 extraData.pointerId = cExtraData.pointerId;
194 extraData.sourceType = cExtraData.sourceType;
195 for (size_t i = 0; i < cExtraData.bufferSize; ++i) {
196 extraData.buffer.emplace_back(*uData);
197 ++uData;
198 }
199 INPUT_MANAGER->AppendExtraData(extraData);
200 }
201
CSetPointerVisible(bool visible)202 int32_t CSetPointerVisible(bool visible)
203 {
204 CALL_DEBUG_ENTER;
205 if (INPUT_MANAGER->SetPointerVisible(visible) != RET_OK) {
206 FI_HILOGE("Failed to set pointer visible");
207 return RET_ERR;
208 }
209 return RET_OK;
210 }
211
CEnableInputDevice(bool enable)212 int32_t CEnableInputDevice(bool enable)
213 {
214 CALL_DEBUG_ENTER;
215 if (INPUT_MANAGER->EnableInputDevice(enable) != RET_OK) {
216 FI_HILOGE("Failed to enable input device");
217 return RET_ERR;
218 }
219 return RET_OK;
220 }
221
CRemoveInputEventFilter(int32_t filterId)222 int32_t CRemoveInputEventFilter(int32_t filterId)
223 {
224 CALL_DEBUG_ENTER;
225 if (INPUT_MANAGER->RemoveInputEventFilter(filterId) != RET_OK) {
226 FI_HILOGE("Failed to remove input event filter");
227 return RET_ERR;
228 }
229 return RET_OK;
230 }
231
CRemoveMonitor(int32_t monitorId)232 void CRemoveMonitor(int32_t monitorId)
233 {
234 CALL_DEBUG_ENTER;
235 INPUT_MANAGER->RemoveMonitor(monitorId);
236 }
237
CRemoveInterceptor(int32_t interceptorId)238 void CRemoveInterceptor(int32_t interceptorId)
239 {
240 CALL_DEBUG_ENTER;
241 INPUT_MANAGER->RemoveInterceptor(interceptorId);
242 }
243
CSetPointerLocation(int32_t physicalX,int32_t physicalY)244 void CSetPointerLocation(int32_t physicalX, int32_t physicalY)
245 {
246 CALL_DEBUG_ENTER;
247 INPUT_MANAGER->SetPointerLocation(physicalX, physicalY);
248 }
249
CDestroyPointerEvent(CPointerEvent * cPointerEvent)250 void CDestroyPointerEvent(CPointerEvent* cPointerEvent)
251 {
252 CALL_DEBUG_ENTER;
253 CHKPV(cPointerEvent);
254 CHKPV(cPointerEvent->event);
255 cPointerEvent->event = nullptr;
256 delete cPointerEvent;
257 }