Des interfaces graphiques natives depuis le shell
Logiciel libre · GPL-2.0 · GTK 3, GTK 4 et Qt 6
haplo-dialog lit un descriptif XML et affiche une vraie fenêtre native, en GTK 3, GTK 4 ou Qt 6.
Décrivez l'interface, lancez gtk3sermo depuis le shell, récupérez les valeurs.
Là où gtkdialog est abandonné, haplo-dialog le fait revivre : corrigé, durci, maintenu.
Zéro ligne de C, zéro dépendance à un langage de plus. Votre script shell est l'application.
#!/bin/sh export DIALOG=' <window title="Bonjour !" width-request="320"> <vbox> <text><label>Votre nom :</label></text> <entry><variable>NOM</variable></entry> <button ok></button> </vbox> </window>' # Lancez l'interface depuis le shell : gtk3sermo --program DIALOG # alias rétro-compatible : gtkdialog echo "Bonjour, $NOM !"




Cinq fenêtres du banc de démonstration, produites par cinq scripts shell et rien d'autre : un formulaire complet, des conteneurs imbriqués, des onglets, des indicateurs animés, des boutons à icônes. Aucune n'a demandé une ligne de C.
Et voici les mêmes cinq scripts, sans une ligne modifiée, rendus par les trois ports. Le script ne sait pas laquelle des trois bibliothèques le dessine : les écarts visibles tiennent au thème, pas au langage.
Et pour finir, un vrai outil d'administration : six onglets, données système relevées au lancement, barre de progression liée à la mémoire, champ de recherche, icônes du thème. Un seul script shell, les trois ports.
examples/system-tools livré avec le port de référence — vous pouvez le
lancer chez vous et obtenir ces fenêtres.haplo se prononce /aplo/, du grec ancien ἁπλοῦς (haploûs) : « simple, unique, d'un seul tenant ». Construire une interface était devenu compliqué : frameworks lourds, runtimes, langages empilés. haplo-dialog revient à la racine : une description, votre shell, une vraie fenêtre native. Le nom dit déjà la promesse.
Une description. Votre shell. Une fenêtre native. Rien de plus que nécessaire.
Construire une interface graphique ne devrait pas exiger un nouveau langage, un framework lourd ou des centaines de lignes de code. haplo-dialog ramène le GUI au niveau du shell, là où vivent déjà vos scripts d'administration, d'installation et d'outillage.
Décrivez l'interface en XML, exportez-la dans une variable, lancez le binaire :
export DIALOG='…' puis gtk3sermo --program=DIALOG. Les valeurs saisies
reviennent dans vos variables d'environnement ($NOM, $EMAIL…), prêtes pour
la suite du script. Aucun langage intermédiaire, aucune glue.
La grammaire XML historique est préservée : vos anciens scripts gtkdialog
tournent tels quels, et le paquet gtksermo réinstalle la commande
gtkdialog elle-même. Une seule grammaire, rendue par les trois ports —
ce qui a changé sous le capot.
safe_system() remplace system() et popen() partout, avec
audit du repli shell (HAPLO_NO_SHELL_FALLBACK). Durcissement complet à la compilation :
_FORTIFY_SOURCE=3, PIE/ASLR, Full RELRO, stack-protector, pile non exécutable.
Le paquet .deb est construit et vérifié à chaque version, puis joint à la release.
Les recettes des autres familles (.rpm, PKGBUILD, ebuild, SlackBuild) sont fournies dans le dépôt
comme point de départ pour les empaqueteurs : elles ne sont pas construites par nos soins.
Fork modernisé de gtkdialog (László Pere, 2003-2013 ; Thunor, 2011-2012), publié sous la même
licence que l'original. Le paquet gtksermo, distinct et volontaire, pose l'alias gtkdialog : la commande d'époque
répond toujours, et pointe sur le même binaire.
Pour gtk3sermo : cahier des charges, manuel utilisateur, manuel développeur, guide de compilation, bilan de santé chiffré et une fiche de référence par widget, le tout en français.
gtk3sermo se compile en un seul exécutable natif ELF (PIE). Pas d'interpréteur, pas de machine virtuelle : la fenêtre s'ouvre instantanément, même sur une machine minimale.
Un automaton.c, un lexer flex, un parser bison, un widget_*.c par
widget : une architecture C claire et modulaire. Un bug corrigé au cœur profite à toute
l'interface.
Mode --print-ir : le binaire analyse le XML, imprime sa représentation interne et
quitte, sans ouvrir de fenêtre. Idéal pour les tests de régression (tests/xml/*.xml)
et l'intégration continue sous Docker, sans serveur graphique.
Trois backends, un seul langage XML. gtk3sermo est le port de
référence — c'est lui qui fournit l'alias gtkdialog et qui fait tourner vos scripts existants.
gtk4sermo porte le même langage sur GTK 4, et qt6sermo le sort de GTK
pour le rendre avec Qt 6. Chaque port dit ici où il en est.
Port de référence, base de toute la famille. Entièrement opérationnel, paquet .deb produit, suite de tests XML complète.
Même langage XML que gtk3sermo, rendu par GTK 4. Les 58 exemples livrés ouvrent tous leur fenêtre, et <table>, <menubar> et <menuitem> ne sont plus des bouchons : ils reposent sur GtkColumnView et GMenuModel. Même suite de tests, même intégration continue, même paquet que le port de référence. La seule différence assumée : l’ancrage Wayland n’est pas porté sur GTK 4.
Le même langage XML, rendu hors de GTK. C'est le port qui prouve que la description est indépendante de la bibliothèque : vos scripts changent de moteur graphique sans changer d'une ligne. Le plus jeune des trois, versionné à part, et vérifié widget par widget contre le port de référence — 24 cas de comportement, même valeur rendue au shell.
Les boîtes à outils d'interface en ligne de commande les plus répandues, comparées sur les critères qui comptent : interface déclarative, choix du toolkit, sécurité et maintenance active.
| Caractéristique | haplo-dialog | gtkdialog | zenity | yad | dialog / whiptail |
|---|---|---|---|---|---|
| Interface déclarative XML | ✓ | ✓ | ✗ | ~ | ✗ |
| Base graphique | GTK 3 | GTK2 | GTK3 | GTK3 | ncurses (TUI) |
| Valeurs renvoyées en variables shell | ✓ | ✓ | ~ | ~ | ~ |
| Widgets riches (table, arbre, terminal) | ✓ | ✓ | ✗ | ~ | ✗ |
| Durcissement (safe_system, FORTIFY=3, PIE) | ✓ | ✗ | — | — | — |
| Fonctionne sans serveur X | ✗ | ✗ | ✗ | ✗ | ✓ (ncurses) |
| Compatibilité syntaxe gtkdialog | ✓ | ✓ | ✗ | ✗ | ✗ |
| Maintenu en 2026 | ✓ | ✗ (~2013) | ✓ | ✓ | ✓ |
| Licence | GPL-2.0+ | GPL-2.0 | LGPL-2.1 | GPL-3.0 | LGPL-2.1 |
La suite part de gtkdialog 0.8.3 (Pere László, 2003-2013 ; Thunor, 2011-2012), qui visait GTK 2. Nous en gardons le cœur en C, le lexer flex, le parser bison et la grammaire XML historique — c'est ce qui permet à vos scripts de tourner sans retouche. Ce qui a été entièrement repris : l'exécution des commandes, le durcissement, le portage vers GTK 3 puis GTK 4, et l'outillage. Le tableau ci-dessous donne le détail, chaque ligne étant vérifiable dans les sources.
Nous ne sommes pas les seuls descendants de ce code : l'amont poursuit son travail chez woof-CE, et Mick Amadio maintient un autre portage GTK 3 sous le nom gtk3dialog, distribué par BunsenLabs. Ce que nous décrivons ici, ce sont nos choix — pas un jugement sur les leurs.
| Aspect | gtkdialog (original 0.8.3) | gtk3sermo (haplo) |
|---|---|---|
| Base graphique | GTK2 (gtk+-2.0) | GTK3 ≥ 3.22 |
| Maintenance | ≈ 2013, abandonné | 2026, activement maintenu |
| Exécution des commandes | system() · popen() |
safe_system() · safe_popen() |
| Mécanisme sous-jacent | Toujours via un shell /bin/sh -c |
g_spawn_sync() + exec() direct ; shell seulement si métacaractères |
| Repli shell | Implicite, silencieux | Journalisé et refusable via HAPLO_NO_SHELL_FALLBACK |
| Durcissement à la compilation | Aucun par défaut | _FORTIFY_SOURCE=3, stack-protector-strong, clash-protection, fcf-protection=full, PIE, Full RELRO, NX |
| Widgets natifs ajoutés | Jeu d'origine | switch, filechooser, calendar, linkbutton, searchentry, infobar (43 au total) |
| Architecture | Monolithique, GTK2 | Cœur C modulaire : automaton.c + lexer flex + parser bison + widget_*.c |
| Test sans écran | — | --print-ir : analyse le XML, imprime l'IR, quitte |
| Compatibilité XML | — | Rétro-compatible : scripts gtkdialog tels quels ; alias gtkdialog posé à l'installation |
| Licence | GPL-2.0 | GPL-2.0-or-later |
L'original appelait directement system() et popen(), qui confient la
commande à /bin/sh -c : toute donnée non maîtrisée pouvait y injecter du code. haplo route
tout par safe_system() / safe_popen() : la commande est découpée avec
g_shell_parse_argv() puis exécutée par g_spawn_sync() en exec()
direct, sans shell. Le shell n'est employé qu'en présence de métacaractères ; ce repli
est alors journalisé (g_warning) et refusable via HAPLO_NO_SHELL_FALLBACK.
Garde-fous : commande vide ou de plus de 65 535 octets rejetée, processus enfant moissonné pour éviter
les zombies.
gtkdialog ne posait aucun drapeau de sécurité. gtk3sermo compile avec
_FORTIFY_SOURCE=3, -fstack-protector-strong, -fstack-clash-protection
et -fcf-protection=full (Intel CET), en -fPIE/ASLR ; l'édition de liens ajoute
-pie, -Wl,-z,now + -Wl,-z,relro (Full RELRO) et
-Wl,-z,noexecstack (pile non exécutable).
L'original était soudé à GTK2. gtk3sermo migre vers GTK3 ≥ 3.22 et
gagne au passage des widgets GTK3 natifs absents de l'original : switch,
filechooser, calendar, linkbutton, searchentry,
infobar.
Nouveau mode --print-ir : le binaire analyse le XML, imprime sa représentation
interne (IR) et quitte, sans ouvrir de fenêtre. Couplé à une suite de tests XML, il rend
l'intégration continue possible sans serveur graphique, là où l'original exigeait un affichage pour le
moindre contrôle.
Là où gtkdialog se résumait à un tarball, gtk3sermo apporte un paquet .deb joint à
chaque release, des recettes pour les autres familles (.rpm, PKGBUILD, ebuild, SlackBuild), ses pages
de manuel, un site de documentation et la référence de chacun de ses widgets. La licence est clarifiée en
GPL-2.0-or-later.
Le lexer flex et le parser bison d'origine sont conservés intacts : la grammaire XML historique n'a pas bougé. Vos scripts gtkdialog existants s'exécutent tels quels, sans une ligne à changer, et héritent gratuitement du durcissement.
En résumé : même langage XML, mêmes scripts, mais une exécution sans injection, un binaire durci sur GTK 3, et un projet de nouveau vivant.
Tous les liens disponibles pour les trois ports : les pages de documentation (dont le bilan de santé) et la référence détaillée de chaque widget. Dépliez pour explorer.
Le livrable principal est la source : gtk3sermo fournit ses recettes d'empaquetage.
Sur Debian et dérivées, un .deb prêt à installer est joint à chaque
release v1.1.4 ;
sur toute autre distribution, on construit depuis les sources (recettes fournies).
Le code source est publié sur GitLab.
Il n'y a pas de dépôt APT à ajouter : on télécharge le paquet, on vérifie sa somme, on l'installe.
# Cloner le dépôt git clone https://gitlab.com/haplo-dialog/sermo.git # Sur Debian et dérivées : les .deb de la release v1.1.4 U=https://gitlab.com/api/v4/projects/85674825/packages/generic/sermo/1.1.4 for f in gtk3sermo_1.1.4-1_amd64.deb gtksermo_1.1.4-1_all.deb SHA256SUMS; do curl -fLO "$U/$f"; done sha256sum --ignore-missing -c SHA256SUMS sudo apt install ./gtk3sermo_1.1.4-1_amd64.deb # Depuis les sources : autotools cd sermo/gtk3sermo/gtk3sermo_1.1.4 autoreconf -fi && ./configure && make -j$(nproc) && sudo make install # Toute autre distro : recettes d'empaquetage fournies ls sermo/gtk3sermo/gtk3sermo_1.1.4/packaging/ # arch/ debian/ gentoo/ rpm/ slackware/ # Vérifier gtk3sermo --version && man haplo-dialog-xml && info gtk3sermo # ─ Désinstaller ─ sudo apt remove gtk3sermo # si installé via le paquet sudo make uninstall # autotools, depuis le dossier de build
Un second dépôt, sermo-mcp, met la documentation du projet — syntaxe XML, widgets, exemples — à portée d'un assistant IA. C'est un serveur local, en lecture seule, qui couvre la syntaxe commune aux trois ports. Comment le brancher : page Assistant IA.
Les trois ports compilent sans erreur et chacun ouvre la totalité de ses exemples lançables : 55 sur 55 pour gtk3sermo, 58 sur 58 pour gtk4sermo, 32 sur 32 pour qt6sermo — mesuré le 3 septembre 2026, bancs partagés au vert sur les trois moteurs. Une question, un défaut, une contribution : devel@haplo-dialog.fr.