c - 让Xorg识别libevdev虚拟设备

标签 c input mouse xorg uinput

我一直在尝试使用 libevdev 创建一个简单的程序来制作一个虚拟设备,该设备每秒将鼠标在 X 轴上移动 50 个点。程序运行得很好,但是 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);
    }
}

我做错了什么?

最佳答案

问题是需要启用鼠标按钮才能使鼠标移动起作用。

添加这些行可以解决问题:

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

关于c - 让Xorg识别libevdev虚拟设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64559499/

相关文章:

c++ - 运行程序时出现运行时错误,但使用调试器时却没有

c++ - 一种简单的算法,采用两个 INT 并返回一个随机 INT

Javascript 禁用空间滚动

events - 为什么我的 javascript 鼠标事件没有触发?

c++ - 快速输入输出功能

c - 如何读取文件直到某个字符或 EOF?

c - 如何从c中的输入文件读取结构信息

java - primefaces 形式和异常,如何重置为旧值

qt4 - QWS 中的鼠标支持

javascript - 单击 Command 键不会打开新选项卡,但单击中键可以打开新选项卡