Encontré una manera de evitar esto, aunque es un poco complicado.
Hoy llegué exactamente al mismo punto al intentar configurar dos teclados con udev, setxkbmap y xinput --list y que funcionen con conexión en caliente USB. Estoy cambiando las teclas, no cambiando el diseño, pero es lo mismo, una vez que haya identificado su teclado en un hotplug y pueda llamar condicionalmente a setxkbmap, entonces debería poder configurar el idioma solo del teclado que ha especificado . La lista de diseños de teclado se puede encontrar aquí ls -l /usr/share/kbd/keymaps/i386/
y puede encontrar el nombre de su dispositivo para continuar con xinput -list
.
- Querrá reemplazar
rizumu
con su nombre de usuario, ya que descubrí que no era posible hacer esto sin ser explícito. - Asegúrate de hacer grep en el
your
nombre del teclado. - Usar
lsusb
para descubrir el ID de hardware que necesita configurar en la regla udev. Mi teclado das se ve asíBus 002 Device 009: ID 04d9:2013 Holtek Semiconductor, Inc.
Primero configuré la regla udev para detectar automáticamente el teclado creando una regla udev:
En el archivo /etc/udev/rules.d/00-usb-keyboards.rules
:
ACTION=="add", ATTRS{idVendor}=="04d9", ATTRS{idProduct}=="2013", RUN+="/home/rizumu/bin/kbd_udev", OWNER="rizumu"
Tengo dos archivos ~/bin/kbd y ~/bin/kbd_udev. Asegúrate de que tengan los permisos correctos chmod 755 ~/bin/kbd*
El ~/bin/kbd_udev
el guión contiene:
#!/bin/bash
/home/rizumu/bin/kbd &
Y notarás que todo lo que hace es llamar a ~/bin/kbd
en segundo plano, para que udev pueda completar su proceso y activar el teclado. Dentro del ~/bin/kbd
script dormimos por un segundo, porque necesitamos esperar hasta que el teclado se active para que podamos obtener la identificación del dispositivo usando xinput. Para lograr esto, configuré algunas variables y las exporté para que xinput setxkbmap pueda hacer su trabajo:DISPLAY
, XAUTHORITY
, HOME
, y uno daskb_id
para la identificación de mi daskeyboard:
#!/bin/bash
sleep 1
DISPLAY=":0.0"
HOME=/home/rizumu/
XAUTHORITY=$HOME/.Xauthority
export DISPLAY XAUTHORITY HOME
daskb_id=`xinput -list | grep -i 'daskeyboard' | grep -o id=[0-9]. | grep -o [0-9]. | head -1`
xset r rate 200 30
setxkbmap -layout colemak
setxkbmap -option ctrl:nocaps
if [ "${daskb_id}" ]; then
setxkbmap -device "${daskb_id}" -option altwin:swap_lalt_lwin
fi
Dependiendo de su distribución, es posible que ya tenga una regla udev para teclados en /lib/udev/rules.d/64-xorg-xkb.rules. En Ubuntu, esto importa /etc/default/keyboard, que tiene opciones más o menos así:
XKBMODEL="pc105"
XKBLAYOUT="us"
XKBVARIANT=""
XKBOPTIONS=""
Para mi configuración, descubrí que esta regla integrada se ejecutaba después de mi regla udev personalizada y anulaba mi configuración. En cambio, cambié XKBOPTIONS en /etc/default/keyboard para que sea:
XKBOPTIONS="-option ctrl:nocaps"
Para obtener el comportamiento "Bloqueo de mayúsculas es control" que quería en todos los teclados.
Si está ejecutando GNOME, deberá deshabilitar su complemento de administración de teclado para que no anule los cambios de diseño.
gconftool-2 --toggle /apps/gnome_settings_daemon/plugins/keyboard/active
Vuelva a ejecutar el mismo comando para habilitarlo como desee.