C uinput-鼠标坐标同步问题

C uinput-鼠标坐标同步问题,c,vnc,vnc-server,vnc-viewer,uinput,C,Vnc,Vnc Server,Vnc Viewer,Uinput,我正在写一个程序来远程控制一个基于arm的设备,它没有运行X服务器。我编写了一个小实用程序来捕获从客户端发送的鼠标事件,并在设备上进行模拟。为此,我使用uinput 我面临的问题是,arm设备上的光标最初位于(300300)。当我连接到设备时(使用chrome中的VNC插件),客户端在浏览器上的鼠标指针位于,比如(100100)。两个鼠标指针位置(浏览器和设备上)之间的对角线间距为200px。这一差距一直保持着。如果将指针向右移动10px(从100100移动到110100),则设备上的鼠标指针将

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

我面临的问题是,arm设备上的光标最初位于(300300)。当我连接到设备时(使用chrome中的VNC插件),客户端在浏览器上的鼠标指针位于,比如(100100)。两个鼠标指针位置(浏览器和设备上)之间的对角线间距为200px。这一差距一直保持着。如果将指针向右移动10px(从100100移动到110100),则设备上的鼠标指针将从300300移动到310300。我不确定是什么原因造成的。只有当我确保两个鼠标指针最初都从相同的坐标开始(就像从窗口的任何一个角落开始)时,这个问题才会发生

以下是所有与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");
staticchartouch\u设备[256]=“dev/uinput”;
结构uinput\u user\u dev touch\u uidev;
结构输入_事件moveev[2];
结构输入\事件触摸EV;
静态int-touchfd=-1;
//开启装置
如果((触摸FD=打开(触摸设备,仅限O| O|U非块))=-1)
{
printf(“无法打开触摸设备%s\n”,触摸设备);
退出(退出失败);
}
printf(“注册事件类型…\n”);
如果(ioctl(触摸FD,UI设置EVBIT,EV同步)<0)
die(“错误:ioctl”);
如果(ioctl(触摸FD、UI设置、EVBIT、EV ABS)<0)
die(“错误:ioctl”);
如果(ioctl(触摸FD、UI设置ABSBIT、ABS X)<0)
die(“错误:ioctl”);
如果(ioctl(触摸FD、UI设置ABSBIT、ABS Y)<0)
die(“错误:ioctl”);
memset(&touch_-uidev,0,sizeof(touch_-uidev));
snprintf(touch_uidev.name,UINPUT_MAX_name_SIZE,“UINPUT鼠标”);
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(写入(touchfd和touch_-uidev,sizeof(touch_-uidev))<0)
死(“错误:写入”);
if(ioctl(touchfd,UI_DEV_CREATE)<0)
die(“错误:ioctl”);
printf(“鼠标fd已成功打开。\n”);
//注入事件
memset(moveev,0,sizeof(moveev));
moveev[0]。类型=EV\U ABS;
moveev[0]。代码=ABS\u X;
moveev[0]。值=x;
moveev[1]。类型=EV\U ABS;
moveev[1]。代码=ABS_Y;
moveev[1]。值=y;
if(写入(touchfd、moveev、sizeof(moveev))<0)
死(“错误:写入”);
memset(&touchev,0,sizeof(touchev));
touchev.type=EV_SYN;
touchev.code=0;
touchev.value=0;
if(写入(touchfd和touchev,sizeof(touchev))<0)
死(“错误:写入”);

此问题在X服务器运行时不会发生。我很好奇是什么原因造成的。非常感谢您的帮助。谢谢。

如果我理解正确,此stmt“此问题不会发生的唯一时间是我确保两个鼠标指针最初从相同的坐标开始(就像从窗口的任何一个角落开始。”,那么为什么不将初始(300300)坐标设置为VNC客户端?在设备上,鼠标指针最初可以在任何位置。我尝试在uinput创建设备后,通过向该位置注入鼠标移动事件将其移动到(0,0),但指针没有移动。