C++ 虚拟输入设备事件类型设置宏解释
本文解释了 C++ 代码中用于设置虚拟输入设备支持的事件类型宏的用途。这些宏被定义在 uinput 库中,用于控制虚拟输入设备支持的事件类型。代码中使用了一个 map 来存储每个宏对应的函数,这些函数返回一个 vector,包含了虚拟设备支持的某个类型的事件。循环遍历这些函数,将它们返回的 vector 中的每个事件类型设置到虚拟设备中。
代码解释
void VirtualDeviceBuilder::SetSupportedEvents()
{
static const std::map<int32_t, std::function<std::vector<uint32_t>()>> uinputTypes {
{ UI_SET_EVBIT, std::bind(&VirtualDeviceBuilder::GetEventTypes, this) },
{ UI_SET_KEYBIT, std::bind(&VirtualDeviceBuilder::GetKeys, this) },
{ UI_SET_PROPBIT, std::bind(&VirtualDeviceBuilder::GetProperties, this) },
{ UI_SET_ABSBIT, std::bind(&VirtualDeviceBuilder::GetAbs, this) },
{ UI_SET_RELBIT, std::bind(&VirtualDeviceBuilder::GetRelBits, this) },
{ UI_SET_MSCBIT, std::bind(&VirtualDeviceBuilder::GetMiscellaneous, this) },
{ UI_SET_LEDBIT, std::bind(&VirtualDeviceBuilder::GetLeds, this) },
{ UI_SET_SWBIT, std::bind(&VirtualDeviceBuilder::GetSwitches, this) },
{ UI_SET_FFBIT, std::bind(&VirtualDeviceBuilder::GetRepeats, this) }
};
for (const auto &setEvents : uinputTypes) {
const auto &events = setEvents.second();
for (const auto &e : events) {
if (ioctl(fd_, setEvents.first, e) < 0) {
FI_HILOGE("Failed while setting event type");
}
}
}
}
宏解释
- UI_SET_EVBIT: 设置支持的事件类型。
- UI_SET_KEYBIT: 设置支持的按键。
- UI_SET_PROPBIT: 设置支持的属性。
- UI_SET_ABSBIT: 设置支持的绝对事件。
- UI_SET_RELBIT: 设置支持的相对事件。
- UI_SET_MSCBIT: 设置支持的其他事件。
- UI_SET_LEDBIT: 设置支持的 LED 灯。
- UI_SET_SWBIT: 设置支持的开关。
- UI_SET_FFBIT: 设置支持的重复事件。
总结
这些宏通过 ioctl 系统调用将事件类型设置到虚拟设备中,确保设备能够接收和处理相应的事件。代码中的每个宏对应一个函数,这些函数返回一个 vector,包含了虚拟设备支持的某个类型的事件。代码循环遍历这些函数,将它们返回的 vector 中的每个事件类型设置到虚拟设备中。如果设置失败,则会输出错误信息。
原文地址: https://www.cveoy.top/t/topic/n6ws 著作权归作者所有。请勿转载和采集!