libevdevを使用した絶対イベント転送ABS_X ABS_Y

libevdevを使用した絶対イベント転送ABS_X ABS_Y

libevdevを使用して絶対イベント(EV_ABS)を送信する方法のいくつかの例をオンラインで見つけました。

デバイスを作成していくつかのキーストロークを送信できますが、絶対イベントには運がありません。

デバイスは表示されますが、sudo libinput list-devicesイベントを記録しようとするとsudo evemu-record何も表示されません。

これは私のテストコードです。

#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;

おそらくinput_absinfoを初期化するときに何か間違っていますか?

私はFedora 36を使用しています

答え1

エラーは、同期(EV_SYN)が正しい方法で呼び出されなかったために発生します。気づくのに数時間かかりました。

コードは次のようになります。

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);

関連情報