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