2015-06-25 5 views
4

Я получаю xy данные из своей сети, и я хотел бы управлять позицией мыши, используя linux на wayland.Имитация движения мыши на linux wayland

Я видел много исходников с помощью X libs или X-приложений, но он не будет работать на wayland. Я также смотрю на libinput и evedev, но я не нахожу никакого примера кода о том, как создавать/моделировать мышь.

+0

Я не тестировал решения пока нет, но спасибо за пост, я столкнулся с той же проблемой в наших тестах JUnit .. –

ответ

1

Uinput - это ответ.

void initMouse(){ 
    fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK); 
    ioctl(fd, UI_SET_EVBIT, EV_KEY); 
    ioctl(fd, UI_SET_KEYBIT, BTN_LEFT); 
    ioctl(fd, UI_SET_EVBIT, EV_ABS); 
    ioctl(fd, UI_SET_ABSBIT, ABS_X); 
    ioctl(fd, UI_SET_ABSBIT, ABS_Y); 

    struct uinput_user_dev uidev; 
    memset(&uidev,0,sizeof(uidev)); 
    snprintf(uidev.name,UINPUT_MAX_NAME_SIZE,"HolusionMouse"); 
    uidev.id.bustype = BUS_USB; 
    uidev.id.version = 1; 
    uidev.id.vendor = 0x1; 
    uidev.id.product = 0x1; 
    uidev.absmin[ABS_X] = 0; 
    uidev.absmax[ABS_X] = 1080; 
    uidev.absmin[ABS_Y] = 0; 
    uidev.absmax[ABS_Y] = 1080; 
    write(fd, &uidev, sizeof(uidev)); 
    ioctl(fd, UI_DEV_CREATE); 

    usleep(100000); 
} 

И обновление:

struct input_event ev[2], evS; 
memset(ev, 0, sizeof(ev)); 
ev[0].type = EV_ABS; 
ev[0].code = ABS_X; 
ev[0].value = 100; 
ev[1].type = EV_ABS; 
ev[1].code = ABS_Y; 
ev[1].value = 100; 
write(fd, ev, sizeof(ev)); 

memset(&evS,0,sizeof(struct input_event)); 
evS.type = EV_SYN; 
write(fd, &evS, sizeof(struct input_event)); 

usleep(10000); 
+0

Любая идея, как выполнять такие задачи без необходимости использования внешних библиотек/инструментов? – Jewenile

+0

@ По-моему, я так не думаю. UInput имеет преимущество для работы на X и wayland. –

Смежные вопросы