<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Utilisabilité on Ansel</title><link>https://ansel.photos/fr/tags/utilisabilite/</link><description>Recent content in Utilisabilité on Ansel</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>© Copyright 2022-2025 – Aurélien Pierre</copyright><lastBuildDate>Sun, 01 Jun 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://ansel.photos/fr/tags/utilisabilite/index.xml" rel="self" type="application/rss+xml"/><item><title>Réécrire les raccourcis clavier (accélérateurs) à partir de zéro</title><link>https://ansel.photos/fr/news/rewriting-key-shortcuts/</link><pubDate>Sun, 01 Jun 2025 00:00:00 +0000</pubDate><updated>Sun, 01 Jun 2025 00:00:00 +0000</updated><guid>c44b3484fb24ed968d2e95921bed22cc0556fd27feb8a56ef7340e8a9c7a6783</guid><description>&lt;p>Dans mon billet fondateur
&lt;a href="https://ansel.photos/fr/news/darktable-dans-le-mur-au-ralenti/" title="" rel="dofollow" >&lt;em>Darktable : dans le mur au ralenti&lt;/em>&lt;/a>, j&amp;rsquo;ai présenté le désastre qu&amp;rsquo;a été le nouveau « grand turducken MIDI ». Le but de ce turducken&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> était de réécrire le système de raccourcis clavier pour l&amp;rsquo;étendre aux périphériques MIDI.&lt;/p>
&lt;p>À ce jour, je suis encore furieux contre cette entreprise de destruction massive. Voici un récapitulatif des raisons :&lt;/p>
&lt;ol>
&lt;li>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 &lt;strong>1 500 lignes&lt;/strong> (commentaires compris),&lt;/li>
&lt;li>…pour ajouter la prise en charge des périphériques MIDI et des manettes PlayStation (!?!)…&lt;/li>
&lt;li>…mais dans mon enquête Darktable de 2022, un an après cette nouvelle fonctionnalité, sur 1 251 utilisateurs participants :
&lt;ul>
&lt;li>81 % des utilisateurs n&amp;rsquo;avaient pas de périphérique MIDI et n&amp;rsquo;en prévoyaient pas,&lt;/li>
&lt;li>2 % ne savaient même pas ce qu&amp;rsquo;était un périphérique MIDI,&lt;/li>
&lt;li>8 % des utilisateurs avaient un périphérique MIDI mais ne l&amp;rsquo;utilisaient pas avec Darktable,&lt;/li>
&lt;li>6 % envisageaient &lt;em>peut-être&lt;/em> d&amp;rsquo;acheter un périphérique MIDI à l&amp;rsquo;avenir,&lt;/li>
&lt;li>&lt;strong>2 % des utilisateurs avaient un périphérique MIDI qu&amp;rsquo;ils utilisaient réellement avec Darktable&lt;/strong>,&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>le code était absolument terrible, en termes de :
&lt;ul>
&lt;li>qualité de code : des instructions &lt;code>if&lt;/code>/&lt;code>switch-case&lt;/code> illisibles imbriquées sur 4 niveaux, au milieu de fonctions de 1 000 lignes (j&amp;rsquo;ai publié des extraits d&amp;rsquo;exemple dans mon
&lt;a href="https://ansel.photos/fr/news/darktable-dans-le-mur-au-ralenti/#keyboard-shortcuts" title="" rel="dofollow" >article&lt;/a>),&lt;/li>
&lt;li>volume de code :
&lt;ul>
&lt;li>&lt;strong>3 546 lignes&lt;/strong> de code pour Darktable 4.0,&lt;/li>
&lt;li>&lt;strong>4 397 lignes&lt;/strong> de code pour Darktable 5.0,&lt;/li>
&lt;li>l&amp;rsquo;augmentation du volume est une conséquence directe des tentatives de correction de bugs dans une architecture qu&amp;rsquo;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&amp;rsquo;est pas une solution.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>complexité du code :
&lt;ul>
&lt;li>&lt;a href="https://fr.wikipedia.org/wiki/Complexit%C3%A9_cyclomatique" title="Wikipedia link" target="_blank" rel="noopener noreferrer nofollow" >complexité cyclomatique&amp;thinsp;&lt;sup class="icon">&lt;i class="fab fa-wikipedia-w">&lt;/i>&lt;/sup>&lt;/a> :
&lt;ul>
&lt;li>&lt;strong>1088&lt;/strong> pour Darktable 4.0,&lt;/li>
&lt;li>&lt;strong>1245&lt;/strong> pour Darktable 5.0 (&lt;a href="https://sonarcloud.io/component_measures?id=aurelienpierreeng_darktable-5&amp;amp;metric=complexity&amp;amp;view=list" title="External link" target="_blank" rel="noopener noreferrer nofollow" >détails&amp;thinsp;&lt;sup class="icon">&lt;i class="fa fa-external-link-alt">&lt;/i>&lt;/sup>&lt;/a>),&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="https://www.sonarsource.com/blog/cognitive-complexity-because-testability-understandability/" title="External link" target="_blank" rel="noopener noreferrer nofollow" >complexité cognitive&amp;thinsp;&lt;sup class="icon">&lt;i class="fa fa-external-link-alt">&lt;/i>&lt;/sup>&lt;/a> :
&lt;ul>
&lt;li>&lt;strong>1885&lt;/strong> pour Darktable 4.0,&lt;/li>
&lt;li>&lt;strong>2098&lt;/strong> pour Darktable 5.0 (&lt;a href="https://sonarcloud.io/component_measures?metric=cognitive_complexity&amp;amp;view=list&amp;amp;id=aurelienpierreeng_darktable-5" title="External link" target="_blank" rel="noopener noreferrer nofollow" >détails&amp;thinsp;&lt;sup class="icon">&lt;i class="fa fa-external-link-alt">&lt;/i>&lt;/sup>&lt;/a>).&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>c&amp;rsquo;est de loin la fonctionnalité la plus complexe du logiciel, alors même qu&amp;rsquo;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 &lt;strong>1348&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>il ne décode pas les modificateurs de touches &lt;strong>par conception&lt;/strong>, mais ne traite que les frappes matérielles, ce qui signifie :
&lt;ul>
&lt;li>que l&amp;rsquo;entrée « 1 » du pavé numérique est décodée en &lt;code>Keypad End&lt;/code>,&lt;/li>
&lt;li>que l&amp;rsquo;entrée « 1 » d&amp;rsquo;un clavier AZERTY français est décodée en &lt;code>Shift+&amp;amp;&lt;/code>, ou en &lt;code>Shift+&amp;quot;&lt;/code> en BÉPO,&lt;/li>
&lt;li>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.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>la conception côté utilisateur est absolument affreuse, avec beaucoup trop d&amp;rsquo;actions et d&amp;rsquo;émulations à configurer (« effets »), qui ne sont même pas entièrement documentées 4 ans plus tard (qu&amp;rsquo;est-ce que « ctrl-toggle » ? « right-activate » ?), et la configuration des raccourcis utilise une étrange fenêtre scindée qui n&amp;rsquo;a aucun sens,&lt;/li>
&lt;li>l&amp;rsquo;implémentation est elle aussi terrible : la fonctionnalité connaît toute l&amp;rsquo;interface graphique du logiciel, et l&amp;rsquo;interface graphique du logiciel connaît le code des raccourcis. Il n&amp;rsquo;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.&lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup> Il suffit de voir le graphe de dépendances ci-dessous,&lt;/li>
&lt;li>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&amp;rsquo;interface dans certains cas et des faux positifs « combinaison de touches inconnue » dans des cas particuliers.&lt;/li>
&lt;/ol>
&lt;figure class="img-wrapper caption-figure" id="shortcuts-brokenpng">
&lt;button class="open-lightbox-button" onclick="lightbox(&amp;#34;shortcuts-brokenpng&amp;#34;)">
&lt;i class="fa fa-expand-alt open-lightbox-icon fa-fw">&lt;/i>
&lt;/button>
&lt;button class="open-link-button" onclick="window.open('https:\/\/ansel.photos\/shortcuts-broken.png', '_blank');">
&lt;i class="fa fa-external-link-alt open-link-icon fa-fw">&lt;/i>
&lt;/button>
&lt;div class="img-container" onclick="lightbox(&amp;#34;shortcuts-brokenpng&amp;#34;)" style="cursor: pointer;" >
&lt;img src=https://ansel.photos/shortcuts-broken.png alt="image"
style=" "
decoding="async" loading="lazy"sizes="(max-width: 992px) 100vw, (max-width: 1200px) 66.67vw, 50vw" srcset="https://ansel.photos/shortcuts-broken_hu_37da4ddfba37297.png 140w, https://ansel.photos/shortcuts-broken_hu_2ca56332c4a639fc.png 264w, https://ansel.photos/shortcuts-broken_hu_8894f2c5978674fe.png 331w, https://ansel.photos/shortcuts-broken_hu_bc265109b1e12781.png 400w, https://ansel.photos/shortcuts-broken_hu_d9d6e746b11eb2e5.png 496w, https://ansel.photos/shortcuts-broken_hu_ef3f427f08f0988e.png 576w, https://ansel.photos/shortcuts-broken_hu_42b4918b27cbec62.png 600w, https://ansel.photos/shortcuts-broken_hu_c18353f82cd93b8b.png 720w, https://ansel.photos/shortcuts-broken_hu_f875cf7401de6b2b.png 800w, https://ansel.photos/shortcuts-broken_hu_329e0f33193bcc21.png 992w, https://ansel.photos/shortcuts-broken_hu_3e979df69b871fbc.png 1200w, https://ansel.photos/shortcuts-broken_hu_5fce2b3bbfaa9bba.png 1320w, https://ansel.photos/shortcuts-broken_hu_324828f59d54c82b.png 1440w, https://ansel.photos/shortcuts-broken_hu_1af3de6d2fb4e36e.png 1600w, https://ansel.photos/shortcuts-broken_hu_8d207886803761a.png 1920w, https://ansel.photos/shortcuts-broken_hu_7ac56fd0b2cf2d5c.png 2048w"width="2508" height="1674"/>
&lt;/div>
&lt;figcaption>
Touches numériques non décodées et étrange découpage de fenêtre entre « action » et « raccourci ».
&lt;/figcaption>
&lt;/figure>
&lt;figure class="img-wrapper caption-figure" id="accelerators-beforejpg">
&lt;button class="open-lightbox-button" onclick="lightbox(&amp;#34;accelerators-beforejpg&amp;#34;)">
&lt;i class="fa fa-expand-alt open-lightbox-icon fa-fw">&lt;/i>
&lt;/button>
&lt;button class="open-link-button" onclick="window.open('https:\/\/ansel.photos\/accelerators-before.jpg', '_blank');">
&lt;i class="fa fa-external-link-alt open-link-icon fa-fw">&lt;/i>
&lt;/button>
&lt;div class="img-container" onclick="lightbox(&amp;#34;accelerators-beforejpg&amp;#34;)" style="cursor: pointer;" >
&lt;img src=https://ansel.photos/accelerators-before.jpg alt="image"
style=" "
decoding="async" loading="lazy"sizes="(max-width: 992px) 100vw, (max-width: 1200px) 66.67vw, 50vw" srcset="https://ansel.photos/accelerators-before_hu_7bfdceacd2bb7c89.jpg 140w, https://ansel.photos/accelerators-before_hu_d7938822cb09ca35.jpg 264w, https://ansel.photos/accelerators-before_hu_fcf7d3d779c1e468.jpg 331w, https://ansel.photos/accelerators-before_hu_e21dbd9378dd11aa.jpg 400w, https://ansel.photos/accelerators-before_hu_deb5f0ca868df06f.jpg 496w, https://ansel.photos/accelerators-before_hu_4bb52b8bdd9be52c.jpg 576w, https://ansel.photos/accelerators-before_hu_69881a278551351a.jpg 600w, https://ansel.photos/accelerators-before_hu_22c484c4dbe786e6.jpg 720w, https://ansel.photos/accelerators-before_hu_966ee3fdb6fc09ce.jpg 800w, https://ansel.photos/accelerators-before_hu_532d40704d99e3eb.jpg 992w, https://ansel.photos/accelerators-before_hu_67b7df50fe19e136.jpg 1200w, https://ansel.photos/accelerators-before_hu_543c1dc8e601743b.jpg 1320w, https://ansel.photos/accelerators-before_hu_d59a4cf0b04746dc.jpg 1440w, https://ansel.photos/accelerators-before_hu_a6ec2bd03f3faac7.jpg 1600w, https://ansel.photos/accelerators-before_hu_bccb1b41efcab977.jpg 1920w, https://ansel.photos/accelerators-before_hu_acdb628243edd870.jpg 2048w"width="3730" height="1912"/>
&lt;/div>
&lt;figcaption>
&lt;p>Le graphe de dépendances de &lt;code>src/gui/accelerators.c&lt;/code> (le grand turducken MIDI) avant la réécriture. Devinez pourquoi on appelle ça du « &lt;a href="https://fr.wikipedia.org/wiki/Code_spaghetti" title="Wikipedia link" target="_blank" rel="noopener noreferrer nofollow" >code spaghetti&amp;thinsp;&lt;sup class="icon">&lt;i class="fab fa-wikipedia-w">&lt;/i>&lt;/sup>&lt;/a> »… Cela montre clairement qu&amp;rsquo;il existe une dépendance dans les deux sens entre le code des accélérateurs et le reste du code de l&amp;rsquo;interface. C&amp;rsquo;est un cauchemar à maintenir.&lt;/p></description></item></channel></rss>