Como evitar que o teclado seja interpretado pelo aplicativo atual?

3

Eu tenho 3 teclados USB conectados ao Linux. Normalmente, ao escrever em qualquer um, os caracteres "vão" para a aplicação atualmente ativa, e. para terminal ou qualquer outro aplicativo.

Mas, eu lendo os eventos de teclado de dois teclados diretamente lendo os dispositivos /dev/input/eventX específicos usando algum módulo perl . Enquanto o script lê e decodifica todos os eventos corretamente, as chaves inseridas também estão indo para o aplicativo ativo.

A pergunta é: É possível parar o roteamento de eventos do teclado de um teclado específico para o aplicativo ativo? Por exemplo: de certa forma, diz ao kernel que as entradas de um determinado teclado não devem ser tomadas como uma entrada normal do teclado.

EDITAR

porque o X11 lê todos os dispositivos que possuem nós de dispositivo no /dev/input/event* - kooks like, aqui estão 2 soluções possíveis:

  1. Altera um pouco o nome do "teclado" USB para outro nome em vez de eventN , por exemplo /dev/input/myinput0 . Infelizmente, as regras udev não permitem renomear o dispositivo. (A diretiva NAME no rules.d funciona somente para dispositivos de rede, para outros dispositivos pode criar apenas um link simbólico)
  2. Altera um pouco a configuração X11 , no /usr/share/X11/xorg.conf.d/10-evdev.conf , para ignorar alguns dispositivos "semelhantes a teclado" específicos - por exemplo, não leia todos os dispositivos eventN . Atualmente no meu sistema contém:
Section "InputClass"
        Identifier "evdev keyboard catchall"
        MatchIsKeyboard "on"
        MatchDevicePath "/dev/input/event*"
        Driver "evdev"
EndSection

QUALQUER IDÉIA como fazer alguma das situações acima?

O fundo real: eu anexei dois leitores USB-RFID. Eles atuam como teclados, e. quando eu toco o leitor com a tag RFID, ele envia o número RFID exatamente como foi digitado no teclado - por exemplo, o leitor age como um teclado normal. Meu aplicativo pode ler os eventos de RFID (em segundo plano) e (é claro) não quero que os caracteres do RFID entrem na janela ativa.

    
por jm666 16.06.2017 / 10:09

2 respostas

2

Se você estiver lendo /dev/input/eventX , faça um EVIOCGRAB ioctl nele. Você pode editar o ioctl em Perl com facilidade. Não se esqueça de liberar a captura quando seu programa terminar.

A captura impedirá que todos os outros dispositivos, incluindo o X, leiam eventos deste dispositivo.

Isso é mais limpo que xinput , porque você também exclui outros aplicativos que podem querer ler diretamente do dispositivo e também pode controlar a duração da exclusão (contanto que seu aplicativo seja executado).

    
por 17.06.2017 / 10:16
1

Você pode desabilitar os dispositivos de entrada em X com o comando xinput . Execute xinput list para listar os dispositivos disponíveis e, em seguida, xinput disable … para desativar um dispositivo por nome ou número.

O Udev é provavelmente o caminho a seguir, mas o X11 é o que eu sei que está no topo da minha cabeça.

    
por 17.06.2017 / 02:03