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 "event_package.h"
17 #include "input_device_manager.h"
18 namespace OHOS {
19 namespace MMI {
20 namespace {
21 const std::string VIRTUAL_KEYBOARD = "virtual_keyboard";
22 constexpr uint32_t SEAT_KEY_COUNT_ONE = 1;
23 constexpr uint32_t SEAT_KEY_COUNT_ZERO = 0;
24 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, MMI_LOG_DOMAIN, "EventPackage" };
25 }
26
EventPackage()27 EventPackage::EventPackage() {}
28
~EventPackage()29 EventPackage::~EventPackage() {}
30
PackageKeyEvent(struct libinput_event * event,std::shared_ptr<KeyEvent> key)31 int32_t EventPackage::PackageKeyEvent(struct libinput_event *event, std::shared_ptr<KeyEvent> key)
32 {
33 CHKPR(event, PARAM_INPUT_INVALID);
34 CHKPR(key, ERROR_NULL_POINTER);
35 key->UpdateId();
36 auto data = libinput_event_get_keyboard_event(event);
37 CHKPR(data, ERROR_NULL_POINTER);
38
39 auto device = libinput_event_get_device(event);
40 int32_t deviceId = InputDevMgr->FindInputDeviceId(device);
41 int32_t keyCode = static_cast<int32_t>(libinput_event_keyboard_get_key(data));
42 auto Okey = KeyValueTransformationInput(keyCode);
43 keyCode = static_cast<int32_t>(Okey.keyValueOfSys);
44 int32_t keyAction = (libinput_event_keyboard_get_key_state(data) == 0) ?
45 (KeyEvent::KEY_ACTION_UP) : (KeyEvent::KEY_ACTION_DOWN);
46 auto preAction = key->GetAction();
47 if (preAction == KeyEvent::KEY_ACTION_UP) {
48 auto preUpKeyItem = key->GetKeyItem();
49 if (preUpKeyItem != nullptr) {
50 key->RemoveReleasedKeyItems(*preUpKeyItem);
51 } else {
52 MMI_LOGE("preUpKeyItem is null");
53 }
54 }
55 int64_t time = GetSysClockTime();
56 key->SetActionTime(time);
57 key->SetAction(keyAction);
58 key->SetDeviceId(deviceId);
59 key->SetKeyCode(keyCode);
60 key->SetKeyAction(keyAction);
61 if (key->GetPressedKeys().empty()) {
62 key->SetActionStartTime(time);
63 }
64
65 KeyEvent::KeyItem item;
66 bool isKeyPressed = (libinput_event_keyboard_get_key_state(data) != KEYSTATUS);
67 item.SetDownTime(time);
68 item.SetKeyCode(keyCode);
69 item.SetDeviceId(deviceId);
70 item.SetPressed(isKeyPressed);
71
72 if (keyAction == KeyEvent::KEY_ACTION_DOWN) {
73 key->AddPressedKeyItems(item);
74 }
75 if (keyAction == KeyEvent::KEY_ACTION_UP) {
76 auto pressedKeyItem = key->GetKeyItem(keyCode);
77 if (pressedKeyItem != nullptr) {
78 item.SetDownTime(pressedKeyItem->GetDownTime());
79 } else {
80 MMI_LOGE("Find pressed key failed, keyCode:%{public}d", keyCode);
81 }
82 key->RemoveReleasedKeyItems(item);
83 key->AddPressedKeyItems(item);
84 }
85 return RET_OK;
86 }
87
PackageVirtualKeyEvent(VirtualKey & event,EventKeyboard & key)88 int32_t EventPackage::PackageVirtualKeyEvent(VirtualKey& event, EventKeyboard& key)
89 {
90 const std::string uid = GetUUid();
91 int32_t ret = memcpy_s(key.uuid, MAX_UUIDSIZE, uid.c_str(), uid.size());
92 CHKR(ret == EOK, MEMCPY_SEC_FUN_FAIL, RET_ERR);
93 ret = memcpy_s(key.deviceName, MAX_UUIDSIZE, VIRTUAL_KEYBOARD.c_str(), VIRTUAL_KEYBOARD.size());
94 CHKR(ret == EOK, MEMCPY_SEC_FUN_FAIL, RET_ERR);
95 key.time = event.keyDownDuration;
96 key.key = event.keyCode;
97 key.isIntercepted = event.isIntercepted;
98 key.state = (enum KEY_STATE)event.isPressed;
99 key.eventType = LIBINPUT_EVENT_KEYBOARD_KEY;
100 key.deviceType = DEVICE_TYPE_VIRTUAL_KEYBOARD;
101 key.unicode = 0;
102 if (event.isPressed) {
103 key.seat_key_count = SEAT_KEY_COUNT_ONE;
104 } else {
105 key.seat_key_count = SEAT_KEY_COUNT_ZERO;
106 }
107 return RET_OK;
108 }
109
KeyboardToKeyEvent(const EventKeyboard & key,std::shared_ptr<KeyEvent> keyEventPtr)110 int32_t EventPackage::KeyboardToKeyEvent(const EventKeyboard& key, std::shared_ptr<KeyEvent> keyEventPtr)
111 {
112 CHKPR(keyEventPtr, ERROR_NULL_POINTER);
113 keyEventPtr->UpdateId();
114 KeyEvent::KeyItem keyItem;
115 int32_t keyCode = static_cast<int32_t>(key.key);
116 int32_t keyAction = (key.state == KEY_STATE_PRESSED) ?
117 (KeyEvent::KEY_ACTION_DOWN) : (KeyEvent::KEY_ACTION_UP);
118 int32_t deviceId = key.deviceId;
119 auto preAction = keyEventPtr->GetAction();
120 if (preAction == KeyEvent::KEY_ACTION_UP) {
121 auto preUpKeyItem = keyEventPtr->GetKeyItem();
122 if (preUpKeyItem != nullptr) {
123 keyEventPtr->RemoveReleasedKeyItems(*preUpKeyItem);
124 } else {
125 MMI_LOGE("preUpKeyItem is null");
126 }
127 }
128
129 int64_t time = GetSysClockTime();
130 keyEventPtr->SetActionTime(time);
131 keyEventPtr->SetAction(keyAction);
132 keyEventPtr->SetDeviceId(deviceId);
133 keyEventPtr->SetKeyCode(keyCode);
134 keyEventPtr->SetKeyAction(keyAction);
135
136 if (keyEventPtr->GetPressedKeys().empty()) {
137 keyEventPtr->SetActionStartTime(time);
138 }
139
140 bool isKeyPressed = (key.state == KEY_STATE_PRESSED) ? (true) : (false);
141 keyItem.SetDownTime(time);
142 keyItem.SetKeyCode(keyCode);
143 keyItem.SetDeviceId(deviceId);
144 keyItem.SetPressed(isKeyPressed);
145
146 if (keyAction == KeyEvent::KEY_ACTION_DOWN) {
147 keyEventPtr->AddPressedKeyItems(keyItem);
148 } else if (keyAction == KeyEvent::KEY_ACTION_UP) {
149 auto pressedKeyItem = keyEventPtr->GetKeyItem(keyCode);
150 if (pressedKeyItem != nullptr) {
151 keyItem.SetDownTime(pressedKeyItem->GetDownTime());
152 } else {
153 MMI_LOGE("Find pressed key failed, keyCode:%{public}d", keyCode);
154 }
155 keyEventPtr->RemoveReleasedKeyItems(keyItem);
156 keyEventPtr->AddPressedKeyItems(keyItem);
157 } else {
158 // nothing to do.
159 }
160 return RET_OK;
161 }
162 } // namespace MMI
163 } // namespace OHOS
164