1c29fa5a6Sopenharmony_ci/*
2c29fa5a6Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License.
5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at
6c29fa5a6Sopenharmony_ci *
7c29fa5a6Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8c29fa5a6Sopenharmony_ci *
9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and
13c29fa5a6Sopenharmony_ci * limitations under the License.
14c29fa5a6Sopenharmony_ci */
15c29fa5a6Sopenharmony_ci
16c29fa5a6Sopenharmony_ci#include "input_event_handler.h"
17c29fa5a6Sopenharmony_ci
18c29fa5a6Sopenharmony_ci#include <cinttypes>
19c29fa5a6Sopenharmony_ci#include <cstdio>
20c29fa5a6Sopenharmony_ci#include <cstring>
21c29fa5a6Sopenharmony_ci#include <functional>
22c29fa5a6Sopenharmony_ci#include <vector>
23c29fa5a6Sopenharmony_ci
24c29fa5a6Sopenharmony_ci#include <sys/stat.h>
25c29fa5a6Sopenharmony_ci#include <unistd.h>
26c29fa5a6Sopenharmony_ci
27c29fa5a6Sopenharmony_ci#include "libinput.h"
28c29fa5a6Sopenharmony_ci#include "key_command_handler.h"
29c29fa5a6Sopenharmony_ci#include "timer_manager.h"
30c29fa5a6Sopenharmony_ci#include "util.h"
31c29fa5a6Sopenharmony_ci
32c29fa5a6Sopenharmony_ci#undef MMI_LOG_DOMAIN
33c29fa5a6Sopenharmony_ci#define MMI_LOG_DOMAIN MMI_LOG_HANDLER
34c29fa5a6Sopenharmony_ci#undef MMI_LOG_TAG
35c29fa5a6Sopenharmony_ci#define MMI_LOG_TAG "InputEventHandler"
36c29fa5a6Sopenharmony_ci
37c29fa5a6Sopenharmony_cinamespace OHOS {
38c29fa5a6Sopenharmony_cinamespace MMI {
39c29fa5a6Sopenharmony_cinamespace {
40c29fa5a6Sopenharmony_ciconstexpr int32_t MT_TOOL_PALM { 2 };
41c29fa5a6Sopenharmony_ciconstexpr uint32_t KEY_ESC { 1 };
42c29fa5a6Sopenharmony_ciconstexpr uint32_t KEY_KPASTERISK { 55 };
43c29fa5a6Sopenharmony_ciconstexpr uint32_t KEY_F1 { 59 };
44c29fa5a6Sopenharmony_ciconstexpr uint32_t KEY_LEFTCTRL { 29 };
45c29fa5a6Sopenharmony_ciconstexpr uint32_t KEY_RIGHTCTRL { 97 };
46c29fa5a6Sopenharmony_ciconstexpr uint32_t KEY_LEFTALT { 56 };
47c29fa5a6Sopenharmony_ciconstexpr uint32_t KEY_RIGHTALT { 100 };
48c29fa5a6Sopenharmony_ciconstexpr uint32_t KEY_LEFTSHIFT { 42 };
49c29fa5a6Sopenharmony_ciconstexpr uint32_t KEY_RIGHTSHIFT { 54 };
50c29fa5a6Sopenharmony_ciconstexpr uint32_t KEY_FN { 0x1d0 };
51c29fa5a6Sopenharmony_ciconstexpr uint32_t KEY_CAPSLOCK { 58 };
52c29fa5a6Sopenharmony_ciconstexpr uint32_t KEY_TAB { 15 };
53c29fa5a6Sopenharmony_ciconstexpr uint32_t KEY_COMPOSE { 127 };
54c29fa5a6Sopenharmony_ciconstexpr uint32_t KEY_RIGHTMETA { 126 };
55c29fa5a6Sopenharmony_ciconstexpr uint32_t KEY_LEFTMETA { 125 };
56c29fa5a6Sopenharmony_ci} // namespace
57c29fa5a6Sopenharmony_ci
58c29fa5a6Sopenharmony_ciInputEventHandler::InputEventHandler()
59c29fa5a6Sopenharmony_ci{
60c29fa5a6Sopenharmony_ci    lastEventBeginTime_ = GetSysClockTime();
61c29fa5a6Sopenharmony_ci    udsServer_ = nullptr;
62c29fa5a6Sopenharmony_ci}
63c29fa5a6Sopenharmony_ci
64c29fa5a6Sopenharmony_ciInputEventHandler::~InputEventHandler() {}
65c29fa5a6Sopenharmony_ci
66c29fa5a6Sopenharmony_civoid InputEventHandler::Init(UDSServer& udsServer)
67c29fa5a6Sopenharmony_ci{
68c29fa5a6Sopenharmony_ci    udsServer_ = &udsServer;
69c29fa5a6Sopenharmony_ci    BuildInputHandlerChain();
70c29fa5a6Sopenharmony_ci}
71c29fa5a6Sopenharmony_ci
72c29fa5a6Sopenharmony_civoid InputEventHandler::OnEvent(void *event, int64_t frameTime)
73c29fa5a6Sopenharmony_ci{
74c29fa5a6Sopenharmony_ci    CHKPV(eventNormalizeHandler_);
75c29fa5a6Sopenharmony_ci    if (event == nullptr) {
76c29fa5a6Sopenharmony_ci        eventNormalizeHandler_->HandleEvent(nullptr, frameTime);
77c29fa5a6Sopenharmony_ci        return;
78c29fa5a6Sopenharmony_ci    }
79c29fa5a6Sopenharmony_ci
80c29fa5a6Sopenharmony_ci    idSeed_ += 1;
81c29fa5a6Sopenharmony_ci    const uint64_t maxUInt64 = (std::numeric_limits<uint64_t>::max)() - 1;
82c29fa5a6Sopenharmony_ci    if (idSeed_ >= maxUInt64) {
83c29fa5a6Sopenharmony_ci        MMI_HILOGE("The value is flipped. id:%{public}" PRId64, idSeed_);
84c29fa5a6Sopenharmony_ci        idSeed_ = 1;
85c29fa5a6Sopenharmony_ci    }
86c29fa5a6Sopenharmony_ci
87c29fa5a6Sopenharmony_ci    auto *lpEvent = static_cast<libinput_event *>(event);
88c29fa5a6Sopenharmony_ci    CHKPV(lpEvent);
89c29fa5a6Sopenharmony_ci    int32_t eventType = libinput_event_get_type(lpEvent);
90c29fa5a6Sopenharmony_ci    int64_t beginTime = GetSysClockTime();
91c29fa5a6Sopenharmony_ci    lastEventBeginTime_ = beginTime;
92c29fa5a6Sopenharmony_ci    MMI_HILOGD("Event reporting. id:%{public}" PRId64 ",tid:%{public}" PRId64 ",eventType:%{public}d,"
93c29fa5a6Sopenharmony_ci               "beginTime:%{public}" PRId64, idSeed_, GetThisThreadId(), eventType, beginTime);
94c29fa5a6Sopenharmony_ci
95c29fa5a6Sopenharmony_ci    UpdateDwtRecord(lpEvent);
96c29fa5a6Sopenharmony_ci    if (IsTouchpadMistouch(lpEvent)) {
97c29fa5a6Sopenharmony_ci        return;
98c29fa5a6Sopenharmony_ci    }
99c29fa5a6Sopenharmony_ci
100c29fa5a6Sopenharmony_ci    ResetLogTrace();
101c29fa5a6Sopenharmony_ci    eventNormalizeHandler_->HandleEvent(lpEvent, frameTime);
102c29fa5a6Sopenharmony_ci    int64_t endTime = GetSysClockTime();
103c29fa5a6Sopenharmony_ci    int64_t lostTime = endTime - beginTime;
104c29fa5a6Sopenharmony_ci    MMI_HILOGD("Event handling completed. id:%{public}" PRId64 ",endTime:%{public}" PRId64
105c29fa5a6Sopenharmony_ci               ",lostTime:%{public}" PRId64, idSeed_, endTime, lostTime);
106c29fa5a6Sopenharmony_ci}
107c29fa5a6Sopenharmony_ci
108c29fa5a6Sopenharmony_civoid InputEventHandler::UpdateDwtRecord(libinput_event *event)
109c29fa5a6Sopenharmony_ci{
110c29fa5a6Sopenharmony_ci    CHKPV(event);
111c29fa5a6Sopenharmony_ci    auto type = libinput_event_get_type(event);
112c29fa5a6Sopenharmony_ci    if (type == LIBINPUT_EVENT_TOUCHPAD_DOWN || type == LIBINPUT_EVENT_TOUCHPAD_MOTION) {
113c29fa5a6Sopenharmony_ci        UpdateDwtTouchpadRecord(event);
114c29fa5a6Sopenharmony_ci    }
115c29fa5a6Sopenharmony_ci    if (type == LIBINPUT_EVENT_KEYBOARD_KEY) {
116c29fa5a6Sopenharmony_ci        UpdateDwtKeyboardRecord(event);
117c29fa5a6Sopenharmony_ci    }
118c29fa5a6Sopenharmony_ci}
119c29fa5a6Sopenharmony_ci
120c29fa5a6Sopenharmony_civoid InputEventHandler::UpdateDwtTouchpadRecord(libinput_event *event)
121c29fa5a6Sopenharmony_ci{
122c29fa5a6Sopenharmony_ci    auto touchpadEvent = libinput_event_get_touchpad_event(event);
123c29fa5a6Sopenharmony_ci    CHKPV(touchpadEvent);
124c29fa5a6Sopenharmony_ci    auto type = libinput_event_get_type(event);
125c29fa5a6Sopenharmony_ci    if (type == LIBINPUT_EVENT_TOUCHPAD_DOWN) {
126c29fa5a6Sopenharmony_ci        auto touchpadDevice = libinput_event_get_device(event); // guaranteed valid during event lifetime
127c29fa5a6Sopenharmony_ci        CHKPV(touchpadDevice);
128c29fa5a6Sopenharmony_ci        double touchpadSizeX;
129c29fa5a6Sopenharmony_ci        double touchpadSizeY;
130c29fa5a6Sopenharmony_ci        if (libinput_device_get_size(touchpadDevice, &touchpadSizeX, &touchpadSizeY) != 0) {
131c29fa5a6Sopenharmony_ci            MMI_HILOGW("failed to get touchpad device size");
132c29fa5a6Sopenharmony_ci            return;
133c29fa5a6Sopenharmony_ci        }
134c29fa5a6Sopenharmony_ci        touchpadEventDownAbsX_ = libinput_event_touchpad_get_x(touchpadEvent);
135c29fa5a6Sopenharmony_ci        touchpadEventDownAbsY_ = libinput_event_touchpad_get_y(touchpadEvent);
136c29fa5a6Sopenharmony_ci        touchpadEventAbsX_ = touchpadEventDownAbsX_;
137c29fa5a6Sopenharmony_ci        touchpadEventAbsY_ = touchpadEventDownAbsY_;
138c29fa5a6Sopenharmony_ci        if (touchpadEventDownAbsX_ > TOUCHPAD_EDGE_WIDTH &&
139c29fa5a6Sopenharmony_ci            touchpadEventDownAbsX_ < touchpadSizeX - TOUCHPAD_EDGE_WIDTH) {
140c29fa5a6Sopenharmony_ci            isDwtEdgeAreaForTouchpadMotionActing_ = false;
141c29fa5a6Sopenharmony_ci            MMI_HILOGD("Pointer edge dwt unlocked, coordX = %{public}f", touchpadEventDownAbsX_);
142c29fa5a6Sopenharmony_ci        }
143c29fa5a6Sopenharmony_ci        if (touchpadEventDownAbsX_ > TOUCHPAD_EDGE_WIDTH_FOR_BUTTON &&
144c29fa5a6Sopenharmony_ci            touchpadEventDownAbsX_ < touchpadSizeX - TOUCHPAD_EDGE_WIDTH_FOR_BUTTON) {
145c29fa5a6Sopenharmony_ci            isDwtEdgeAreaForTouchpadButtonActing_ = false;
146c29fa5a6Sopenharmony_ci            MMI_HILOGD("Button edge dwt unlocked, coordX = %{public}f", touchpadEventDownAbsX_);
147c29fa5a6Sopenharmony_ci        }
148c29fa5a6Sopenharmony_ci        if (touchpadEventDownAbsX_ > TOUCHPAD_EDGE_WIDTH_FOR_TAP &&
149c29fa5a6Sopenharmony_ci            touchpadEventDownAbsX_ < touchpadSizeX - TOUCHPAD_EDGE_WIDTH_FOR_TAP) {
150c29fa5a6Sopenharmony_ci            isDwtEdgeAreaForTouchpadTapActing_ = false;
151c29fa5a6Sopenharmony_ci            MMI_HILOGD("Tap edge dwt unlocked, coordX = %{public}f", touchpadEventDownAbsX_);
152c29fa5a6Sopenharmony_ci        }
153c29fa5a6Sopenharmony_ci    }
154c29fa5a6Sopenharmony_ci    if (type == LIBINPUT_EVENT_TOUCHPAD_MOTION) {
155c29fa5a6Sopenharmony_ci        touchpadEventAbsX_ = libinput_event_touchpad_get_x(touchpadEvent);
156c29fa5a6Sopenharmony_ci        touchpadEventAbsY_ = libinput_event_touchpad_get_y(touchpadEvent);
157c29fa5a6Sopenharmony_ci    }
158c29fa5a6Sopenharmony_ci}
159c29fa5a6Sopenharmony_ci
160c29fa5a6Sopenharmony_civoid InputEventHandler::UpdateDwtKeyboardRecord(libinput_event *event)
161c29fa5a6Sopenharmony_ci{
162c29fa5a6Sopenharmony_ci    auto keyboardEvent = libinput_event_get_keyboard_event(event);
163c29fa5a6Sopenharmony_ci    CHKPV(keyboardEvent);
164c29fa5a6Sopenharmony_ci    uint32_t key = libinput_event_keyboard_get_key(keyboardEvent);
165c29fa5a6Sopenharmony_ci    if (IsStandaloneFunctionKey(key)) {
166c29fa5a6Sopenharmony_ci        return;
167c29fa5a6Sopenharmony_ci    }
168c29fa5a6Sopenharmony_ci
169c29fa5a6Sopenharmony_ci    auto keyState = libinput_event_keyboard_get_key_state(keyboardEvent);
170c29fa5a6Sopenharmony_ci    if (IsModifierKey(key)) {
171c29fa5a6Sopenharmony_ci        modifierPressedCount_ += (keyState == LIBINPUT_KEY_STATE_PRESSED) ? 1 : -1;
172c29fa5a6Sopenharmony_ci    }
173c29fa5a6Sopenharmony_ci    if (keyState == LIBINPUT_KEY_STATE_PRESSED && modifierPressedCount_ > 0) {
174c29fa5a6Sopenharmony_ci        isKeyPressedWithAnyModifiers_[key] = true; // set flag when key is pressed with modifiers
175c29fa5a6Sopenharmony_ci    }
176c29fa5a6Sopenharmony_ci    if (!IsModifierKey(key) && !isKeyPressedWithAnyModifiers_[key]) {
177c29fa5a6Sopenharmony_ci        RefreshDwtActingState();
178c29fa5a6Sopenharmony_ci    }
179c29fa5a6Sopenharmony_ci    if (keyState == LIBINPUT_KEY_STATE_RELEASED) {
180c29fa5a6Sopenharmony_ci        isKeyPressedWithAnyModifiers_[key] = false; // always reset flag when key is released
181c29fa5a6Sopenharmony_ci    }
182c29fa5a6Sopenharmony_ci}
183c29fa5a6Sopenharmony_ci
184c29fa5a6Sopenharmony_cibool InputEventHandler::IsStandaloneFunctionKey(uint32_t keycode)
185c29fa5a6Sopenharmony_ci{
186c29fa5a6Sopenharmony_ci    if (IsModifierKey(keycode)) {
187c29fa5a6Sopenharmony_ci        return false;
188c29fa5a6Sopenharmony_ci    }
189c29fa5a6Sopenharmony_ci    switch (keycode) {
190c29fa5a6Sopenharmony_ci        case KEY_ESC:
191c29fa5a6Sopenharmony_ci        case KEY_KPASTERISK:
192c29fa5a6Sopenharmony_ci            return true;
193c29fa5a6Sopenharmony_ci        default:
194c29fa5a6Sopenharmony_ci            return keycode >= KEY_F1;
195c29fa5a6Sopenharmony_ci    }
196c29fa5a6Sopenharmony_ci}
197c29fa5a6Sopenharmony_ci
198c29fa5a6Sopenharmony_cibool InputEventHandler::IsModifierKey(uint32_t keycode)
199c29fa5a6Sopenharmony_ci{
200c29fa5a6Sopenharmony_ci    switch (keycode) {
201c29fa5a6Sopenharmony_ci        case KEY_LEFTCTRL:
202c29fa5a6Sopenharmony_ci        case KEY_RIGHTCTRL:
203c29fa5a6Sopenharmony_ci        case KEY_LEFTALT:
204c29fa5a6Sopenharmony_ci        case KEY_RIGHTALT:
205c29fa5a6Sopenharmony_ci        case KEY_LEFTSHIFT:
206c29fa5a6Sopenharmony_ci        case KEY_RIGHTSHIFT:
207c29fa5a6Sopenharmony_ci        case KEY_FN:
208c29fa5a6Sopenharmony_ci        case KEY_CAPSLOCK:
209c29fa5a6Sopenharmony_ci        case KEY_TAB:
210c29fa5a6Sopenharmony_ci        case KEY_COMPOSE:
211c29fa5a6Sopenharmony_ci        case KEY_RIGHTMETA:
212c29fa5a6Sopenharmony_ci        case KEY_LEFTMETA:
213c29fa5a6Sopenharmony_ci            return true;
214c29fa5a6Sopenharmony_ci        default:
215c29fa5a6Sopenharmony_ci            return false;
216c29fa5a6Sopenharmony_ci    }
217c29fa5a6Sopenharmony_ci}
218c29fa5a6Sopenharmony_ci
219c29fa5a6Sopenharmony_civoid InputEventHandler::RefreshDwtActingState()
220c29fa5a6Sopenharmony_ci{
221c29fa5a6Sopenharmony_ci    isDwtEdgeAreaForTouchpadMotionActing_ = true;
222c29fa5a6Sopenharmony_ci    isDwtEdgeAreaForTouchpadButtonActing_ = true;
223c29fa5a6Sopenharmony_ci    isDwtEdgeAreaForTouchpadTapActing_ = true;
224c29fa5a6Sopenharmony_ci}
225c29fa5a6Sopenharmony_ci
226c29fa5a6Sopenharmony_cibool InputEventHandler::IsTouchpadMistouch(libinput_event *event)
227c29fa5a6Sopenharmony_ci{
228c29fa5a6Sopenharmony_ci    CHKPF(event);
229c29fa5a6Sopenharmony_ci    auto type = libinput_event_get_type(event);
230c29fa5a6Sopenharmony_ci    if (type >= LIBINPUT_EVENT_TOUCHPAD_DOWN && type <= LIBINPUT_EVENT_TOUCHPAD_MOTION) {
231c29fa5a6Sopenharmony_ci        auto touchpadEvent = libinput_event_get_touchpad_event(event);
232c29fa5a6Sopenharmony_ci        CHKPF(touchpadEvent);
233c29fa5a6Sopenharmony_ci        int32_t toolType = libinput_event_touchpad_get_tool_type(touchpadEvent);
234c29fa5a6Sopenharmony_ci        if (toolType == MT_TOOL_PALM) {
235c29fa5a6Sopenharmony_ci            MMI_HILOGD("Touchpad event is palm");
236c29fa5a6Sopenharmony_ci            return false;
237c29fa5a6Sopenharmony_ci        }
238c29fa5a6Sopenharmony_ci    }
239c29fa5a6Sopenharmony_ci
240c29fa5a6Sopenharmony_ci    if (type == LIBINPUT_EVENT_POINTER_BUTTON_TOUCHPAD) {
241c29fa5a6Sopenharmony_ci        return IsTouchpadButtonMistouch(event);
242c29fa5a6Sopenharmony_ci    }
243c29fa5a6Sopenharmony_ci    if (type == LIBINPUT_EVENT_POINTER_TAP) {
244c29fa5a6Sopenharmony_ci        return IsTouchpadTapMistouch(event);
245c29fa5a6Sopenharmony_ci    }
246c29fa5a6Sopenharmony_ci    if (type == LIBINPUT_EVENT_TOUCHPAD_MOTION) {
247c29fa5a6Sopenharmony_ci        return IsTouchpadMotionMistouch(event);
248c29fa5a6Sopenharmony_ci    }
249c29fa5a6Sopenharmony_ci    if (type == LIBINPUT_EVENT_POINTER_MOTION_TOUCHPAD) {
250c29fa5a6Sopenharmony_ci        return IsTouchpadPointerMotionMistouch(event);
251c29fa5a6Sopenharmony_ci    }
252c29fa5a6Sopenharmony_ci
253c29fa5a6Sopenharmony_ci    return false;
254c29fa5a6Sopenharmony_ci}
255c29fa5a6Sopenharmony_ci
256c29fa5a6Sopenharmony_cibool InputEventHandler::IsTouchpadButtonMistouch(libinput_event* event)
257c29fa5a6Sopenharmony_ci{
258c29fa5a6Sopenharmony_ci    CHKPF(event);
259c29fa5a6Sopenharmony_ci    auto touchpadButtonEvent = libinput_event_get_pointer_event(event);
260c29fa5a6Sopenharmony_ci    CHKPF(touchpadButtonEvent);
261c29fa5a6Sopenharmony_ci    auto buttonState = libinput_event_pointer_get_button_state(touchpadButtonEvent);
262c29fa5a6Sopenharmony_ci    if (buttonState == LIBINPUT_BUTTON_STATE_PRESSED) {
263c29fa5a6Sopenharmony_ci        auto touchpadDevice = libinput_event_get_device(event); // guaranteed valid during event lifetime
264c29fa5a6Sopenharmony_ci        CHKPF(touchpadDevice);
265c29fa5a6Sopenharmony_ci        double touchpadSizeX;
266c29fa5a6Sopenharmony_ci        double touchpadSizeY;
267c29fa5a6Sopenharmony_ci        if (libinput_device_get_size(touchpadDevice, &touchpadSizeX, &touchpadSizeY) != 0) {
268c29fa5a6Sopenharmony_ci            return false;
269c29fa5a6Sopenharmony_ci        }
270c29fa5a6Sopenharmony_ci        double coordX = touchpadEventAbsX_;
271c29fa5a6Sopenharmony_ci        if (isDwtEdgeAreaForTouchpadButtonActing_ &&
272c29fa5a6Sopenharmony_ci            (coordX <= TOUCHPAD_EDGE_WIDTH_FOR_BUTTON || coordX >= touchpadSizeX - TOUCHPAD_EDGE_WIDTH_FOR_BUTTON)) {
273c29fa5a6Sopenharmony_ci            isButtonMistouch_ = true;
274c29fa5a6Sopenharmony_ci            MMI_HILOGD("The buttonPressed event is mistouch");
275c29fa5a6Sopenharmony_ci            return true;
276c29fa5a6Sopenharmony_ci        }
277c29fa5a6Sopenharmony_ci    }
278c29fa5a6Sopenharmony_ci    if (buttonState == LIBINPUT_BUTTON_STATE_RELEASED) {
279c29fa5a6Sopenharmony_ci        if (isButtonMistouch_) {
280c29fa5a6Sopenharmony_ci            isButtonMistouch_ = false;
281c29fa5a6Sopenharmony_ci            MMI_HILOGD("The buttonReleased event is mistouch");
282c29fa5a6Sopenharmony_ci            return true;
283c29fa5a6Sopenharmony_ci        }
284c29fa5a6Sopenharmony_ci    }
285c29fa5a6Sopenharmony_ci    return false;
286c29fa5a6Sopenharmony_ci}
287c29fa5a6Sopenharmony_ci
288c29fa5a6Sopenharmony_cibool InputEventHandler::IsTouchpadTapMistouch(libinput_event* event)
289c29fa5a6Sopenharmony_ci{
290c29fa5a6Sopenharmony_ci    CHKPF(event);
291c29fa5a6Sopenharmony_ci    auto data = libinput_event_get_pointer_event(event);
292c29fa5a6Sopenharmony_ci    CHKPF(data);
293c29fa5a6Sopenharmony_ci    auto state = libinput_event_pointer_get_button_state(data);
294c29fa5a6Sopenharmony_ci    if (state == LIBINPUT_BUTTON_STATE_PRESSED) {
295c29fa5a6Sopenharmony_ci        auto touchpadDevice = libinput_event_get_device(event); // guaranteed valid during event lifetime
296c29fa5a6Sopenharmony_ci        CHKPF(touchpadDevice);
297c29fa5a6Sopenharmony_ci        double touchpadSizeX;
298c29fa5a6Sopenharmony_ci        double touchpadSizeY;
299c29fa5a6Sopenharmony_ci        if (libinput_device_get_size(touchpadDevice, &touchpadSizeX, &touchpadSizeY) != 0) {
300c29fa5a6Sopenharmony_ci            return false;
301c29fa5a6Sopenharmony_ci        }
302c29fa5a6Sopenharmony_ci        double coordX = touchpadEventDownAbsX_;
303c29fa5a6Sopenharmony_ci        if (isDwtEdgeAreaForTouchpadTapActing_ &&
304c29fa5a6Sopenharmony_ci            (coordX <= TOUCHPAD_EDGE_WIDTH_FOR_TAP || coordX >= touchpadSizeX - TOUCHPAD_EDGE_WIDTH_FOR_TAP)) {
305c29fa5a6Sopenharmony_ci            isTapMistouch_ = true;
306c29fa5a6Sopenharmony_ci            MMI_HILOGD("Touchpad tap presse event is mistouch");
307c29fa5a6Sopenharmony_ci            return true;
308c29fa5a6Sopenharmony_ci        }
309c29fa5a6Sopenharmony_ci    }
310c29fa5a6Sopenharmony_ci    if (state == LIBINPUT_BUTTON_STATE_RELEASED) {
311c29fa5a6Sopenharmony_ci        if (isTapMistouch_) {
312c29fa5a6Sopenharmony_ci            isTapMistouch_ = false;
313c29fa5a6Sopenharmony_ci            MMI_HILOGD("Touchpad tap release event is mistouch");
314c29fa5a6Sopenharmony_ci            return true;
315c29fa5a6Sopenharmony_ci        }
316c29fa5a6Sopenharmony_ci    }
317c29fa5a6Sopenharmony_ci    return false;
318c29fa5a6Sopenharmony_ci}
319c29fa5a6Sopenharmony_ci
320c29fa5a6Sopenharmony_cibool InputEventHandler::IsTouchpadMotionMistouch(libinput_event *event)
321c29fa5a6Sopenharmony_ci{
322c29fa5a6Sopenharmony_ci    if (!isDwtEdgeAreaForTouchpadMotionActing_) {
323c29fa5a6Sopenharmony_ci        return false;
324c29fa5a6Sopenharmony_ci    }
325c29fa5a6Sopenharmony_ci
326c29fa5a6Sopenharmony_ci    CHKPF(event);
327c29fa5a6Sopenharmony_ci    auto touchpadEvent = libinput_event_get_touchpad_event(event);
328c29fa5a6Sopenharmony_ci    CHKPF(touchpadEvent);
329c29fa5a6Sopenharmony_ci    auto touchpadDevice = libinput_event_get_device(event); // guaranteed valid during event lifetime
330c29fa5a6Sopenharmony_ci    CHKPF(touchpadDevice);
331c29fa5a6Sopenharmony_ci    double touchpadSizeX;
332c29fa5a6Sopenharmony_ci    double touchpadSizeY;
333c29fa5a6Sopenharmony_ci    if (libinput_device_get_size(touchpadDevice, &touchpadSizeX, &touchpadSizeY) != 0) {
334c29fa5a6Sopenharmony_ci        return false;
335c29fa5a6Sopenharmony_ci    }
336c29fa5a6Sopenharmony_ci    auto coordX = touchpadEventDownAbsX_;
337c29fa5a6Sopenharmony_ci    if (coordX <= TOUCHPAD_EDGE_WIDTH || coordX >= touchpadSizeX - TOUCHPAD_EDGE_WIDTH) {
338c29fa5a6Sopenharmony_ci        MMI_HILOGD("Touchpad event is edge mistouch");
339c29fa5a6Sopenharmony_ci        return true;
340c29fa5a6Sopenharmony_ci    }
341c29fa5a6Sopenharmony_ci    return false;
342c29fa5a6Sopenharmony_ci}
343c29fa5a6Sopenharmony_ci
344c29fa5a6Sopenharmony_cibool InputEventHandler::IsTouchpadPointerMotionMistouch(libinput_event *event)
345c29fa5a6Sopenharmony_ci{
346c29fa5a6Sopenharmony_ci    if (!isDwtEdgeAreaForTouchpadMotionActing_) {
347c29fa5a6Sopenharmony_ci        return false;
348c29fa5a6Sopenharmony_ci    }
349c29fa5a6Sopenharmony_ci
350c29fa5a6Sopenharmony_ci    CHKPF(event);
351c29fa5a6Sopenharmony_ci    auto pointerEvent = libinput_event_get_pointer_event(event);
352c29fa5a6Sopenharmony_ci    CHKPF(pointerEvent);
353c29fa5a6Sopenharmony_ci    auto touchpadDevice = libinput_event_get_device(event); // guaranteed valid during event lifetime
354c29fa5a6Sopenharmony_ci    CHKPF(touchpadDevice);
355c29fa5a6Sopenharmony_ci    double touchpadSizeX;
356c29fa5a6Sopenharmony_ci    double touchpadSizeY;
357c29fa5a6Sopenharmony_ci    if (libinput_device_get_size(touchpadDevice, &touchpadSizeX, &touchpadSizeY) != 0) {
358c29fa5a6Sopenharmony_ci        return false;
359c29fa5a6Sopenharmony_ci    }
360c29fa5a6Sopenharmony_ci    double coordX = touchpadEventDownAbsX_;
361c29fa5a6Sopenharmony_ci    if (coordX <= TOUCHPAD_EDGE_WIDTH || coordX >= touchpadSizeX - TOUCHPAD_EDGE_WIDTH) {
362c29fa5a6Sopenharmony_ci        MMI_HILOGD("Touchpad pointer motion event is edge mistouch");
363c29fa5a6Sopenharmony_ci        return true;
364c29fa5a6Sopenharmony_ci    }
365c29fa5a6Sopenharmony_ci    return false;
366c29fa5a6Sopenharmony_ci}
367c29fa5a6Sopenharmony_ci
368c29fa5a6Sopenharmony_ciint32_t InputEventHandler::BuildInputHandlerChain()
369c29fa5a6Sopenharmony_ci{
370c29fa5a6Sopenharmony_ci    eventNormalizeHandler_ = std::make_shared<EventNormalizeHandler>();
371c29fa5a6Sopenharmony_ci#if !defined(OHOS_BUILD_ENABLE_KEYBOARD) && !defined(OHOS_BUILD_ENABLE_POINTER) && !defined(OHOS_BUILD_ENABLE_TOUCH)
372c29fa5a6Sopenharmony_ci    return RET_OK;
373c29fa5a6Sopenharmony_ci#endif // !OHOS_BUILD_ENABLE_KEYBOARD && !OHOS_BUILD_ENABLE_POINTER && !OHOS_BUILD_ENABLE_TOUCH
374c29fa5a6Sopenharmony_ci
375c29fa5a6Sopenharmony_ci    std::shared_ptr<IInputEventHandler> handler = eventNormalizeHandler_;
376c29fa5a6Sopenharmony_ci#if defined(OHOS_BUILD_ENABLE_POINTER) || defined(OHOS_BUILD_ENABLE_TOUCH)
377c29fa5a6Sopenharmony_ci    eventFilterHandler_ = std::make_shared<EventFilterHandler>();
378c29fa5a6Sopenharmony_ci    handler->SetNext(eventFilterHandler_);
379c29fa5a6Sopenharmony_ci    handler = eventFilterHandler_;
380c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_POINTER || OHOS_BUILD_ENABLE_TOUCH
381c29fa5a6Sopenharmony_ci
382c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_INTERCEPTOR
383c29fa5a6Sopenharmony_ci    eventInterceptorHandler_ = std::make_shared<EventInterceptorHandler>();
384c29fa5a6Sopenharmony_ci    handler->SetNext(eventInterceptorHandler_);
385c29fa5a6Sopenharmony_ci    handler = eventInterceptorHandler_;
386c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_INTERCEPTOR
387c29fa5a6Sopenharmony_ci
388c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_KEYBOARD
389c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_COMBINATION_KEY
390c29fa5a6Sopenharmony_ci    eventKeyCommandHandler_ = std::make_shared<KeyCommandHandler>();
391c29fa5a6Sopenharmony_ci    handler->SetNext(eventKeyCommandHandler_);
392c29fa5a6Sopenharmony_ci    handler = eventKeyCommandHandler_;
393c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_COMBINATION_KEY
394c29fa5a6Sopenharmony_ci    eventSubscriberHandler_ = std::make_shared<KeySubscriberHandler>();
395c29fa5a6Sopenharmony_ci    handler->SetNext(eventSubscriberHandler_);
396c29fa5a6Sopenharmony_ci    handler = eventSubscriberHandler_;
397c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_KEYBOARD
398c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_SWITCH
399c29fa5a6Sopenharmony_ci    switchEventSubscriberHandler_ = std::make_shared<SwitchSubscriberHandler>();
400c29fa5a6Sopenharmony_ci    handler->SetNext(switchEventSubscriberHandler_);
401c29fa5a6Sopenharmony_ci    handler = switchEventSubscriberHandler_;
402c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_SWITCH
403c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_MONITOR
404c29fa5a6Sopenharmony_ci    eventMonitorHandler_ = std::make_shared<EventMonitorHandler>();
405c29fa5a6Sopenharmony_ci    handler->SetNext(eventMonitorHandler_);
406c29fa5a6Sopenharmony_ci    handler = eventMonitorHandler_;
407c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_MONITOR
408c29fa5a6Sopenharmony_ci    eventDispatchHandler_ = std::make_shared<EventDispatchHandler>();
409c29fa5a6Sopenharmony_ci    handler->SetNext(eventDispatchHandler_);
410c29fa5a6Sopenharmony_ci    return RET_OK;
411c29fa5a6Sopenharmony_ci}
412c29fa5a6Sopenharmony_ci
413c29fa5a6Sopenharmony_ciint32_t InputEventHandler::GetIntervalSinceLastInput(int64_t &timeInterval)
414c29fa5a6Sopenharmony_ci{
415c29fa5a6Sopenharmony_ci    int64_t currentSystemTime = GetSysClockTime();
416c29fa5a6Sopenharmony_ci    timeInterval = currentSystemTime - lastEventBeginTime_;
417c29fa5a6Sopenharmony_ci    return RET_OK;
418c29fa5a6Sopenharmony_ci}
419c29fa5a6Sopenharmony_ci
420c29fa5a6Sopenharmony_ciUDSServer* InputEventHandler::GetUDSServer() const
421c29fa5a6Sopenharmony_ci{
422c29fa5a6Sopenharmony_ci    return udsServer_;
423c29fa5a6Sopenharmony_ci}
424c29fa5a6Sopenharmony_ci
425c29fa5a6Sopenharmony_cistd::shared_ptr<EventNormalizeHandler> InputEventHandler::GetEventNormalizeHandler() const
426c29fa5a6Sopenharmony_ci{
427c29fa5a6Sopenharmony_ci    return eventNormalizeHandler_;
428c29fa5a6Sopenharmony_ci}
429c29fa5a6Sopenharmony_ci
430c29fa5a6Sopenharmony_cistd::shared_ptr<EventInterceptorHandler> InputEventHandler::GetInterceptorHandler() const
431c29fa5a6Sopenharmony_ci{
432c29fa5a6Sopenharmony_ci    return eventInterceptorHandler_;
433c29fa5a6Sopenharmony_ci}
434c29fa5a6Sopenharmony_ci
435c29fa5a6Sopenharmony_cistd::shared_ptr<KeySubscriberHandler> InputEventHandler::GetSubscriberHandler() const
436c29fa5a6Sopenharmony_ci{
437c29fa5a6Sopenharmony_ci    return eventSubscriberHandler_;
438c29fa5a6Sopenharmony_ci}
439c29fa5a6Sopenharmony_ci
440c29fa5a6Sopenharmony_cistd::shared_ptr<SwitchSubscriberHandler> InputEventHandler::GetSwitchSubscriberHandler() const
441c29fa5a6Sopenharmony_ci{
442c29fa5a6Sopenharmony_ci    return switchEventSubscriberHandler_;
443c29fa5a6Sopenharmony_ci}
444c29fa5a6Sopenharmony_ci
445c29fa5a6Sopenharmony_cistd::shared_ptr<KeyCommandHandler> InputEventHandler::GetKeyCommandHandler() const
446c29fa5a6Sopenharmony_ci{
447c29fa5a6Sopenharmony_ci    return eventKeyCommandHandler_;
448c29fa5a6Sopenharmony_ci}
449c29fa5a6Sopenharmony_ci
450c29fa5a6Sopenharmony_cistd::shared_ptr<EventMonitorHandler> InputEventHandler::GetMonitorHandler() const
451c29fa5a6Sopenharmony_ci{
452c29fa5a6Sopenharmony_ci    return eventMonitorHandler_;
453c29fa5a6Sopenharmony_ci}
454c29fa5a6Sopenharmony_ci
455c29fa5a6Sopenharmony_cistd::shared_ptr<EventFilterHandler> InputEventHandler::GetFilterHandler() const
456c29fa5a6Sopenharmony_ci{
457c29fa5a6Sopenharmony_ci    return eventFilterHandler_;
458c29fa5a6Sopenharmony_ci}
459c29fa5a6Sopenharmony_ci
460c29fa5a6Sopenharmony_cistd::shared_ptr<EventDispatchHandler> InputEventHandler::GetEventDispatchHandler() const
461c29fa5a6Sopenharmony_ci{
462c29fa5a6Sopenharmony_ci    return eventDispatchHandler_;
463c29fa5a6Sopenharmony_ci}
464c29fa5a6Sopenharmony_ci
465c29fa5a6Sopenharmony_ciint32_t InputEventHandler::SetMoveEventFilters(bool flag)
466c29fa5a6Sopenharmony_ci{
467c29fa5a6Sopenharmony_ci    CALL_INFO_TRACE;
468c29fa5a6Sopenharmony_ci#ifdef OHOS_BUILD_ENABLE_MOVE_EVENT_FILTERS
469c29fa5a6Sopenharmony_ci    CHKPR(eventNormalizeHandler_, INVALID_HANDLER_ID);
470c29fa5a6Sopenharmony_ci    return eventNormalizeHandler_->SetMoveEventFilters(flag);
471c29fa5a6Sopenharmony_ci#else
472c29fa5a6Sopenharmony_ci    MMI_HILOGW("Set move event filters does not support");
473c29fa5a6Sopenharmony_ci    return ERROR_UNSUPPORT;
474c29fa5a6Sopenharmony_ci#endif // OHOS_BUILD_ENABLE_MOVE_EVENT_FILTERS
475c29fa5a6Sopenharmony_ci}
476c29fa5a6Sopenharmony_ci} // namespace MMI
477c29fa5a6Sopenharmony_ci} // namespace OHOS