O uso do teclado Usb separadamente no X

2

Eu tenho um scanner de código de barras usb que emula o teclado. Quando conectado, X obtém o controle e o manipula como um teclado comum e envia eventos de teclado para a janela atual focada.

Isso não é o que eu quero fazer. Eu tenho um programa que ler códigos de barras do fluxo de entrada ASCII e processá-los. Este programa é executado em segundo plano e não possui interface de usuário.

Como configurar o Linux para não usar este teclado usb no X, mas mapeá-lo como um dispositivo de fluxo ascii. Dessa forma, poderei redirecioná-lo como um dispositivo de entrada para o meu programa e fornecer leitura dos códigos de barras, independentemente das alterações do foco de entrada. E os códigos de barras não devem ser passados para a janela atualmente focada.

Além disso, é melhor não executar o programa de manipulação de código de barras como raiz, portanto, o dispositivo de teclado deve ter permissões de leitura para todos.

    
por johnfound 07.02.2017 / 09:42

1 resposta

4

1) Como configurar o X para ignorar o teclado

Use lsusb para encontrar o ID do seu scanner de código de barras (no formato 0123:4567 ). Crie ou modifique um arquivo xorg.conf (geralmente em /etc/X11/ ). Adicione uma seção InputClass com o ID que você acabou de encontrar:

Section "InputClass"
    Identifier "barcode"
    MatchUSBID "0123:4567"
    Option "Ignore" "true"
EndSection

Reinicie o X, verifique em Xorg.log se o seu dispositivo é reconhecido por esta seção e foi ignorado.

2) A conversão de keypresses para códigos ASCII (ou outros) é bastante envolvida, para permitir diferentes layouts de teclado, chaves inativas, personalizações etc. Agora que você desabilitou a camada de conversão X, você pode receber eventos keypress e keyrelease from o dispositivo /dev/input/eventX apropriado. O número pode mudar; para o seu leitor de código de barras, haverá um link simbólico em /dev/input/by-id/ , que não muda. Então use o link simbólico.

Você pode executar evtest nesse arquivo para ver que tipo de evento ele gera. Eles mapeamento para o seu leitor de código de barras será simples, então uma pesquisa de tabela de keysym para código ASCII fará. Você pode processar esses eventos em seu próprio programa, ver a evtest source ou, por exemplo, aqui . Você também pode escrever um pequeno programa em C que apenas leia este dispositivo e produza ASCII em stdout, e então integre-o em seu aplicativo usando um pipe, etc.

"Mapeando-o como um dispositivo de fluxo ASCII" não é possível, esses dispositivos não existem no kernel do Linux.

3) Definindo permissões

Você precisa escrever uma regra udev personalizada para definir permissões para seu dispositivo de entrada. SUBSYSTEM deve corresponder a input , ACTION deve corresponder ADD , o ambiente ENV deve conter informações para corresponder ao dispositivo (use udevadm para descobrir detalhes) e você pode definir OWNER , GROUP e MODE para o dispositivo /dev/input/eventX recém-criado. Aqui está um howto um tanto geral, não consegui encontrar um mais específico 1. Google para melhores tutoriais.

    
por 07.02.2017 / 10:22