La tua idea di usare xbindkeys suona bene:
nel tuo .xbindkeysrc
aggiungi un nuovo keybinding:
"app_specific_keys.sh"
Control+s
Questo verrà eseguito "app_specific_keys.sh"
quando si preme ctrl+s
.
Ora devi definire lo script. Dovrebbe ottenere la finestra attiva e da ciò il nome dell'app che attualmente ha lo stato attivo:
xprop -id `xdotool getactivewindow` |awk '/WM_CLASS/{print $4}'
Questo farebbe il trucco: chiede a xdotool la finestra attiva, quindi chiede a xprop tutte le proprietà della finestra con l'id specificato, quindi riduce l'output molto dettagliato al nome dell'applicazione (in realtà la sua classe). Se lo esegui in un terminale gnomo, otterrai
"Gnome-terminal"
Ora devi definire le azioni per le tue applicazioni:
if [ $N = '"Gnome-terminal"' ]; then
xdotool key --clearmodifiers ctrl+s
else
xdotool key --clearmodifiers ctrl+d
fi
Quindi insieme, la sceneggiatura "app_specific_keys.sh"
potrebbe apparire così:
#!/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
Questo dovrebbe funzionare, ma come in questa domanda , devo ammettere che non lo fa. Probabilmente perché uno di Compiz, Unity, Global Menu non funziona bene con l' --clearmodifiers
opzione di xdotool. Una soluzione alternativa sarebbe quella di aggiungere uno sleep davanti allo script in modo da poter rilasciare le chiavi tu stesso: Nella tua .xbindkeysrc
modifica a questo keybinding:
"sleep 0.5; app_specific_keys.sh"
Control+s
Come sidenote: questo non funzionerà, se si desidera cambiare le chiavi per i programmi che girano in un terminale (es. Vi o emacs in modalità console). La classe di applicazione restituita sarebbe comunque "Gnome-terminal".
Spero possa aiutare.