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 "touchpad_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,
23 "TouchPadTransformPointProcessor"};
24 }
25
TouchPadTransformPointProcessor(int32_t deviceId)26 TouchPadTransformPointProcessor::TouchPadTransformPointProcessor(int32_t deviceId) : deviceId_(deviceId)
27 {
28 pointerEvent_ = PointerEvent::Create();
29 }
30
~TouchPadTransformPointProcessor()31 TouchPadTransformPointProcessor::~TouchPadTransformPointProcessor() {}
32
SetPointEventSource(int32_t sourceType)33 void TouchPadTransformPointProcessor::SetPointEventSource(int32_t sourceType)
34 {
35 pointerEvent_->SetSourceType(sourceType);
36 }
37
OnEventTouchPadDown(struct libinput_event * event)38 void TouchPadTransformPointProcessor::OnEventTouchPadDown(struct libinput_event *event)
39 {
40 MMI_LOGD("Enter");
41 CHKPV(event);
42 auto data = libinput_event_get_touchpad_event(event);
43 CHKPV(data);
44 auto seatSlot = libinput_event_touchpad_get_seat_slot(data);
45 auto logicalX = libinput_event_touchpad_get_x(data);
46 auto logicalY = libinput_event_touchpad_get_y(data);
47
48 int64_t time = GetSysClockTime();
49 auto pointIds = pointerEvent_->GetPointersIdList();
50 if (pointIds.empty()) {
51 pointerEvent_->SetActionStartTime(time);
52 }
53 pointerEvent_->SetActionTime(time);
54 pointerEvent_->SetPointerAction(PointerEvent::POINTER_ACTION_DOWN);
55 PointerEvent::PointerItem pointer;
56 pointer.SetPointerId(seatSlot);
57 pointer.SetDownTime(time);
58 pointer.SetPressed(true);
59 pointer.SetGlobalX(static_cast<int32_t>(logicalX));
60 pointer.SetGlobalY(static_cast<int32_t>(logicalY));
61 pointer.SetDeviceId(deviceId_);
62 pointerEvent_->SetDeviceId(deviceId_);
63 pointerEvent_->AddPointerItem(pointer);
64 pointerEvent_->SetPointerId(seatSlot);
65 MMI_LOGD("End");
66 }
67
OnEventTouchPadMotion(struct libinput_event * event)68 void TouchPadTransformPointProcessor::OnEventTouchPadMotion(struct libinput_event *event)
69 {
70 MMI_LOGD("Enter");
71 CHKPV(event);
72 auto data = libinput_event_get_touchpad_event(event);
73 CHKPV(data);
74 auto seatSlot = libinput_event_touchpad_get_seat_slot(data);
75 auto logicalX = libinput_event_touchpad_get_x(data);
76 auto logicalY = libinput_event_touchpad_get_y(data);
77
78 int64_t time = GetSysClockTime();
79 pointerEvent_->SetActionTime(time);
80 pointerEvent_->SetPointerAction(PointerEvent::POINTER_ACTION_MOVE);
81 PointerEvent::PointerItem pointer;
82 CHK(pointerEvent_->GetPointerItem(seatSlot, pointer), PARAM_INPUT_FAIL);
83 pointer.SetGlobalX(static_cast<int32_t>(logicalX));
84 pointer.SetGlobalY(static_cast<int32_t>(logicalY));
85 pointerEvent_->UpdatePointerItem(seatSlot, pointer);
86 pointerEvent_->SetPointerId(seatSlot);
87 MMI_LOGD("End");
88 }
89
OnEventTouchPadUp(struct libinput_event * event)90 void TouchPadTransformPointProcessor::OnEventTouchPadUp(struct libinput_event *event)
91 {
92 MMI_LOGD("Enter");
93 CHKPV(event);
94 auto data = libinput_event_get_touchpad_event(event);
95 CHKPV(data);
96 auto seatSlot = libinput_event_touchpad_get_seat_slot(data);
97 auto logicalX = libinput_event_touchpad_get_x(data);
98 auto logicalY = libinput_event_touchpad_get_y(data);
99
100 int64_t time = GetSysClockTime();
101 pointerEvent_->SetActionTime(time);
102 pointerEvent_->SetPointerAction(PointerEvent::POINTER_ACTION_UP);
103
104 PointerEvent::PointerItem pointer;
105 CHK(pointerEvent_->GetPointerItem(seatSlot, pointer), PARAM_INPUT_FAIL);
106 pointer.SetPressed(false);
107 pointer.SetGlobalX(static_cast<int32_t>(logicalX));
108 pointer.SetGlobalY(static_cast<int32_t>(logicalY));
109 pointerEvent_->UpdatePointerItem(seatSlot, pointer);
110 pointerEvent_->SetPointerId(seatSlot);
111 MMI_LOGD("End");
112 }
113
OnLibinputTouchPadEvent(struct libinput_event * event)114 std::shared_ptr<PointerEvent> TouchPadTransformPointProcessor::OnLibinputTouchPadEvent(
115 struct libinput_event *event)
116 {
117 MMI_LOGD("begin");
118 CHKPP(event);
119 auto type = libinput_event_get_type(event);
120 pointerEvent_->UpdateId();
121 switch (type) {
122 case LIBINPUT_EVENT_TOUCHPAD_DOWN: {
123 OnEventTouchPadDown(event);
124 break;
125 }
126 case LIBINPUT_EVENT_TOUCHPAD_UP: {
127 OnEventTouchPadUp(event);
128 break;
129 }
130 case LIBINPUT_EVENT_TOUCHPAD_MOTION: {
131 OnEventTouchPadMotion(event);
132 break;
133 }
134 default: {
135 return nullptr;
136 }
137 }
138 MMI_LOGD("end");
139 return pointerEvent_;
140 }
141 } // namespace MMI
142 } // namespace OHOS
143