Заставить Xorg распознавать виртуальное устройство libevdev

Я пытался создать простую программу, используя libevdev, чтобы создать виртуальное устройство, которое будет просто перемещать мышь на 50 точек по оси X каждую секунду. Программа работает нормально, однако Xorg не распознает вновь созданное виртуальное устройство.

Я предполагаю, что это будет что-то тривиальное, но я не могу понять, что.

Журналы Xorgs говорят:

[  5860.310] (II) config/udev: Adding input device test device Mouse (/dev/input/event18)
[  5860.310] (II) No input driver specified, ignoring this device.
[  5860.310] (II) This device may have been added with another device file.

Программа:

#include <libevdev/libevdev.h>
#include <libevdev/libevdev-uinput.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

static void check(int i) {
    if (i < 0) {        
        printf("%s\n", strerror(-i));
        exit(1);
    }
}

int main() {
    struct libevdev* evdev = libevdev_new();
    libevdev_set_name(evdev, "test device Mouse");
    libevdev_set_id_vendor(evdev, 0x1);
    libevdev_set_id_product(evdev, 0x1);
    libevdev_set_id_version(evdev, 0x1);
    libevdev_set_id_bustype(evdev, BUS_USB);

    check(libevdev_enable_event_type(evdev, EV_REL));
    check(libevdev_enable_event_code(evdev, EV_REL, REL_X, NULL));
    check(libevdev_enable_event_code(evdev, EV_REL, REL_Y, NULL));
    check(libevdev_enable_event_code(evdev, EV_SYN, SYN_REPORT, NULL));

    struct libevdev_uinput* uinput;
    check(libevdev_uinput_create_from_device(evdev, LIBEVDEV_UINPUT_OPEN_MANAGED, &uinput));

    for (int i = 0; i < 1000; i++) {
        check(libevdev_uinput_write_event(uinput, EV_REL, REL_X, 50));
        check(libevdev_uinput_write_event(uinput, EV_SYN, SYN_REPORT, 0));

        sleep(1);
    }
}

Что я делаю не так?


person hoz    schedule 27.10.2020    source источник


Ответы (1)


Проблема заключалась в том, что кнопки мыши должны быть включены, чтобы движения мыши работали.

Добавление этих строк устраняет проблему:

check(libevdev_enable_event_type(evdev, EV_KEY));
check(libevdev_enable_event_code(evdev, EV_KEY, BTN_LEFT, NULL));
check(libevdev_enable_event_code(evdev, EV_KEY, BTN_RIGHT, NULL));
person hoz    schedule 27.10.2020