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