Neste artigo vou te dar dicas de como persistir mapeamentos de teclas para teclados USB no Linux quando desconectados e reconectados.

Ontem pela manhã eu passei 02 horas entre pesquisa e solução deste problema bem irritante que já me importunava há algum tempo. Possuo um mini teclado marca Holtek que possui a tecla “/” em uma posição não convencional e que necessita da combinação das teclas Alt-Gr + “;” para funcionar.

 Mini Teclado Holtek

Originalmente essa combinação não funciona no Caixa Mágica – distro baseada em Ubuntu e que eu uso no meu Vostro 5470 – e por isso, tive que fazer um mapeamento desta tecla utilizando o xmodmap.

O meu arquivo .Xmodmap ficou assim:

keycode 133 = backslash bar
keycode 61 = semicolon colon slash slash slash

Isso resolveu o problema original do teclado e a tecla passou a funcionar normalmente, porém após desconectar o teclado e reconectá-lo, essa tecla não funcionava porque o xmodmap roda somente no momento de login, sendo assim eu precisava rodar o comando “xmodmap .Xmodmap” para que essa tecla funcionasse novamente durante a sessão. Isso foi me irritando e ontem decidi ligar o modo fuçador (modeset FUÇADOR=ON) e resolver isso de uma vez.

A primeira coisa que eu descobri é que a melhor forma de resolver isso é utilizando os recursos do udev. Com esse direcionamento, foi questão de testes até encontrar a solução definitiva, vamos lá.

A primeira informação que você precisa é saber o ID do fabricante e do modelo do seu teclado USB. Com o teclado conectado, descubra isso com o comando lsusb.
No meu caso a saída desse comando é essa:

Bus 001 Device 002: ID 8087:8000 Intel Corp.
Bus 002 Device 006: ID 045e:00cb Microsoft Corp. Basic Optical Mouse v2.0
Bus 002 Device 034: ID 04d9:1605 Holtek Semiconductor, Inc.
Bus 002 Device 002: ID 138a:0011 Validity Sensors, Inc. VFS5011 Fingerprint Reader
Bus 002 Device 003: ID 5986:0523 Acer, Inc
Bus 002 Device 004: ID 8087:07dc Intel Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub

O ID do fabricante do meu teclado é 04d9 e o ID do modelo do teclado é 1605. Munido destas informações, criei uma regra no diretório de regras do udev, que fica em “/etc/udev/rules.d”.
Criei também um arquivo com a extensão “.rules” e para este caso, pouco importa o nome do arquivo. No meu caso este arquivo se chama “keyboard-xmodmap.rules” e possui o seguinte conteúdo:

ATTRS{idVendor}=="04d9", ATTRS{idProduct}=="1605", RUN+="/home/telles/teclado.sh", OWNER="telles"

Substitua “telles” pelo seu nome de usuário no Linux.

Foi necessário criar um script que vair rodar alguns comandos, no meu caso este script se chama “teclado.sh” e fica no meu diretório HOME. Este script tem o seguinte conteúdo:

#!/bin/bash
sleep 1
DISPLAY=:0.0
HOME=/home/telles
XAUTHORITY=$HOME/.Xauthority
export DISPLAY XAUTHORITY HOME
xmodmap $HOME/.Xmodmap

Novamente substitua “telles” pelo seu nome de usuário no Linux.

Altere as permissões desse script para 755:

chmod 755 teclado.sh

Coloquei o udev para funcionar em modo debug com o comando abaixo:

udevadm control –log-priority=debug

Monitore o arquivo de log “/var/log/syslog” e desconecte e reconecte o teclado USB. Deverá ver algo assim no final do log:

Oct 22 12:29:56 Vostro-5470 udevd[7207]: starting '/home/telles/teclado.sh'
Oct 22 12:29:57 Vostro-5470 udevd[7199]: '/home/telles/teclado.sh' [7200] exit with return code 0
Oct 22 12:29:57 Vostro-5470 udevd[7199]: passed -1 bytes to netlink monitor 0xb8e94510
Oct 22 12:29:57 Vostro-5470 udevd[7199]: seq 2933 processed with 0
Oct 22 12:29:57 Vostro-5470 udevd[459]: seq 2933 done with 0

Se você seguiu todos os passos até aqui, agora terá também seus mapeamentos de teclas para seu teclado USB funcionando quando reconectá-lo :-)
Se algo não funcionou, observe por erros no arquivo de log “/var/log/syslog”.

Ainda tem dúvidas? Deixe seu comentário logo abaixo.

Forte abraço e até semana que vem!

Comentários

comentários