Виртуальная мышь и eventX

Я играю с uinput, создавая виртуальную клавиатуру / мышь. У меня нет проблем с настройкой виртуального устройства.

int                    fd;
struct uinput_user_dev uidev;
struct input_event     ev;
int                    dx, dy;
int                    i;

fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
if(fd < 0)
    die("error: open");


if(ioctl(fd, UI_SET_EVBIT, EV_KEY) < 0)
    die("error: ioctl");
if(ioctl(fd, UI_SET_KEYBIT, BTN_LEFT) < 0)
    die("error: ioctl");

if(ioctl(fd, UI_SET_EVBIT, EV_REL) < 0)
    die("error: ioctl");
if(ioctl(fd, UI_SET_RELBIT, REL_X) < 0)
    die("error: ioctl");
if(ioctl(fd, UI_SET_RELBIT, REL_Y) < 0)
    die("error: ioctl");

memset(&uidev, 0, sizeof(uidev));
snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "test");
uidev.id.bustype = BUS_USB;
uidev.id.vendor  = 0x1;
uidev.id.product = 0x1;
uidev.id.version = 1;

write(fd, &uidev, sizeof(uidev))
ioctl(fd, UI_DEV_CREATE)

И я могу писать события в / dev / uinput. Он работает как шарм, мышь движется или клавиатура работает.

Однако я не понимаю, где я могу прочитать предполагаемые события. Я могу читать на / dev / input / mouse мышь и видеть данные виртуальной мыши. но / dev / input / mice для всех мышей...

В каком / dev / input / eventX я должен прочитать? Я пытался прочитать их все, но ничего нет.

Я прочитал event0 для моей USB-мыши, event1 для клавиатуры... но где я могу прочитать о моем виртуальном устройстве?

1 ответ

Решение

Обычно стандартные правила udev используются для создания символических ссылок на основе имени; например, в системах на основе Debian, как /dev/input/by-id/*-event-* на соответствующее устройство ввода событий. Поскольку они основаны на свойствах устройства, они стабильны: вы можете просто использовать символическую ссылку, чтобы получить доступ к вашему виртуальному устройству.

Если вы не можете найти символическую ссылку, вы можете найти устройство ввода событий.

Каждое устройство ввода событий Linux описывается псевдокаталогом /sys/class/input/event*т.е. /sys/class/input/event0соответствует /dev/input/event0 или же /dev/input/event/0 (что бы ни существовало).

Псевдофайл /sys/class/input/event*/device/name содержит имя устройства. Продукт, поставщик, версия и тип шины доступны в виде четырехзначных шестнадцатеричных строк в псевдофайлах. /sys/class/input/event*/device/id/product, /sys/class/input/event*/device/id/vendor, /sys/class/input/event*/device/id/version, а также /sys/class/input/event*/device/id/bustypeсоответственно. Вы можете читать эти файлы как обычно, за исключением того, что если вы stat() или же fstat() их размер равен нулю. Вместо этого прочитайте содержимое этих файлов в небольшой буфер (длиной 128 или до 126 символов + "\n\0", должно хватить для имени; 8 (4 + "\n\0") должно хватить для файлов под id/), и сравните его с нужным именем устройства или проанализируйте шестнадцатеричные числа.

Другие вопросы по тегам