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 "gesture_transform_processor.h"
17
18 #include "mmi_log.h"
19 #include "mouse_device_state.h"
20
21 #undef MMI_LOG_DOMAIN
22 #define MMI_LOG_DOMAIN MMI_LOG_DISPATCH
23 #undef MMI_LOG_TAG
24 #define MMI_LOG_TAG "GestureTransformProcessor"
25
26 namespace OHOS {
27 namespace MMI {
GestureTransformProcessor(int32_t deviceId)28 GestureTransformProcessor::GestureTransformProcessor(int32_t deviceId)
29 : deviceId_(deviceId) {}
30
OnEventTouchPadPinchBegin(libinput_event_gesture * gesture)31 void GestureTransformProcessor::OnEventTouchPadPinchBegin(libinput_event_gesture *gesture)
32 {
33 CALL_DEBUG_ENTER;
34 CHKPV(gesture);
35 int64_t time = static_cast<int64_t>(libinput_event_gesture_get_time(gesture));
36 double scale = libinput_event_gesture_get_scale(gesture);
37 pointerEvent_->SetActionTime(GetSysClockTime());
38 pointerEvent_->SetActionStartTime(time);
39
40 PointerEvent::PointerItem pointerItem;
41 pointerItem.SetDownTime(time);
42 pointerItem.SetDisplayX(MouseState->GetMouseCoordsX());
43 pointerItem.SetDisplayY(MouseState->GetMouseCoordsY());
44 pointerItem.SetDisplayXPos(MouseState->GetMouseCoordsX());
45 pointerItem.SetDisplayYPos(MouseState->GetMouseCoordsY());
46 pointerItem.SetDeviceId(deviceId_);
47 pointerItem.SetPointerId(defaultPointerId);
48 pointerItem.SetWidth(0);
49 pointerItem.SetHeight(0);
50 pointerItem.SetPressed(MouseState->IsLeftBtnPressed());
51 pointerEvent_->AddPointerItem(pointerItem);
52
53 pointerEvent_->ClearButtonPressed();
54 std::vector<int32_t> pressedButtons;
55 MouseState->GetPressedButtons(pressedButtons);
56 for (const auto &item : pressedButtons) {
57 pointerEvent_->SetButtonPressed(item);
58 }
59
60 pointerEvent_->SetDeviceId(deviceId_);
61 pointerEvent_->SetTargetDisplayId(0);
62 pointerEvent_->SetPointerId(defaultPointerId);
63 pointerEvent_->SetAxisValue(PointerEvent::AXIS_TYPE_PINCH, scale);
64 }
65
OnEventTouchPadPinchUpdate(libinput_event_gesture * gesture)66 void GestureTransformProcessor::OnEventTouchPadPinchUpdate(libinput_event_gesture *gesture)
67 {
68 CALL_DEBUG_ENTER;
69 CHKPV(gesture);
70 int64_t time = static_cast<int64_t>(libinput_event_gesture_get_time(gesture));
71 double scale = libinput_event_gesture_get_scale(gesture);
72 pointerEvent_->SetActionTime(GetSysClockTime());
73 pointerEvent_->SetActionStartTime(time);
74
75 PointerEvent::PointerItem pointerItem;
76 pointerEvent_->GetPointerItem(defaultPointerId, pointerItem);
77 pointerItem.SetDisplayX(MouseState->GetMouseCoordsX());
78 pointerItem.SetDisplayY(MouseState->GetMouseCoordsY());
79 pointerItem.SetDisplayXPos(MouseState->GetMouseCoordsX());
80 pointerItem.SetDisplayYPos(MouseState->GetMouseCoordsY());
81 pointerItem.SetPressed(MouseState->IsLeftBtnPressed());
82 pointerEvent_->UpdatePointerItem(defaultPointerId, pointerItem);
83
84 pointerEvent_->ClearButtonPressed();
85 std::vector<int32_t> pressedButtons;
86 MouseState->GetPressedButtons(pressedButtons);
87 for (const auto &item : pressedButtons) {
88 pointerEvent_->SetButtonPressed(item);
89 }
90 pointerEvent_->SetAxisValue(PointerEvent::AXIS_TYPE_PINCH, scale);
91 }
92
OnEventTouchPadPinchEnd(libinput_event_gesture * gesture)93 void GestureTransformProcessor::OnEventTouchPadPinchEnd(libinput_event_gesture *gesture)
94 {
95 CALL_DEBUG_ENTER;
96 CHKPV(gesture);
97 int64_t time = static_cast<int64_t>(libinput_event_gesture_get_time(gesture));
98 double scale = libinput_event_gesture_get_scale(gesture);
99 pointerEvent_->SetActionTime(GetSysClockTime());
100 pointerEvent_->SetActionStartTime(time);
101
102 PointerEvent::PointerItem pointerItem;
103 pointerEvent_->GetPointerItem(defaultPointerId, pointerItem);
104 pointerItem.SetDisplayX(MouseState->GetMouseCoordsX());
105 pointerItem.SetDisplayY(MouseState->GetMouseCoordsY());
106 pointerItem.SetDisplayXPos(MouseState->GetMouseCoordsX());
107 pointerItem.SetDisplayYPos(MouseState->GetMouseCoordsY());
108 pointerItem.SetPressed(MouseState->IsLeftBtnPressed());
109 pointerEvent_->UpdatePointerItem(defaultPointerId, pointerItem);
110
111 pointerEvent_->ClearButtonPressed();
112 std::vector<int32_t> pressedButtons;
113 MouseState->GetPressedButtons(pressedButtons);
114 for (const auto &item : pressedButtons) {
115 pointerEvent_->SetButtonPressed(item);
116 }
117 pointerEvent_->SetAxisValue(PointerEvent::AXIS_TYPE_PINCH, scale);
118 }
119
OnEvent(struct libinput_event * event)120 std::shared_ptr<PointerEvent> GestureTransformProcessor::OnEvent(struct libinput_event *event)
121 {
122 CALL_DEBUG_ENTER;
123 CHKPP(event);
124 auto gesture = libinput_event_get_gesture_event(event);
125 CHKPP(gesture);
126 if (pointerEvent_ == nullptr) {
127 pointerEvent_ = PointerEvent::Create();
128 CHKPP(pointerEvent_);
129 }
130 auto type = libinput_event_get_type(event);
131 switch (type) {
132 case LIBINPUT_EVENT_GESTURE_PINCH_BEGIN: {
133 pointerEvent_->SetPointerAction(PointerEvent::POINTER_ACTION_AXIS_BEGIN);
134 OnEventTouchPadPinchBegin(gesture);
135 break;
136 }
137 case LIBINPUT_EVENT_GESTURE_PINCH_UPDATE: {
138 pointerEvent_->SetPointerAction(PointerEvent::POINTER_ACTION_AXIS_UPDATE);
139 OnEventTouchPadPinchUpdate(gesture);
140 break;
141 }
142 case LIBINPUT_EVENT_GESTURE_PINCH_END: {
143 pointerEvent_->SetPointerAction(PointerEvent::POINTER_ACTION_AXIS_END);
144 OnEventTouchPadPinchEnd(gesture);
145 break;
146 }
147 case LIBINPUT_EVENT_GESTURE_SWIPE_BEGIN:
148 case LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE:
149 case LIBINPUT_EVENT_GESTURE_SWIPE_END: {
150 MMI_HILOGW("Three refers to the need to use, preserve the code");
151 return nullptr;
152 }
153 default: {
154 MMI_HILOGE("Unknown event_type of pointer class has been reported!\n");
155 return nullptr;
156 }
157 }
158 pointerEvent_->SetSourceType(PointerEvent::SOURCE_TYPE_MOUSE);
159 pointerEvent_->UpdateId();
160 StartLogTraceId(pointerEvent_->GetId(), pointerEvent_->GetEventType(), pointerEvent_->GetPointerAction());
161 return pointerEvent_;
162 }
163 } // namespace MMI
164 } // namespace OHOS