Ваша ідея використання xbindkeys звучить добре:
у своєму .xbindkeysrc
додаванні додайте нове прив'язку клавіш:
"app_specific_keys.sh"
Control+s
Це буде виконано "app_specific_keys.sh"
при натисканні ctrl+s
.
Тепер потрібно визначити сценарій. Він повинен отримати активне вікно, а звідти назву програми, на яку зараз зосереджено фокус:
xprop -id `xdotool getactivewindow` |awk '/WM_CLASS/{print $4}'
Це зробить трюк: він запитує xdotool для активного вікна, потім запитує xprop для всіх властивостей вікна з заданим ідентифікатором, а потім зменшує самий багатослівний вихід до імені програми (власне її класу). Якщо запустити це в gnome-терміналі, ви отримаєте
"Gnome-terminal"
Тепер потрібно визначити дії для своїх додатків:
if [ $N = '"Gnome-terminal"' ]; then
xdotool key --clearmodifiers ctrl+s
else
xdotool key --clearmodifiers ctrl+d
fi
Отже разом сценарій "app_specific_keys.sh"
може виглядати так:
#!/bin/bash
W=`xdotool getactivewindow`
S1=`xprop -id ${W} |awk '/WM_CLASS/{print $4}'`
S2='"Gnome-terminal"'
if [ $S1 = $S2 ]; then
xdotool key --clearmodifiers ctrl+d
else
xdotool key --clearmodifiers ctrl+s
fi
Це має працювати, але як і в цьому питанні , я мушу визнати, що це не так. Можливо, тому, що один із Compiz, Unity, Global Menu не дуже добре працює з --clearmodifiers
опцією xdotool. Приблизним рішенням може бути додавання сну перед вашим сценарієм в одній формі, щоб мати можливість випустити ключі самостійно: .xbindkeysrc
Внесення змін до цього прив'язки клавіш:
"sleep 0.5; app_specific_keys.sh"
Control+s
Як сторонне позначення: це не спрацює, якщо ви хочете змінити клавіші для програм, які працюють у терміналі (наприклад, vi або emacs в консольному режимі). Повернений клас додатка все ще буде "Gnome-терміналом".
Сподіваюся, що це допомагає.