1 /*
2 * Copyright (c) 2021-2022 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 "touch_transform_point_processor.h"
17 #include "mmi_log.h"
18
19 namespace OHOS {
20 namespace MMI {
21 namespace {
22 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, MMI_LOG_DOMAIN, "TouchTransformPointProcessor"};
23 }
24
TouchTransformPointProcessor(int32_t deviceId)25 TouchTransformPointProcessor::TouchTransformPointProcessor(int32_t deviceId) : deviceId_(deviceId)
26 {
27 pointerEvent_ = PointerEvent::Create();
28 }
29
~TouchTransformPointProcessor()30 TouchTransformPointProcessor::~TouchTransformPointProcessor() {}
31
SetPointEventSource(int32_t sourceType)32 void TouchTransformPointProcessor::SetPointEventSource(int32_t sourceType)
33 {
34 pointerEvent_->SetSourceType(sourceType);
35 }
36
OnEventTouchDown(struct libinput_event * event)37 bool TouchTransformPointProcessor::OnEventTouchDown(struct libinput_event *event)
38 {
39 MMI_LOGD("Enter");
40 CHKPF(event);
41 auto data = libinput_event_get_touch_event(event);
42 CHKPF(data);
43 auto seatSlot = libinput_event_touch_get_seat_slot(data);
44 auto pressure = libinput_event_get_touch_pressure(event);
45 int32_t logicalY = -1;
46 int32_t logicalX = -1;
47 int32_t logicalDisplayId = -1;
48 if (!WinMgr->TouchDownPointToDisplayPoint(data, direction_, logicalX, logicalY, logicalDisplayId)) {
49 MMI_LOGD("TouchDownPointToDisplayPoint failed");
50 return false;
51 }
52 auto pointIds = pointerEvent_->GetPointersIdList();
53 int64_t time = GetSysClockTime();
54 if (pointIds.empty()) {
55 pointerEvent_->SetActionStartTime(time);
56 pointerEvent_->SetTargetDisplayId(logicalDisplayId);
57 }
58 pointerEvent_->SetActionTime(time);
59 pointerEvent_->SetPointerAction(PointerEvent::POINTER_ACTION_DOWN);
60
61 PointerEvent::PointerItem pointer;
62 pointer.SetPointerId(seatSlot);
63 pointer.SetDownTime(time);
64 pointer.SetPressed(true);
65 pointer.SetGlobalX(logicalX);
66 pointer.SetGlobalY(logicalY);
67 pointer.SetPressure(pressure);
68 pointer.SetDeviceId(deviceId_);
69 pointerEvent_->SetDeviceId(deviceId_);
70 pointerEvent_->AddPointerItem(pointer);
71 pointerEvent_->SetPointerId(seatSlot);
72 MMI_LOGD("LogicalX:%{public}d, logicalY:%{public}d, logicalDisplay:%{public}d",
73 logicalX, logicalY, logicalDisplayId);
74 MMI_LOGD("Leave");
75 return true;
76 }
77
OnEventTouchMotion(struct libinput_event * event)78 bool TouchTransformPointProcessor::OnEventTouchMotion(struct libinput_event *event)
79 {
80 MMI_LOGD("Enter");
81 CHKPF(event);
82 auto data = libinput_event_get_touch_event(event);
83 CHKPF(data);
84 auto seatSlot = libinput_event_touch_get_seat_slot(data);
85 auto pressure = libinput_event_get_touch_pressure(event);
86 int64_t time = GetSysClockTime();
87 pointerEvent_->SetActionTime(time);
88 pointerEvent_->SetPointerAction(PointerEvent::POINTER_ACTION_MOVE);
89 int32_t logicalY = -1;
90 int32_t logicalX = -1;
91 int32_t logicalDisplayId = pointerEvent_->GetTargetDisplayId();
92 if (!WinMgr->TouchMotionPointToDisplayPoint(data, direction_, logicalDisplayId, logicalX, logicalY)) {
93 return false;
94 }
95 PointerEvent::PointerItem pointer;
96 CHKF(pointerEvent_->GetPointerItem(seatSlot, pointer), PARAM_INPUT_FAIL);
97 pointer.SetPressure(pressure);
98 pointer.SetGlobalX(logicalX);
99 pointer.SetGlobalY(logicalY);
100 pointerEvent_->UpdatePointerItem(seatSlot, pointer);
101 pointerEvent_->SetPointerId(seatSlot);
102 MMI_LOGD("Leave");
103 return true;
104 }
105
OnEventTouchUp(struct libinput_event * event)106 bool TouchTransformPointProcessor::OnEventTouchUp(struct libinput_event *event)
107 {
108 MMI_LOGD("Enter");
109 CHKPF(event);
110 auto data = libinput_event_get_touch_event(event);
111 CHKPF(data);
112 auto seatSlot = libinput_event_touch_get_seat_slot(data);
113 int64_t time = GetSysClockTime();
114 pointerEvent_->SetActionTime(time);
115 pointerEvent_->SetPointerAction(PointerEvent::POINTER_ACTION_UP);
116
117 PointerEvent::PointerItem pointer;
118 CHKF(pointerEvent_->GetPointerItem(seatSlot, pointer), PARAM_INPUT_FAIL);
119 pointer.SetPressed(false);
120 pointerEvent_->UpdatePointerItem(seatSlot, pointer);
121 pointerEvent_->SetPointerId(seatSlot);
122 MMI_LOGD("Leave");
123 return true;
124 }
125
OnLibinputTouchEvent(struct libinput_event * event)126 std::shared_ptr<PointerEvent> TouchTransformPointProcessor::OnLibinputTouchEvent(struct libinput_event *event)
127 {
128 MMI_LOGD("begin");
129 CHKPP(event);
130 CHKPP(pointerEvent_);
131 pointerEvent_->UpdateId();
132 auto type = libinput_event_get_type(event);
133 switch (type) {
134 case LIBINPUT_EVENT_TOUCH_DOWN: {
135 if (!OnEventTouchDown(event)) {
136 return nullptr;
137 }
138 break;
139 }
140 case LIBINPUT_EVENT_TOUCH_UP: {
141 if (!OnEventTouchUp(event)) {
142 return nullptr;
143 }
144 break;
145 }
146 case LIBINPUT_EVENT_TOUCH_MOTION: {
147 if (!OnEventTouchMotion(event)) {
148 return nullptr;
149 }
150 break;
151 }
152 default: {
153 MMI_LOGE("Unknown event type, touchType:%{public}d", type);
154 return nullptr;
155 }
156 }
157 MMI_LOGD("end");
158 return pointerEvent_;
159 }
160 } // namespace MMI
161 } // namespace OHOS
162
163