Intro, pourquoi ? diverses ressources sur les raccourcis clavier de starcraft 2
Je joue à Starcraft II (SC II) à mes heures perdues. Je suis tombé sur pas mal de ressources sur l'optimisation de raccourcis clavier il y a quelques mois. En tant que bépoète, ça m'a pas mal intéressé. Il est possible dans SCII de régler les raccourcis clavier de façon assez souple. Tout ce que j'ai collecté est là :
https://wiki.archlinux.org/index.php/StarCraft_2#Hints_for_advanced_hotkeys_settings
Des gens ont planché sur des raccourcis clavier ergonomiques pour SCII (
https://wiki.archlinux.org/index.php/StarCraft_2#Preliminary). La démarche du projet
TheCore est hyper intéressante : il s'agit de mettre toutes les touches sous une seule main en minimisant les mouvements à faire (ça vous dit quelque chose ?). Dans leur approche, ils contournent les rangées décalées en penchant les claviers ! J'ai un peu essayé mais c'est tout de même le bordel. Il existe des projets plus conventionnels sans clavier penché.
J'ai adapté/amélioré
TheCore lite. L'idée de cette approche est d'avoir :
– les actions sous les doigts forts (index/majeur), avec des places standards
– une touche « intelligente » pour faire l'action la + commune : la touche « espace » sous le pousse
– les groupes et vues utilisant les mêmes touches (annulaire, auriculaire) mais en exploitant les modifieurs de façon astucieuse
– de permettre le « rapid fire » facilement (c'est commun à tous ces arrangements de hotkeys)
Qu'est-ce que le « rapid fire » ?
Il s'agit d'enchainer les actions en gardant une touche appuyée. La touche est utilisée à la fois pour déclencher l'action, et déclencher un clic à l'emplacement de la souris (une fois dans le contexte « action »). En gardant la touche enfoncée on enchaîne alors des cycles action->sélection, ce qui permet de faire pas mal d'actions rapidement.
http://www.teamliquid.net/forum/sc2-strategy/446530-rapid-fire-hotkey-trick
On distingue 2 types de « rapid fire » :
– simple touche, possible par défaut sous Linux, il est possible de diminuer le délai avant activation de l'autorepeat, et d'augmenter le nombre de répétitions avec cette commande
xset r rate <delai (ms> <nb_réptitions_par_secondes>
– double touche, impossible avec la gestion du clavier de X.
Le rapid « double touche » est assez énorme. Par exemple on a ça :
https://youtu.be/pIbo94IWeu8. Ça a été découvert avec certains claviers sous Windows qui ont un comportement étrange : en maintenant 2 touches enfoncées (pour l'exemple « J » et « K ») on peut obtenir cette série :
jkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjkjk
Dans mon cas j'obtiens :
jkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
Du coup je ne pas l'utiliser.
Mes essais
J'ai fait des essais avec mon window manager pour intercepter une saisie clavier et la remplacer par 2 caractères. Hier j'ai bossé sur un début de script à base de xev et de xprop. Le soucis de ces approches c'est que ça viole les conditions d'utilisation de Blizzard : toute utilisation de logiciel tiers est considéré comme de la triche, pour prévenir l'utilisation de macro ou autre. Est autoriser tout ce que les pilotes de clavier/souris permettent de faire.
Du coup je me suis mis en quête de trouver là où ça se passe dans X… et de voir si le comportement du pilote peut être modifié.
Avec xev, je me suis rendu compte qu'il a des évènements de KeyPress KeyRelease. Mon idée serait de permettre d'avoir un autorepeat ayant ce comportement :
– quand une touche est maintenue pressée, l'ajouter à un motif à répéter
– sortir la touche du motif à répéter avec relachement de la touche
Il serait facile de définir l'ordre du motif (pour le jeu il ne faudrait pas faire n'importe quoi non plus 😉). Celà autoriserait théoriquement l'enchaînement d'autant touches que l'on souhaite. Et ce serait fait au niveau du pilote.
Là où je bloque
Je suis plutôt une bille en C, je n'ai jamais vraiment fait ça et le projet xorg est un sacré sac de nœuds. Pour le moment je fais tout au feeling en téléchargeant les sources ou regardant les headers de bibliothèque à grand coup de grep. J'ai essayé de remonter en analysant le code de la commande "xset" où on trouve une fonction "xkbset_autorepeat"
#ifdef XKB
static void
xkbset_repeatrate(Display *dpy, int delay, int interval)
{
XkbDescPtr xkb = XkbAllocKeyboard();
if (!xkb)
return;
XkbGetControls(dpy, XkbRepeatKeysMask, xkb);
xkb->ctrls->repeat_delay = delay;
xkb->ctrls->repeat_interval = interval;
XkbSetControls(dpy, XkbRepeatKeysMask, xkb);
XkbFreeKeyboard(xkb, 0, True);
}
#endif
$ grep -i modified xset.c
/* Modified by Stephen so keyboard rate is set using XKB extensions */
Les fonctions ont l'air d'être déclarées dans /usr/include/X11/XKBlib.h En remontant le code, si j'ai bien compris, j'ai essentiellement vu comment XKB stockait des paramètres, et les rendait accessibles. J'ai tenté d'autres pistes infructueuses aussi. Ceci-dit je me suis focalisé sur XkbGetControls et XkbSetControls, il faudrait que je retente en remontant par XkbFreeKeyboard.
Dans tous les cas, je me disais que les hackers de clavier de la communauté BÉPO pourraient être intéressés par ces trucs de SCII et ma tentative. Et pourraient peut-être même me filer un coup de main. On va voir dans les commentaires si ça intéresse certains d'entre vous.
Édition: maintenant on voit tout le code de la fonction "xkbset_autorepeat"
Édition bis: correction des fautes de Français…