
Utilizo más de una distribución de teclado y me gustaría encontrar una manera de ejecutar un script cuando cambio entre ellas.
es posible?
Hasta ahora, puedo asignar un atajo para un script como este:
#!/bin/bash
#switch between two layouts (English and Greek in this case)
current_layouts=$(gsettings get org.gnome.libgnomekbd.keyboard layouts)
if [ "$current_layouts" = "us" ]; then
gsettings set org.gnome.libgnomekbd.keyboard layouts "['gr']"
else
gsettings set org.gnome.libgnomekbd.keyboard layouts "['us']"
fi
exec /path/to/another/script
Pero al usar este método, solo puedo usar ese atajo para cambiar entre diseños y el indicador del teclado desaparecerá del menú de estado, lo cual es desagradable.
Respuesta1
dconf watch
se puede utilizar como receptor de eventos, por ejemplo (en Ubuntu 13.10/14.04):
dconf watch /org/gnome/desktop/input-sources/current | xargs -L 2 sh -c "echo kbd layout changed" &
Respuesta2
gsettings monitor org.gnome.desktop.input-sources mru-sources \
| xargs -L1 bash -c 'source /path/to/your/script.sh'
Respuesta3
Yo lo haría al revés, ejecutaría un script que cambie el diseño. De esa manera puedes hacer cualquier otra cosa que quieras con el mismo script. Desafortunadamente, es bastante difícil conocer la distribución actual del teclado. No he encontrado ningún enfoque que funcione paratodométodos de cambio de diseño. Por alguna razón, hay una diferencia si cambia con setxkbmap
o mediante los atajos de la GUI.
Entonces, mi solución es cambiar siempre usando setxkbmap
. Tengo un script que llama setxkbmap
y lo he vinculado a un acceso directo en mi entorno de escritorio para poder cambiar fácilmente. El siguiente ejemplo es para diseños griegos y estadounidenses; deberá modificarlo para que se ajuste a su configuración:
#!/usr/bin/env bash
key=`xmodmap -pke | grep -w "59" | awk '{print \$NF}'`
## If this is the "us" layout, that will return "less"
if [ $key == "less" ]; then
setxkbmap gr
## Add other things to be done here
else
setxkbmap us
## Add other things to be done here
fi