2

我正在编写一个程序来远程控制一个基于 arm 的设备,该设备上没有运行 X 服务器。我编写了一个小实用程序来捕获从客户端发送的鼠标事件并在设备上模拟它们。为此,我正在使用 uinput。

我面临的问题是,手臂设备上的光标最初位于(300,300)。当我连接到设备时(使用 chrome 中的 VNC 插件),客户端在浏览器上的鼠标指针位于(100、100)处。两个鼠标指针位置(在浏览器和设备上)之间的对角线距离为 200px。这个差距一直保持着。如果我将指针向右移动 10 像素(从 100,100 到 110, 100),则设备上的鼠标指针从 300,300 移动到 310,300。我不确定这可能是什么原因。唯一没有发生此问题的情况是,当我确保两个鼠标指针最初从相同的坐标开始时(比如从窗口的任何一个角开始。

这是所有与uinput相关的代码:

    static char TOUCH_DEVICE[256] = "/dev/uinput";
    struct uinput_user_dev touch_uidev;
    struct input_event moveev[2];
    struct input_event touchev;
    static int touchfd = -1;

    // Opening device
    if((touchfd = open(TOUCH_DEVICE, O_WRONLY | O_NONBLOCK)) == -1)
    {
        printf("cannot open touch device %s\n", TOUCH_DEVICE);
        exit(EXIT_FAILURE);
    }

    printf("Registering event types...\n");
    if(ioctl(touchfd, UI_SET_EVBIT, EV_SYN) < 0)
        die("error: ioctl");
    if(ioctl(touchfd, UI_SET_EVBIT, EV_ABS) < 0)
        die("error: ioctl");
    if(ioctl(touchfd, UI_SET_ABSBIT, ABS_X) < 0)
        die("error: ioctl");
    if(ioctl(touchfd, UI_SET_ABSBIT, ABS_Y) < 0)
        die("error: ioctl");

    memset(&touch_uidev, 0, sizeof(touch_uidev));
    snprintf(touch_uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-mouse");
    touch_uidev.id.bustype = BUS_USB;
    touch_uidev.id.vendor  = 0x1;
    touch_uidev.id.product = 0x1;
    touch_uidev.id.version = 1;
    touch_uidev.absmin[ABS_X] = 0;
    touch_uidev.absmax[ABS_X] = 640;
    touch_uidev.absmin[ABS_Y] = 0;
    touch_uidev.absmax[ABS_Y] = 480;

    if(write(touchfd, &touch_uidev, sizeof(touch_uidev)) < 0)
        die("error: write");

    if(ioctl(touchfd, UI_DEV_CREATE) < 0)
        die("error: ioctl");
    printf("Mouse fd opened successfully.\n");

    //Injecting events
    memset(moveev, 0, sizeof(moveev));
    moveev[0].type = EV_ABS;
    moveev[0].code = ABS_X;
    moveev[0].value = x;
    moveev[1].type = EV_ABS;
    moveev[1].code = ABS_Y;
    moveev[1].value = y;
    if(write(touchfd, moveev, sizeof(moveev)) < 0)
        die("error: write");

    memset(&touchev, 0, sizeof(touchev));
    touchev.type = EV_SYN;
    touchev.code = 0;
    touchev.value = 0;
    if(write(touchfd, &touchev, sizeof(touchev)) < 0)
        die("error: write");

X 服务器运行时不会发生此问题。我很好奇是什么原因造成的。任何帮助是极大的赞赏。谢谢。

4

0 回答 0