AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 422698
Accepted
Anon
Anon
Asked: 2018-02-08 17:49:04 +0800 CST2018-02-08 17:49:04 +0800 CST 2018-02-08 17:49:04 +0800 CST

Como definir a posição absoluta do cursor do mouse no Wayland sem usar o mouse?

  • 772

A questão é bem direta.

O que eu teria usado em X [xdotool]obviamente não funciona no futuro, e nenhuma nova solução óbvia surgiu devido à relativa nova adoção de wayland.

Soluções que requerem programação são aceitáveis.

mouse wayland
  • 3 3 respostas
  • 5211 Views

3 respostas

  • Voted
  1. Best Answer
    aliceinpalth
    2018-02-08T19:04:18+08:002018-02-08T19:04:18+08:00

    Você pode usar uinput ( linux/uinput.h). Ele funciona tanto no X quanto no Wayland.

    A página de documentação acima tem um exemplo que inclui a criação de um dispositivo virtual que se comporta como um mouse:

    #include <linux/uinput.h>
    
    void emit(int fd, int type, int code, int val)
    {
       struct input_event ie;
    
       ie.type = type;
       ie.code = code;
       ie.value = val;
       /* timestamp values below are ignored */
       ie.time.tv_sec = 0;
       ie.time.tv_usec = 0;
    
       write(fd, &ie, sizeof(ie));
    }
    
    int main(void)
    {
       struct uinput_setup usetup;
       int i = 50;
    
       int fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
    
       /* enable mouse button left and relative events */
       ioctl(fd, UI_SET_EVBIT, EV_KEY);
       ioctl(fd, UI_SET_KEYBIT, BTN_LEFT);
    
       ioctl(fd, UI_SET_EVBIT, EV_REL);
       ioctl(fd, UI_SET_RELBIT, REL_X);
       ioctl(fd, UI_SET_RELBIT, REL_Y);
    
       memset(&usetup, 0, sizeof(usetup));
       usetup.id.bustype = BUS_USB;
       usetup.id.vendor = 0x1234; /* sample vendor */
       usetup.id.product = 0x5678; /* sample product */
       strcpy(usetup.name, "Example device");
    
       ioctl(fd, UI_DEV_SETUP, &usetup);
       ioctl(fd, UI_DEV_CREATE);
    
       /*
        * On UI_DEV_CREATE the kernel will create the device node for this
        * device. We are inserting a pause here so that userspace has time
        * to detect, initialize the new device, and can start listening to
        * the event, otherwise it will not notice the event we are about
        * to send. This pause is only needed in our example code!
        */
       sleep(1);
    
       /* Move the mouse diagonally, 5 units per axis */
       while (i--) {
          emit(fd, EV_REL, REL_X, 5);
          emit(fd, EV_REL, REL_Y, 5);
          emit(fd, EV_SYN, SYN_REPORT, 0);
          usleep(15000);
       }
    
       /*
        * Give userspace some time to read the events before we destroy the
        * device with UI_DEV_DESTOY.
        */
       sleep(1);
    
       ioctl(fd, UI_DEV_DESTROY);
       close(fd);
    
       return 0;
    }
    
    • 7
  2. meuh
    2018-02-09T07:57:24+08:002018-02-09T07:57:24+08:00

    Se você não quiser escrever código C para uinput , existem pacotes python e até mesmo alguns utilitários de depuração e teste existentes que funcionam no mesmo nível evdevevemu-describe , ou seja , evemu-device, , evemu-play, evemu-record, e evemu-eventdo pacote evemu. Você precisa ser root para usá-los. Aqui está um exemplo que localiza o dispositivo de mouse e os eventos que ele gera e, em seguida, gera artificialmente um evento para ele.

    Primeiro listamos os dispositivos evdev:

    $ sudo evemu-describe 
    Available devices:
    ...
    /dev/input/event5:     Logitech USB Optical Mouse
    ...
    

    Este é um comando interativo, que após listar os dispositivos físicos nos pede para escolher um para maiores detalhes sobre ele. Nós escolhemos 5, o mouse:

    Select the device event number [0-9]: 5
    ...
    # Input device name: "Logitech USB Optical Mouse"
    ...
    # Supported events:
    #   Event type 0 (EV_SYN)
    #     Event code 0 (SYN_REPORT)
    ...
    #   Event type 1 (EV_KEY)
    #     Event code 272 (BTN_LEFT)
    #     Event code 273 (BTN_RIGHT)
    #     Event code 274 (BTN_MIDDLE)
    #   Event type 2 (EV_REL)
    #     Event code 0 (REL_X)
    #     Event code 1 (REL_Y)
    #     Event code 8 (REL_WHEEL)
    ...
    

    Outro dos comandos de teste do evemu nos mostrará os eventos que estão sendo gerados quando movemos o mouse:

    $ sudo evemu-record /dev/input/event5
    E: 4.223 0002 0000 0004 # EV_REL / REL_X                4
    E: 4.223 0000 0000 0000 # ------------ SYN_REPORT (0) ------ +8ms
    E: 4.231 0002 0000 0007 # EV_REL / REL_X                7
    E: 4.231 0002 0001 0001 # EV_REL / REL_Y                1
    E: 4.231 0000 0000 0000 # ------------ SYN_REPORT (0) ------ +8ms
    

    Normalmente, para um movimento do mouse existe o tipo de evento EV_REL, o código de evento REL_X e/ou REL_Y para o eixo de movimento relativo e o valor do evento distância movida (4, 7, 1 acima). Os eventos são seguidos por um evento de sincronização do tipo EV_SYN com o código SYN_REPORT para sinalizar o fim do evento.

    Podemos injetar nosso próprio evento (digamos, um movimento de 20,10) com outro dos comandos de teste:

    sudo evemu-event /dev/input/event5 --type EV_REL --code REL_X --value 20
    sudo evemu-event /dev/input/event5 --type EV_REL --code REL_Y --value 10 --sync
    

    A --syncopção adiciona o evento SYN_REPORT ao final (o equivalente a --type EV_SYN --code SYN_REPORT).

    Por fim, outro comando de teste evemu-devicepermite criar um novo dispositivo de entrada, fornecendo uma descrição como as que já vimos para o mouse. Ele usa /dev/uinpute cria um novo /dev/input/event*dispositivo, que podemos usar para enviar eventos.

    Portanto, mesmo se você não tiver um mouse, poderá adicionar um dinamicamente e depois controlá-lo como desejar. Não tenho um dispositivo com eventos de posição absoluta para fornecer um exemplo, mas você pode adicionar um dispositivo semelhante a um tablet e enviar eventos de movimentos absolutos por meio dele.

    • 3
  3. F. Hauri - Give Up GitHub
    2022-09-29T00:29:59+08:002022-09-29T00:29:59+08:00

    Da resposta de meuh , escrevi este pequeno mousemovescript bash, para executar XREL YRELcomo argumentos.

    #!/bin/bash
    
    while IFS=: read dev desc ;do
        case $desc in 
            *[Mm]ouse* ) mousedev=$dev;;
        esac 
    done < <(evemu-describe <<<'' 2>&1)
    
    [ -c "$mousedev" ] && 
        evemu-event $mousedev --type EV_REL --code REL_X --value $1 &&
        evemu-event $mousedev --type EV_REL --code REL_Y --value $2 --sync
    

    Como rootou através de sudo:

    sudo mousemove -20 10
    sudo mousemove -4000 -4000
    

    Devido ao conceito de aceleração do mouse , o movimento real não corresponde a valores exatos, exceto para valores muito baixos.

    • 1

relate perguntas

  • Como definir configurações de mouse específicas do dispositivo em Wayland sob Libinput (Debian Gnome)?

  • Reduzindo a sensibilidade do mouse no Kubuntu 17.10

  • Como configurar um mouse no linux?

  • Virtual Machine Manager quer inibir atalhos - de novo e de novo - em Wayland

  • Ponteiro do mouse muito rápido no Linux Mint 18

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve