Réécrire les raccourcis clavier (accélérateurs) à partir de zéro
Dans mon billet fondateur Darktable : dans le mur au ralenti, j’ai présenté le désastre qu’a été le nouveau « grand turducken MIDI ». Le but de ce turducken1 était de réécrire le système de raccourcis clavier pour l’étendre aux périphériques MIDI.
À ce jour, je suis encore furieux contre cette entreprise de destruction massive. Voici un récapitulatif des raisons :
- il a remplacé en 2021 un système de raccourcis clavier qui était plutôt bon, complet, bien testé, stable et codé en moins de 1 500 lignes (commentaires compris),
- …pour ajouter la prise en charge des périphériques MIDI et des manettes PlayStation (!?!)…
- …mais dans mon enquête Darktable de 2022, un an après cette nouvelle fonctionnalité, sur 1 251 utilisateurs participants :
- 81 % des utilisateurs n’avaient pas de périphérique MIDI et n’en prévoyaient pas,
- 2 % ne savaient même pas ce qu’était un périphérique MIDI,
- 8 % des utilisateurs avaient un périphérique MIDI mais ne l’utilisaient pas avec Darktable,
- 6 % envisageaient peut-être d’acheter un périphérique MIDI à l’avenir,
- 2 % des utilisateurs avaient un périphérique MIDI qu’ils utilisaient réellement avec Darktable,
- le code était absolument terrible, en termes de :
- qualité de code : des instructions
if/switch-caseillisibles imbriquées sur 4 niveaux, au milieu de fonctions de 1 000 lignes (j’ai publié des extraits d’exemple dans mon article), - volume de code :
- 3 546 lignes de code pour Darktable 4.0,
- 4 397 lignes de code pour Darktable 5.0,
- l’augmentation du volume est une conséquence directe des tentatives de correction de bugs dans une architecture qu’on ne peut pas corriger parce que sa complexité produit davantage de complexité. Tout cela vient de la conception, mais résoudre des problèmes créés par la complexité en ajoutant encore plus de complexité n’est pas une solution.
- complexité du code :
- complexité cyclomatique :
- 1088 pour Darktable 4.0,
- 1245 pour Darktable 5.0 (détails ),
- complexité cognitive :
- 1885 pour Darktable 4.0,
- 2098 pour Darktable 5.0 (détails ).
- c’est de loin la fonctionnalité la plus complexe du logiciel, alors même qu’elle ne traite pas les images. À titre de comparaison, la deuxième fonctionnalité la plus complexe est le décodage des métadonnées EXIF, avec une complexité cognitive de 1348.
- complexité cyclomatique :
- qualité de code : des instructions
- il ne décode pas les modificateurs de touches par conception, mais ne traite que les frappes matérielles, ce qui signifie :
- que l’entrée « 1 » du pavé numérique est décodée en
Keypad End, - que l’entrée « 1 » d’un clavier AZERTY français est décodée en
Shift+&, ou enShift+"en BÉPO, - vous devez donc dupliquer tous vos raccourcis basés sur des chiffres pour chaque manière de saisir un nombre, et vous préparer à ce que la fenêtre de configuration des raccourcis ne contienne aucun chiffre réel dans les combinaisons de touches.
- que l’entrée « 1 » du pavé numérique est décodée en
- la conception côté utilisateur est absolument affreuse, avec beaucoup trop d’actions et d’émulations à configurer (« effets »), qui ne sont même pas entièrement documentées 4 ans plus tard (qu’est-ce que « ctrl-toggle » ? « right-activate » ?), et la configuration des raccourcis utilise une étrange fenêtre scindée qui n’a aucun sens,
- l’implémentation est elle aussi terrible : la fonctionnalité connaît toute l’interface graphique du logiciel, et l’interface graphique du logiciel connaît le code des raccourcis. Il n’y a ici aucune modularité, et modifier quoi que ce soit dans le code des raccourcis peut avoir des effets inattendus et indésirables partout dans le logiciel.2 Il suffit de voir le graphe de dépendances ci-dessous,
- plusieurs « raccourcis » (ou assignations MIDI) peuvent être attachés à une même action, ce qui signifie que chaque interaction utilisateur doit parcourir toute la liste des actions disponibles, entraînant une gestion des raccourcis très inefficace, des lags dans l’interface dans certains cas et des faux positifs « combinaison de touches inconnue » dans des cas particuliers.


Le graphe de dépendances de src/gui/accelerators.c (le grand turducken MIDI) avant la réécriture. Devinez pourquoi on appelle ça du « code spaghetti »… Cela montre clairement qu’il existe une dépendance dans les deux sens entre le code des accélérateurs et le reste du code de l’interface. C’est un cauchemar à maintenir.