4.9 KiB
Ticket #031.1 — Ajouter une fermeture propre de l’application
Contexte
L’application permet désormais :
- de créer une enquête ;
- d’ouvrir une enquête existante ;
- de remplacer proprement la session active.
La fermeture se fait encore avec :
Ctrl+C
Cette méthode interrompt brutalement le processus et ne constitue pas un parcours utilisateur normal.
Objectif
Ajouter un bouton :
Quitter
permettant de fermer proprement l’application GTK.
La fermeture doit déclencher le cycle normal de nettoyage :
GtkApplication
↓
fin de la boucle principale
↓
application_free()
↓
InvestigationTreeModel libéré
↓
InvestigationSession fermée
↓
Database fermée
↓
MainWindow libérée
Travail à réaliser
1. Ajouter le bouton dans MainWindow
Modifier :
include/views/main_window.h
src/views/main_window.c
La barre d’actions doit devenir :
[ Nouvelle enquête ] [ Ouvrir une enquête ] [ Quitter ]
Ajouter dans la structure privée :
GtkWidget *quit_button;
2. Ajouter le type de callback
Dans include/views/main_window.h, ajouter :
typedef void (*MainWindowQuitCallback)(
gpointer user_data
);
Puis déclarer :
void main_window_set_quit_callback(
MainWindow *main_window,
MainWindowQuitCallback callback,
gpointer user_data
);
3. Conserver le callback dans MainWindow
Ajouter dans la structure privée :
MainWindowQuitCallback
quit_callback;
gpointer
quit_user_data;
4. Ajouter le callback privé du bouton
Dans src/views/main_window.c, ajouter :
static void main_window_on_quit_clicked(
GtkButton *button,
gpointer user_data
);
Cette fonction doit :
- accepter
button == NULL; - accepter
main_window == NULL; - ne rien faire si aucun callback n’est défini ;
- appeler le callback configuré sinon.
5. Créer le bouton
Dans main_window_new() :
main_window->quit_button =
gtk_button_new_with_label(
"Quitter"
);
Ajouter le bouton à action_bar.
Relier son signal clicked à :
main_window_on_quit_clicked
6. Ajouter le setter public
Implémenter :
void main_window_set_quit_callback(
MainWindow *main_window,
MainWindowQuitCallback callback,
gpointer user_data
)
{
if (main_window == NULL)
{
return;
}
main_window->quit_callback = callback;
main_window->quit_user_data = user_data;
}
7. Ajouter le contrôleur dans Application
Dans src/core/application.c, ajouter :
static void application_on_quit_requested(
gpointer user_data
);
Cette fonction doit utiliser :
g_application_quit(
G_APPLICATION(
application->gtk_application
)
);
Aucun appel direct à exit() ne doit être ajouté.
8. Relier le callback dans application_on_activate()
Ajouter :
main_window_set_quit_callback(
application->main_window,
application_on_quit_requested,
application
);
Tests manuels
Fermeture sans enquête
- lancer l’application ;
- cliquer sur
Quitter; - vérifier que le processus se termine normalement.
Fermeture avec une enquête ouverte
- ouvrir ou créer une enquête ;
- cliquer sur
Quitter; - vérifier que la fenêtre se ferme ;
- vérifier qu’aucun crash n’apparaît ;
- relancer l’application ;
- rouvrir la même enquête.
Fermeture après remplacement de session
- ouvrir une enquête A ;
- ouvrir une enquête B ;
- cliquer sur
Quitter; - vérifier l’absence de crash ou de double libération.
Critères d’acceptation
- Le bouton
Quitterest visible. - Le bouton ferme l’application.
- Aucun
exit()direct n’est utilisé. g_application_quit()est utilisé.MainWindowne connaît pasGtkApplication.- Le nettoyage reste géré par
Application. - La fermeture fonctionne sans enquête ouverte.
- La fermeture fonctionne avec une enquête ouverte.
- La fermeture fonctionne après un changement d’enquête.
makeréussit.make testréussit.git diff --checkne retourne aucune erreur.
Audit attendu
rg -n \
'quit_button|quit_callback|g_application_quit' \
include/views/main_window.h \
src/views/main_window.c \
src/core/application.c
La commande suivante ne doit rien afficher :
rg -n \
'\bexit\s*\(' \
src/core/application.c \
src/views/main_window.c
Fichiers concernés
include/views/main_window.h
src/views/main_window.c
src/core/application.c
Commit attendu
make clean
make
make test
git diff --check
git status --short
git add \
include/views/main_window.h \
src/views/main_window.c \
src/core/application.c
git commit -m "feat(ui): add clean application quit action"
git push