Program Listing for File LINUX_SUDO_GETTER.cpp
↰ Return to documentation for file (include/input/linux/LINUX_SUDO_GETTER.cpp
)
#include "LINUX_INPUT.hpp"
#include <fcntl.h>
#include <filesystem>
#include <unistd.h>
constexpr auto EVENT_ROOT = "/dev/input/";
namespace fs = std::filesystem;
using EV_LIST = std::vector<std::string>;
using DEV_LIST = std::vector<DeviceData>;
EV_LIST
EventListGetter()
{
if (!fs::exists(EVENT_ROOT) || !fs::is_directory(EVENT_ROOT)) {
return EV_LIST();
}
EV_LIST lists;
for (const auto &fitr : fs::directory_iterator(EVENT_ROOT)) {
if (fitr.path().filename().string().find("event") == 0) {
lists.push_back(fs::absolute(fitr.path()));
}
}
return lists;
}
bool
CHK_QWERTY(libevdev *dev)
{
return libevdev_has_event_code(dev, EV_KEY, KEY_Q) == 1 &&
libevdev_has_event_code(dev, EV_KEY, KEY_W) == 1 &&
libevdev_has_event_code(dev, EV_KEY, KEY_E) == 1 &&
libevdev_has_event_code(dev, EV_KEY, KEY_R) == 1 &&
libevdev_has_event_code(dev, EV_KEY, KEY_T) == 1 &&
libevdev_has_event_code(dev, EV_KEY, KEY_Y) == 1;
}
DEV_LIST
DeviceDataGetter(const EV_LIST &list)
{
DEV_LIST outs;
for (const auto &evp : list) {
int evpFd = open(evp.c_str(), O_RDONLY);
libevdev *dev = nullptr;
if (libevdev_new_from_fd(evpFd, &dev) < 0) {
close(evpFd);
continue;
} else {
DeviceData temp;
temp.deviceName = libevdev_get_name(dev);
temp.deviceType.HAS_ABSOLUTE_AXIS_SENSOR =
libevdev_has_event_type(dev, EV_ABS) == 1;
temp.deviceType.HAS_KEY_Q_W_E_R_T_Y = CHK_QWERTY(dev);
temp.deviceType.HAS_RELATIVE_AXIS_SENSOR =
libevdev_has_event_type(dev, EV_REL) == 1;
if (temp.deviceType.HAS_ABSOLUTE_AXIS_SENSOR ||
temp.deviceType.HAS_KEY_Q_W_E_R_T_Y ||
temp.deviceType.HAS_RELATIVE_AXIS_SENSOR) {
outs.push_back(temp);
}
close(evpFd);
libevdev_free(dev);
}
}
return outs;
}
#include <iostream>
int
main(int argc, char *argv[])
{
auto res = EventListGetter();
auto Dres = DeviceDataGetter(res);
for (auto i : Dres) {
std::cout << i.deviceName << std::endl;
std::cout << " Has qwerty: " << i.deviceType.HAS_KEY_Q_W_E_R_T_Y
<< " Has Abs sensor: "
<< i.deviceType.HAS_ABSOLUTE_AXIS_SENSOR
<< " Has Rel sensor: "
<< i.deviceType.HAS_RELATIVE_AXIS_SENSOR << std::endl;
}
return 0;
}