0

I found little to no examples online about sending absolute events (EV_ABS) using libevdev.

I was able to create a device and send some keystrokes, but no luck with absolute events.

The device is shown by sudo libinput list-devices but when I try to record events with sudo evemu-record nothing is shown.

here is my testing code:

#include <iostream>
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <linux/input.h>
#include <linux/uinput.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <libevdev-1.0/libevdev/libevdev-uinput.h>
#include <unistd.h>

int main() {

int err; struct libevdev dev; struct libevdev_uinput uidev; struct input_absinfo absinfo{ .value = 0, .minimum = 0, .maximum = 12372, .fuzz = 0, .flat = 0, .resolution = 40 };

dev = libevdev_new(); libevdev_set_name(dev, "eye tracker pointer"); libevdev_enable_event_type(dev, EV_ABS); libevdev_enable_event_code(dev, EV_ABS, ABS_X, &absinfo); libevdev_enable_event_code(dev, EV_ABS, ABS_Y, &absinfo);

err = libevdev_uinput_create_from_device(dev, LIBEVDEV_UINPUT_OPEN_MANAGED, &uidev); if (err != 0) return err;

usleep(10000000UL);//s libevdev_uinput_write_event(uidev, EV_ABS, ABS_X, 100); libevdev_uinput_write_event(uidev, EV_ABS, ABS_Y, 100); libevdev_uinput_write_event(uidev, EV_ABS, SYN_REPORT, 0); libevdev_uinput_write_event(uidev, EV_ABS, ABS_X, 200); libevdev_uinput_write_event(uidev, EV_ABS, ABS_Y, 200); libevdev_uinput_write_event(uidev, EV_ABS, SYN_REPORT, 0);

usleep(2000000UL);

libevdev_uinput_destroy(uidev);

return 0;

Maybe I am doing something wrong with the input_absinfo initialization?

I'm on fedora 36

1 Answers1

0

The error was simply that i wasn't calling sync the right way (EV_SYN). It took me hours to realize.

Code should have been:

libevdev_uinput_write_event(uidev, EV_ABS, ABS_X, 100);
libevdev_uinput_write_event(uidev, EV_ABS, ABS_Y, 100);
libevdev_uinput_write_event(uidev, EV_SYN, SYN_REPORT, 0);
libevdev_uinput_write_event(uidev, EV_ABS, ABS_X, 200);
libevdev_uinput_write_event(uidev, EV_ABS, ABS_Y, 200);
libevdev_uinput_write_event(uidev, EV_SYN, SYN_REPORT, 0);