Manuel développeur — qt6sermo
1. Architecture
qt6sermo/
├── src/
│ ├── gtk3sermo.cpp/.h # Point d'entrée
│ ├── safe_exec.cpp/.h # Wrappers sécurisés
│ ├── automaton.cpp/.h # Moteur AST → widgets
│ ├── gtkdialog_parser.y # Parser Bison
│ ├── gtkdialog_lexer.l # Lexer Flex
│ ├── variables.cpp/.h # Gestion variables
│ ├── widgets.cpp/.h # Dispatch widgets
│ └── widget_*.cpp/.h # Un fichier par widget
├── configure.in
└── Makefile.am
2. Ajouter un nouveau widget
2.1 Constante (automaton.h)
#define WIDGET_MYWIDGET 0x00D00000
2.2 Header (widget_mywidget.h)
#ifndef WIDGET_MYWIDGET_H
#define WIDGET_MYWIDGET_H
void widget_mywidget_clear(variable *var);
GtkWidget *widget_mywidget_create(AttributeSet *Attr, tag_attr *attr, gint Type);
gchar *widget_mywidget_envvar_construct(GtkWidget *widget);
void widget_mywidget_refresh(variable *var);
#endif
2.3 Dispatch (widgets.cpp)
// Dans widget_get_text_value() :
case WIDGET_MYWIDGET:
return widget_mywidget_envvar_construct(widget);
// Dans widgets_to_str() :
case WIDGET_MYWIDGET:
type = "MYWIDGET"; break;
2.4 Parser (gtkdialog_lexer.l)
"mywidget" { return MYWIDGET; }
2.5 Makefile.am
qt6sermo_SOURCES = ... \
widget_mywidget.cpp widget_mywidget.h
3. Toolkit — notes spécifiques
Qt6 C++ — QWidget, signaux/slots Qt, moc requis à la compilation
API de référence : doc.qt.io/qt-6
4. Sécurité — règles obligatoires
- Toujours utiliser
safe_popen()au lieu depopen() - Toujours utiliser
safe_system()au lieu desystem() - Toujours utiliser
g_strlcpy()au lieu destrcpy() - Toujours utiliser
g_snprintf()au lieu desprintf() - Fermer les FILE* avec
fclose()(paspclose()) sur fdopen
5. Vérification syntaxe
gcc -fsyntax-only -std=c11 \
$(pkg-config --cflags qt6) \
-I src/ src/widget_mywidget.cpp