bool evdevDevice::IsValid() const { int current_fd = libevdev_get_fd(m_dev); if (current_fd == -1) return false; libevdev* device; if (libevdev_new_from_fd(current_fd, &device) != 0) { close(current_fd); return false; } libevdev_free(device); return true; }
static int mainloop(struct libevdev *dev, struct measurements *m) { struct pollfd fds[2]; sigset_t mask; fds[0].fd = libevdev_get_fd(dev); fds[0].events = POLLIN; sigemptyset(&mask); sigaddset(&mask, SIGINT); fds[1].fd = signalfd(-1, &mask, SFD_NONBLOCK); fds[1].events = POLLIN; sigprocmask(SIG_BLOCK, &mask, NULL); while (poll(fds, 2, -1)) { struct input_event ev; int rc; if (fds[1].revents) break; do { rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev); if (rc == LIBEVDEV_READ_STATUS_SYNC) { fprintf(stderr, "Error: cannot keep up\n"); return 1; } else if (rc != -EAGAIN && rc < 0) { fprintf(stderr, "Error: %s\n", strerror(-rc)); return 1; } else if (rc == LIBEVDEV_READ_STATUS_SUCCESS) { handle_event(m, &ev); } } while (rc != -EAGAIN); } return 0; }
int adhoc_get_fd(const struct adhoc *adhoc) { return libevdev_get_fd(adhoc->dev); }