Você pode tentar escrever uma regra do udev. Conecte seu teclado e digite lsusb
e anote sua ID de teclado, ela deve ser parecida com
Bus 001 Device 001: ID 13ab:001a name-of-the-keyboard
Nesse caso, o 13ab é o ID do fornecedor e o 001a é o ID do produto. Você pode desconectar seu teclado agora.
Vá para /etc/udev/rules.d/
e crie um novo arquivo, por exemplo, 80-keyboard.rules
e escreva em (substitua idVendor e idProduct neste exemplo pelo id do seu teclado):
SUBSYSTEM=="input", ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="13ab", ATTRS{idProduct}=="001a", RUN+="/path/to/connect/script"
SUBSYSTEM=="input", ACTION=="remove", SUBSYSTEMS=="usb", ATTRS{idVendor}=="13ab", ATTRS{idProduct}=="001a", RUN+="/path/to/disconnect/script"
Você não pode simplesmente usar o setxkbmap do udev porque ele não possui as variáveis de ambiente necessárias definidas. Esta parte é emprestada de este aswer .
Script de conexão:
#!/bin/sh
/path/to/set-keyboard-layout.sh uk
Script de desconexão:
#!/bin/sh
/path/to/set-keyboard-layout.sh us
set-keyboard-layout.sh
#!/bin/sh
sleep 1
DISPLAY=":0.0"
HOME=/home/your-username
XAUTHORITY=$HOME/.Xauthority
export DISPLAY XAUTHORITY HOME
setxkbmap -layout
Não esqueça de fazer chmod + x nos três scripts e mude o / home / seu-nome de usuário para o caminho da sua pasta pessoal.
Agora execute sudo service udev restart
e conecte seu teclado e veja se o layout muda na conexão / desconexão.
Eu testei isso com meu hdd usb e ele funciona (exceto que eu tinha bloco em vez de entrada para subsistema).