Como executo um script quando alterno entre layouts de teclado

Como executo um script quando alterno entre layouts de teclado

Eu uso mais de um layout de teclado e gostaria de encontrar uma maneira de executar um script quando alterno entre eles.

Isso é possível?

Até agora, posso atribuir um atalho para um 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

Mas usando esse método, posso usar apenas esse atalho para alternar entre os layouts e o indicador do teclado desaparecerá do menu de status, o que é desagradável.

Responder1

dconf watchpode ser usado como receptor de eventos, exemplo (no Ubuntu 13.10/14.04):

dconf watch /org/gnome/desktop/input-sources/current | xargs -L 2 sh -c "echo kbd layout changed" &

Responder2

gsettings monitor org.gnome.desktop.input-sources mru-sources \
        | xargs -L1 bash -c 'source /path/to/your/script.sh'

Responder3

Eu faria o contrário, executaria um script que alterasse o layout. Dessa forma, você pode fazer o que quiser com o mesmo script. Infelizmente, é muito difícil descobrir o layout atual do teclado. Não encontrei nenhuma abordagem que funcione paratodosmétodos de mudança de layout. Por algum motivo, há uma diferença se você alternar com setxkbmapou por meio dos atalhos da GUI.

Então, minha solução é sempre mudar usando setxkbmap. Eu tenho um script que chama setxkbmape vinculei esse script a um atalho no meu ambiente de área de trabalho para poder alternar facilmente. O exemplo abaixo é para layouts grego e americano. Você terá que modificá-lo para se adequar à sua configuração:

#!/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

informação relacionada