¿Cómo ejecuto un script cuando cambio entre diseños de teclado?

¿Cómo ejecuto un script cuando cambio entre diseños de teclado?

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 watchse 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 setxkbmapo mediante los atajos de la GUI.

Entonces, mi solución es cambiar siempre usando setxkbmap. Tengo un script que llama setxkbmapy 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

información relacionada