• 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 "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