Después de jugar mucho, esto es lo que tengo corriendo por ahora. Tal vez escriba un artículo completo y publique el código dentro de un repositorio, si eso fuera de interés.
Configure un nuevo conjunto de reglas para udev así:
sudo gedit /etc/udev/rules.d/80-external-keyboard.rules
Se supone que la regla llama a un script de shell cada vez que un dispositivo activa alguna acción con la combinación dada de proveedor e ID de producto.
ATTRS{idVendor}=="04b4", ATTRS{idProduct}=="4042", RUN+="/home/phil/.bin/switch-kb-layout-wrapper.sh"
Después de agregar el nuevo conjunto de reglas, reinicie el servicio udev:
sudo service udev restart
Nota: No pude lograr resultados confiables al proporcionar reglas de coincidencia más específicas en ese archivo. Lo más significativo es que agregar una ACTION
regla coincidente no funcionó. Por lo que puedo decir, el script se activó de todos modos. Al agregar ACTION=="add"
, la secuencia de comandos aún se invocaría al quitar el dispositivo. Muy extraño y confuso.
Sin embargo, la acción que activó la regla udev estará disponible para el script llamado como se muestra a continuación.
A continuación, el guión en sí. Bueno, no del todo. Tenga wrapper
en cuenta el sufijo en el nombre del archivo. Esto indica que este no es el script real sino un contenedor que llama al script y lo ejecuta en segundo plano para que udev pueda finalizar su proceso.
~/.bin/switch-kb-layout-wrapper.sh
:
#!/bin/sh
/home/phil/.bin/switch-kb-layout.sh "${ACTION}" &
La variable ACTION
contiene la acción udev que fue activada por el dispositivo. Produce valores como add
(se conectó el dispositivo) y remove
(se retiró el dispositivo). Los usaremos más adelante.
~/.bin/switch-kb-layout.sh
:
#!/bin/sh
sleep 1
# Some environment variables that need to be set in order to run `setxkbmap`
DISPLAY=":0.0"
HOME=/home/phil
XAUTHORITY=$HOME/.Xauthority
export DISPLAY XAUTHORITY HOME
udev_action=$1
log_file="$HOME/switch-kb-layout.log"
if [ "${udev_action}" != "add" ] && [ "${udev_action}" != "remove" ]; then
echo "Other action. Aborting." >> $log_file
exit 1
fi
internal_kb_layout="de"
internal_kb_variant=""
external_kb_layout="us"
external_kb_variant="altgr-intl"
kb_layout=""
kb_variant=""
if [ "${udev_action}" = "add" ]; then
kb_layout=$external_kb_layout
kb_variant=$external_kb_variant
elif [ "${udev_action}" = "remove" ]; then
kb_layout=$internal_kb_layout
kb_variant=$internal_kb_variant
fi
setxkbmap -layout "${kb_layout}"
echo "set layout:" "$kb_layout" >> $log_file
if [ ! -z "${kb_variant}" ]; then
setxkbmap -variant "${kb_variant}"
echo "set variant:" "$kb_variant" >> $log_file
fi
Reemplace mi nombre de usuario con el suyo al configurar la HOME
variable ( $(whoami)
no funcionará aquí, ya que no será invocado por su usuario sino por root
).
sed -i "s/phil/YOUR_USERNAME/g" ~/.bin/switch-kb-layout.sh
Para fines de prueba, agregué algunas líneas que registran ciertos eventos en un archivo en mi directorio de inicio para ver si todo funciona. Puede guardarlos con seguridad.
Finalmente, estos scripts deben tener permisos de ejecución. También puede ser importante tener en cuenta que estos scripts serán llamados por el root
usuario, así que tenga cuidado con lo que hace allí.
chmod +x ~/.bin/switch-kb-layout-wrapper.sh ~/.bin/switch-kb-layout.sh