Sua ideia de usar xbindkeys é boa:
no seu .xbindkeysrc
adicione um novo atalho:
"app_specific_keys.sh"
Control+s
Isso executará "app_specific_keys.sh"
quando você pressionar ctrl+s
.
Agora você precisa definir o script. Ele deve obter a janela ativa e, a partir disso, o nome do aplicativo que atualmente tem o foco:
xprop -id 'xdotool getactivewindow' |awk '/WM_CLASS/{print }'
Isso funcionaria: ele solicita xdotool para a janela ativa e, em seguida, solicita xprop para todas as propriedades da janela com o ID fornecido e, em seguida, reduz a saída muito detalhada ao nome do aplicativo (na verdade, sua classe). Se você rodar isso em um terminal gnome, você pegaria
"Gnome-terminal"
Agora você precisa definir ações para seus aplicativos:
if [ $N = '"Gnome-terminal"' ]; then
xdotool key --clearmodifiers ctrl+s
else
xdotool key --clearmodifiers ctrl+d
fi
Então, juntos, o script "app_specific_keys.sh"
poderia ser assim:
#!/bin/bash
W='xdotool getactivewindow'
S1='xprop -id ${W} |awk '/WM_CLASS/{print }''
S2='"Gnome-terminal"'
if [ $S1 = $S2 ]; then
xdotool key --clearmodifiers ctrl+d
else
xdotool key --clearmodifiers ctrl+s
fi
Este deve funcionar, mas como em essa questão , eu tenho que admitir que isso não acontece. Provavelmente porque uma das opções do Compiz, Unity, Global Menu não funciona bem com a opção --clearmodifiers
do xdotool. Uma solução alternativa seria adicionar um sono em frente ao seu script para que você mesmo possa liberar as chaves:
Em sua alteração de .xbindkeysrc
para essa associação de teclas:
"sleep 0.5; app_specific_keys.sh"
Control+s
Como um sidenote: isso não funcionará, se você quiser alterar as chaves para programas que são executados em um terminal (por exemplo, vi ou emacs no modo de console). A classe de aplicativo retornada ainda seria "Gnome-terminal".
Espero que ajude.