UPDATE-полностью рабочий скрипт, расположенный в нижней части моего ответа для тех, кто не заинтересован в процессе получения там.
Я пытался написать сценарий 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.*//p'
)
[ "$proteus_id" ] || exit
tartarus_id=$(
xinput list |
sed -n 's/.*Tartarus.*id=([0-9]*).*keyboard.*//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 ; exit;}'` |nawk -F = '/WM_CLASS/ {N=split(, 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.*)"/+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 не мог очистить 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.*//p'
)
[ "$tartarus_id" ] || exit
# Remap Razer Tartarus to selected profile
setxkbmap -device $tartarus_id -print |
sed 's/(xkb_symbols.*)"/+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, которые должны вызывать это), а второй щелчок дает ожидаемое"f". После того, как G7 становится моим ключом "f", xkb вызывается, и мой тартар также переключается на значение по умолчанию. Это, как правило, не позволяет xkb переключаться обратно на профиль Dwarf Fortress, когда это необходимо, даже когда открыто окно терминала.
любая помощь очень была бы оценена, и я могу обеспечить больше информации если необходимый.