ОБНОВЛЕНИЕ - Полностью рабочий скрипт, расположенный в нижней части моего ответа для тех, кто не заинтересован в процессе получения там.
Я пытался написать bash-скрипт, который использует xbindkeys, xkb и xinput set-button-map для автоматического изменения раскладок моей клавиатуры Razer Tartarus и мыши Logitech G502 Proteus на основе текущего активного окна. Я решил сделать это, имея скрипт, постоянно работающий в фоновом режиме в бесконечном цикле, который проверяет, отличается ли активное окно от последней проверки. Я видел, как другие предлагали, чтобы ваш .xbindkeysrc запускал свой скрипт для каждой комбинации клавиш / клавиш, который проверяет активное окно, прежде чем решить, какую команду отправлять, но с помощью 13-кнопочной мыши и 21-кнопочной клавиатуры номер необходимых скриптов быстро выйдет из-под контроля, особенно когда я начну добавлять комбинации.
autoProfileSwitch:
#!/bin/bash
Last=""
proteus_id=$(
xinput list |
sed -n 's/.*G502.*id=\([0-9]*\).*pointer.*/\1/p'
)
[ "$proteus_id" ] || exit
tartarus_id=$(
xinput list |
sed -n 's/.*Tartarus.*id=\([0-9]*\).*keyboard.*/\1/p'
)
[ "$tartarus_id" ] || exit
tartarus_profile="default"
proteus_profile="1 2 3 4 5 6 7 8 9 10 11 12 13"
xbindkeys_profile=".xbindkeysrc"
while true; do
Class=`xprop -id \`xprop -root |nawk '/_NET_ACTIVE_WINDOW/ {print $5; exit;}'\` |nawk -F = '/WM_CLASS/ {N=split($2, A, ", "); gsub(/\"/,"",A[2]); print A[2]; exit;}'`
if [ "$Class" != "$Last" ]
then
case $Class in
"Dwarf_Fortress")
tartarus_profile="dwarfFortress"
proteus_profile="1 3 2 4 5 6 7 8 9 10 11 12 13"
xbindkeys_profile="dwarfFortress";;
"Firefox")
tartarus_profile="default"
proteus_profile="1 2 3 4 5 6 7 8 9 10 11 12 13"
xbindkeys_profile=".xbindkeysrc";;
"")
tartarus_profile="default"
proteus_profile="1 2 3 4 5 6 7 8 9 10 11 12 13"
xbindkeys_profile=".xbindkeysrc";;
*)
tartarus_profile="default"
proteus_profile="1 2 3 4 5 6 7 8 9 10 11 12 13"
xbindkeys_profile=".xbindkeysrc";;
esac
if pgrep -x "xbindkeys" > /dev/null
then
killall xbindkeys
fi
xbindkeys -f $HOME/xbindkeys\ profiles/$xbindkeys_profile
tartarusProfile -p $tartarus_profile
#setxkbmap -device $tartarus_id -print |
#sed 's/\(xkb_symbols.*\)"/\1+tartarus('$tartarus_profile')"/' |
#xkbcomp -I$HOME/xbindkeys\ profiles/xkb -i $tartarus_id -synch -$DISPLAY 2>/dev/null
for i in $proteus_id
do
xinput set-button-map $i $proteus_profile
done
Last="$Class"
fi
done
Я пытался переместить содержимое моего скрипта tartarusProfile в скрипт autoProfileSwitch (причина неиспользуемой переменной tartarus_id и закомментированных строк непосредственно под вызовом tartarusProfile), но продолжал получать ошибку «sed not flush stdout: Broken pipe» по какой-то причине. Код работает нормально, когда в своем собственном скрипте
tartarusProfile:
#!/bin/bash
# Set profile variable to argument (or default if none)
PROFILE="default"
while getopts p: option; do
case "$option" in
p) PROFILE=$OPTARG;;
esac
done
# Get xinput device id for Razer Tartarus
tartarus_id=$(
xinput list |
sed -n 's/.*Tartarus.*id=\([0-9]*\).*keyboard.*/\1/p'
)
[ "$tartarus_id" ] || exit
# Remap Razer Tartarus to selected profile
setxkbmap -device $tartarus_id -print |
sed 's/\(xkb_symbols.*\)"/\1+tartarus('$PROFILE')"/' |
xkbcomp -I$HOME/xbindkeys\ profiles/xkb -i $tartarus_id -synch - $DISPLAY 2>/dev/null
Эти сценарии в основном работают как задумано, но происходят некоторые странные вещи, которые я не могу изолировать. Для начала: кажется, что вызовы xkb происходят только в том случае, если окно терминала открыто и не свернуто (или в еще одном случае, который я опишу позже), даже когда я запускаю скрипт с «autoProfileSwitch &»; xbindkeys и xinput вызываются независимо от того, открыто ли окно терминала.
Другая проблема заключается в том, что клавиша "Tab" иногда привязывается к моей правой кнопке мыши (в дополнение к предполагаемому обмену MMB и RMB) при переключении на мои профили Dwarf Fortress, несмотря на то, что в профиле xbindkeys нет ничего, что могло бы вызвать это.
И наконец: даже если xbindkeys не требует, чтобы окно терминала было открыто, происходит нечто странное, когда я перехожу из Dwarf Fortress в другое окно, когда оно закрыто. Прямо сейчас я по умолчанию привязываю кнопку G7 моей мыши к клавише "f", чтобы обеспечить быстрый полноэкранный режим на видео, но когда я переключаюсь с Dwarf Fortress на другое окно, первый щелчок G7 дает "s" (ничего в xbindkeys это должно быть причиной этого), и второй щелчок дает ожидаемое "е". После того, как G7 становится моей клавишей "f", вызывается xkb, и мой тартар также переключается на значение по умолчанию. Это, как правило, не позволяет xkb переключаться обратно на профиль Dwarf Fortress, даже когда окно терминала открыто.
Любая помощь будет высоко ценится, и я могу предоставить больше информации, если это необходимо.