Как запустить скрипт при переключении раскладки клавиатуры?

Как запустить скрипт при переключении раскладки клавиатуры?

Я использую несколько раскладок клавиатуры и хотел бы найти способ запускать скрипт при переключении между ними.

Это возможно?

Пока что я могу назначить горячую клавишу для скрипта следующим образом:

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

Но при использовании этого метода я смогу переключаться между раскладками только с помощью этой комбинации клавиш, а индикатор клавиатуры исчезнет из меню состояния, что неприятно.

решение1

dconf watchможет использоваться как приемник событий, например (в Ubuntu 13.10/14.04):

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

решение2

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

решение3

Я бы сделал наоборот, запустил скрипт, который меняет раскладку. Таким образом, вы можете делать все, что захотите, с тем же скриптом. К сожалению, довольно сложно узнать вашу текущую раскладку клавиатуры. Я не нашел ни одного подхода, который бы работал длявсеМетоды переключения раскладки. По какой-то причине есть разница, переключаетесь ли вы с помощью setxkbmapили через сочетания клавиш GUI.

Итак, мой обходной путь — всегда переключаться с помощью setxkbmap. У меня есть скрипт, который вызывает , setxkbmapи я привязал этот скрипт к ярлыку в среде рабочего стола, чтобы я мог легко переключаться. Пример ниже для греческой и американской раскладок, вам придется изменить его в соответствии с вашей настройкой:

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

Связанный контент