Como distinguir a entrada de diferentes teclados?

12

Eu quero escrever um aplicativo em Python que você possa usar com o teclado padrão e um especialmente projetado para o aplicativo. Eu vou projetá-lo simplesmente usando um pequeno teclado numérico com adesivos para dar ações às diferentes teclas. Ambos os teclados serão conectados por USB.

No entanto, quando estas teclas são pressionadas, apenas os seus sinais regulares (números, operadores e entradas) serão enviados para o Python e não serão capazes de distinguir entre os sinais do teclado principal e do teclado especial.

Como o Python tem (até onde eu pude encontrar) nenhum método para fazer essa distinção, eu quero fazê-lo no próprio sistema operacional. Eu vou programá-lo para o Raspberry Pi, então será o Linux.

Então, a questão principal: Como posso remapear as teclas de um teclado específico para outras codificações. Pensei em usar as teclas F que não usarei para outros fins; ou apenas alguns caracteres que não estão presentes em nenhum teclado (supondo que existam).

Isso é possível no Linux / Unix? E se sim, como posso fazer isso?

    
por Steven Roose 15.04.2013 / 15:24

2 respostas

8

Se você estiver usando o Linux, a melhor maneira de distinguir entre dispositivos de entrada é usar a Interface de eventos do Linux . Depois que a entrada específica do hardware de um dispositivo é decodificada, ela é convertida em uma estrutura de evento específica do Linux intermediária e disponibilizada pela leitura de um ou mais dispositivos de caracteres em /dev/input/ . Isto é completamente independente da linguagem de programação que você usa, a propósito.

Cada dispositivo de hardware recebe seu próprio /dev/input/eventX device e também há agregados (por exemplo, /dev/input/mice , que representa o movimento de todos os mouses no sistema). Seu sistema também pode ter /dev/input/by-path e /dev/input/by-id .

Há um ioctl chamado EVIOCGNAME , que retorna o nome do dispositivo como uma string legível humanamente, ou você pode usar algo como /dev/input/by-id/usb-Logitech_USB_Gaming_Mouse-mouse .

Você abre o dispositivo e toda vez que um evento chega do hardware de entrada, você obtém um pacote de dados. Se você pode ler C, você pode estudar o arquivo /usr/include/linux/input.h , que mostra exatamente como isso funciona. Se você não fizer isso, poderá ler esta pergunta , que fornece todas as informações necessárias .

A coisa boa sobre a interface de eventos é que você acabou de descobrir qual dispositivo você precisa, e você pode ler a entrada desse dispositivo de entrada somente , ignorando todos os outros. Você também receberá notificações sobre teclas, botões e controles que normalmente não usaria apenas lendo o fluxo de caracteres "cozido" de um terminal: até chaves mortas como Shift , etc.

O problema é que a interface do evento não retorna caracteres 'cozidos', apenas usa códigos numéricos para chaves (os códigos correspondentes a cada chave são encontrados no arquivo de cabeçalho mencionado anteriormente - mas também na fonte Python < a href="https://code.google.com/p/pycopia/source/browse/trunk/core/pycopia/OS/Linux/event.py"> event.py . Se o seu dispositivo de entrada tiver chaves / botões incomuns, você pode precisar experimentar um pouco até obter os números certos.

    
por 16.04.2013 / 00:41
3

Uma abordagem alternativa (se o seu "teclado" não tiver muitas chaves - muitos dispositivos fingem ser teclados) é aplicar um mapeamento de teclado especificamente para cada teclado e garantir que as teclas sejam diferenciadas.

Isso é descrito aqui: link . O ponto principal sendo o setxkbmap leva um argumento de dispositivo.

Se você estiver usando a abordagem de entrada bruta, o lsinput encontrará seu dispositivo bruto para você.

    
por 07.01.2017 / 05:10