Remappage des combinaisons de touches spécifiques à l'application?

18

Je connais un certain nombre de façons de remapper des combinaisons de touches dans Ubuntu sur une base globale (par exemple, remapper globalement Ctrl + S pour envoyer Ctrl + D ou quelque chose), comme l' application xbindkeys . Ce dont j'ai besoin, cependant, c'est d'un moyen de le faire uniquement pour une application spécifique . Par exemple, quelque chose comme "Remapper Ctrl + S pour envoyer Ctrl + D, mais uniquement dans Chrome ". Existe-t-il un moyen d'y parvenir?

Derek Thurn
la source
Avez-vous lu ce fil ? Je ne l'ai pas essayé, mais il me semble que c'est exactement ce que vous recherchez. Cependant, je ne sais pas comment écrire une bonne réponse.
lumbric

Réponses:

12

Votre idée d'utiliser xbindkeys sonne bien:

dans votre .xbindkeysrcajout d'une nouvelle liaison de touches:

"app_specific_keys.sh"
   Control+s

Cela s'exécutera "app_specific_keys.sh"lorsque vous appuyez sur ctrl+s.

Vous devez maintenant définir le script. Il devrait obtenir la fenêtre active et de là le nom de l'application qui a actuellement le focus:

xprop -id `xdotool getactivewindow` |awk '/WM_CLASS/{print $4}'

Cela ferait l'affaire: il demande à xdotool la fenêtre active, puis à xprop toutes les propriétés de la fenêtre avec l'id donné, puis réduit la sortie très verbeuse au nom de l'application (en fait sa classe). Si vous exécutez ceci dans un gnome-terminal, vous obtiendrez

"Gnome-terminal"

Vous devez maintenant définir des actions pour vos applications:

if [ $N = '"Gnome-terminal"' ]; then                                                    
    xdotool key --clearmodifiers ctrl+s                                                          
else                                                                            
    xdotool key --clearmodifiers ctrl+d                                                          
fi  

Donc, ensemble, le script "app_specific_keys.sh"pourrait ressembler à ceci:

#!/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  

Cela devrait fonctionner, mais comme dans cette question , je dois admettre que non. Probablement parce que l'un de Compiz, Unity, Global Menu ne fonctionne pas bien avec l' --clearmodifiersoption de xdotool. Une solution de contournement consisterait à ajouter un sommeil devant votre script afin de pouvoir libérer les clés vous-même: Dans votre .xbindkeysrcmodification de ce raccourci clavier:

"sleep 0.5; app_specific_keys.sh"
   Control+s

En guise de note: cela ne fonctionnera pas, si vous voulez changer les clés des programmes qui s'exécutent dans un terminal (par exemple vi ou emacs en mode console). La classe d'application retournée serait toujours "Gnome-terminal".

J'espère que cela pourra aider.

xubuntix
la source
1
Cela a fini par fonctionner très bien. Je n'ai pas utilisé xdotool pour envoyer les frappes, je viens de l'utiliser xvkbd -xsendevent -text "\Cs". Cela ne semble pas souffrir des problèmes que vous rencontriez avec xdotool.
Derek Thurn
il n'est pas possible de faire un appel clé lui-même, comme fappeler xdotool key f. Toujours à la recherche d'un moyen de le faire.
phil294
ha, enfin trouvé un! xdotool type --window $(xdotool getwindowfocus) [keys] l'utilisation de l'option --window et l'envoi dans la fenêtre actuellement active NE mèneront PAS à un comportement récursif.
phil294
2

autokey est comme AutoHotkey pour Ubuntu. Vous pouvez écrire des scripts en python et les exécuter via un raccourci clavier et un filtre Windows (ce qui le rend spécifique à la pseudo-application). Votre script peut contrôler les événements du clavier et de la souris et même déplacer les fenêtres comme touche supplémentaire.

aramadia
la source
autokeyest bien plus rapide que xbindkeys, même avec le mode de détection de fenêtre activé - une action immédiate est prise. Inconvénient: les affectations des boutons de la souris semblent ne pas fonctionner (je pense que c'est un bug)
phil294