Logo haplo-dialog

haplo-dialog

Des interfaces graphiques natives depuis le shell

Logiciel libre · GPL-2.0 · GTK 3, GTK 4 et Qt 6

Une fenêtre native
en dix lignes de shell

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.

🐚Rien que du shell 🔄Compatible gtkdialog 🔒Durci par défaut Un binaire, zéro runtime
v1.1.4 GTK 3 · GTK 4 · Qt 6 52 widgets GPL-2.0-or-later
#!/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 !"
Fenêtre « Bonjour ! » rendue par gtk3sermo en thème clair : libellé « Votre nom : », champ de saisie, bouton OK. Fenêtre « Bonjour ! » rendue par gtk3sermo en thème sombre : libellé « Votre nom : », champ de saisie, bouton OK.
↑ Le rendu réel du script ci-dessus, par gtk3sermo. Le moteur natif GTK 3 dessine la fenêtre ; votre script shell récupère les valeurs saisies dans ses variables d'environnement.
La même fenêtre « Bonjour ! » rendue par gtk4sermo en thème clair : libellé « Votre nom : », champ de saisie, bouton OK. La même fenêtre « Bonjour ! » rendue par gtk4sermo en thème sombre : libellé « Votre nom : », champ de saisie, bouton OK.
Le même script, pas une ligne changée, rendu par gtk4sermo. Même XML, même fenêtre — dessinée par GTK 4.
La même fenêtre « Bonjour ! » rendue par qt6sermo en thème clair : libellé « Votre nom : », champ de saisie, bouton OK. La même fenêtre « Bonjour ! » rendue par qt6sermo en thème sombre : libellé « Votre nom : », champ de saisie, bouton OK.
↑ Et le même script encore, rendu par qt6sermo — cette fois hors de GTK, par Qt 6. C'est là que « écrit une fois, rendu par plusieurs bibliothèques » cesse d'être une formule.
Démarrer Comparer Contribuer
3
Backends natifs (GTK 3, GTK 4, Qt 6)
52
Balises de widget
1
Syntaxe XML
113/113
Exemples livrés qui s'ouvrent
5
Recettes d'empaquetage fournies

À quoi ça ressemble, pour de vrai

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.

Cinq fenêtres gtk3sermo en thème clair : formulaire, conteneurs, onglets, indicateurs, boutons à icônes. Cinq fenêtres gtk3sermo en thème sombre : formulaire, conteneurs, onglets, indicateurs, boutons à icônes.
Champs de saisie, mot de passe masqué, compteur, cases à cocher, liste déroulante, cadres imbriqués, zone extensible, onglets, barre de progression, glissières, jauge, icônes du thème. Le tout décrit en XML, lancé depuis le shell, et rendu par le même binaire natif, sans interpréteur ni machine virtuelle.

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.

Les cinq mêmes fenêtres rendues côte à côte par gtk3sermo, gtk4sermo et qt6sermo, en thème clair. Les cinq mêmes fenêtres rendues côte à côte par gtk3sermo, gtk4sermo et qt6sermo, en thème sombre.
Un seul XML, trois moteurs graphiques. À gauche le port de référence GTK 3, au centre GTK 4, à droite Qt 6 — hors de GTK. Aucun script n'a été adapté : on change de binaire, pas de code.

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.

L'exemple outils-systeme rendu côte à côte par gtk3sermo, gtk4sermo et qt6sermo, en thème clair. L'exemple outils-systeme rendu côte à côte par gtk3sermo, gtk4sermo et qt6sermo, en thème sombre.
Le même script d'administration, rendu par les trois moteurs. C'est l'exemple examples/system-tools livré avec le port de référence — vous pouvez le lancer chez vous et obtenir ces fenêtres.

« haplo » : la simplicité, par essence

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.

Pourquoi haplo-dialog ?

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.

🐚

Le shell suffit

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.

🔄

gtkdialog ranimé

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.

🔒

Sécurité non négociable

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.

📦

Packaging universel

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.

🏛️

Héritage gtkdialog

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.

📖

Documentation complète

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.

Un binaire, zéro runtime

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 cœur en C

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.

🧪

Testable sans écran

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.

Les trois ports : gtk3sermo, gtk4sermo et qt6sermo

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.

✅ Référence
gtk3sermo
GTK3 ≥ 3.22 · build autotools
52 widgets documentés · 55/55 exemples
  • DépendancesGTK3 ≥ 3.22 · VTE3
  • Buildautotools (autoreconf)
  • Binairepaquet .deb officiel

Port de référence, base de toute la famille. Entièrement opérationnel, paquet .deb produit, suite de tests XML complète.

✅ Production
gtk4sermo
GTK4 ≥ 4.6 · build autotools
56 widgets documentés · 58/58 exemples
  • DépendancesGTK4 ≥ 4.6 · VTE (GTK 4)
  • Buildautotools (autoreconf)
  • Binairepaquet .deb officiel

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.

✅ Nouveau
qt6sermo
Qt 6 ≥ 6.2 · build CMake
49 widgets · 32/32 exemples · v1.0.2
  • DépendancesQt 6 Widgets · QTermWidget6 (optionnel)
  • BuildCMake
  • Binairepaquet .deb officiel

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.

haplo-dialog face aux alternatives

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 3GTK2GTK3GTK3ncurses (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.0LGPL-2.1GPL-3.0LGPL-2.1
pris en charge ~ partiel absent sans objet

De gtkdialog à haplo-dialog : ce qui change vraiment

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
🛡️

Exécution sans shell par défaut

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.

🔒

Durcissement ELF de bout en bout

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).

🧩

De GTK2 à GTK 3

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.

🧪

Testable sans écran

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.

📦

Empaqueté et documenté

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.

♻️

Rétro-compatible, sans réécriture

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.

Arborescence complète de la documentation

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.

gtk3sermo GTK3 ≥ 3.22 52 widgets
gtk4sermo GTK4 ≥ 4.6 56 widgets
qt6sermo Qt6 ≥ 6.2 49 widgets

Installation et désinstallation rapides

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

Compagnon MCP

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.

État du projet

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.