Manuel développeur — gtk4sermo
1. Architecture
gtk4sermo/
├── src/
│ ├── gtkdialog.c + gtk3d.h # Point d'entrée
│ ├── safe_exec.c/.h # Wrappers sécurisés
│ ├── automaton.c/.h # Moteur AST → widgets
│ ├── gtkdialog_parser.y # Parser Bison
│ ├── gtkdialog_lexer.l # Lexer Flex
│ ├── variables.c/.h # Gestion variables
│ ├── widgets.c/.h # Dispatch widgets
│ └── widget_*.c/.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.c)
// 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
gtk4sermo_SOURCES = ... \
widget_mywidget.c widget_mywidget.h
3. Toolkit — notes spécifiques
gtk4-compat.h (65+ shims GTK3→GTK4) force-inclus via -include
API de référence : docs.gtk.org/gtk4
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 gtk4) \
-I src/ src/widget_mywidget.c