feat(core): create application lifecycle

This commit is contained in:
grayTerminal-sh 2026-07-10 16:31:18 +02:00
parent 919bd1b7ad
commit 6236e80cbb
11 changed files with 288 additions and 1 deletions

1
.gitignore vendored
View file

@ -2,7 +2,6 @@
*.o *.o
*.a *.a
*.so *.so
labfy-investigation
# SQLite # SQLite
*.sqlite-wal *.sqlite-wal

View file

@ -0,0 +1,37 @@
# Ticket #001
## Titre
Créer le module Application.
## Objectif
Créer le point dentrée applicatif chargé de gérer le cycle de vie de GTK.
## Responsabilités
- créer lobjet GtkApplication ;
- lancer la boucle principale GTK ;
- libérer proprement les ressources ;
- afficher une fenêtre minimale au signal `activate`.
## Hors périmètre
- SQLite ;
- ouverture dune enquête ;
- sélecteur de dossier ;
- logique métier.
## Critères dacceptation
- [ ] Le projet compile en C17.
- [ ] Aucun warning.
- [ ] Aucun état global.
- [ ] Les fonctions publiques sont documentées avec Doxygen.
- [ ] Une fenêtre GTK minimale saffiche.
- [ ] La fermeture de lapplication est propre.
## Commit attendu
```text
feat(core): create application lifecycle

11
labfy-investigation/.gitignore vendored Normal file
View file

@ -0,0 +1,11 @@
# Build
enquete-gui
*.o
# SQLite temporaires
*.sqlite-shm
*.sqlite-wal
# Neovim / LSP
.cache/
compile_commands.json

View file

@ -0,0 +1,33 @@
CC = gcc
PKG_CONFIG = pkg-config
CFLAGS = -std=c17 \
-Wall \
-Wextra \
-Werror \
-g \
-Iinclude \
$(shell $(PKG_CONFIG) --cflags gtk4 sqlite3)
LDFLAGS = $(shell $(PKG_CONFIG) --libs gtk4 sqlite3)
SRC := $(shell find src -name "*.c")
OBJ := $(SRC:.c=.o)
TARGET = labfy-investigation
$(TARGET): $(OBJ)
$(CC) $(OBJ) -o $@ $(LDFLAGS)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(OBJ) $(TARGET)
run: $(TARGET)
./$(TARGET)
.PHONY: clean run

View file

@ -0,0 +1,22 @@
-I/usr/include/gtk-4.0
-I/usr/include/pango-1.0
-I/usr/include/fribidi
-I/usr/include/harfbuzz
-I/usr/include/gdk-pixbuf-2.0
-I/usr/include/glycin-2
-I/usr/include/cairo
-I/usr/include/freetype2
-I/usr/include/libpng16
-I/usr/include/pixman-1
-I/usr/include/graphene-1.0
-I/usr/lib/graphene-1.0/include
-mfpmath=sse
-msse
-msse2
-I/usr/include/glib-2.0
-I/usr/lib/glib-2.0/include
-I/usr/include/libmount
-I/usr/include/blkid
-I/usr/include/sysprof-6
-pthread
-Iinclude

View file

View file

View file

@ -0,0 +1,43 @@
/******************************************************************************
* @file application.h
* @brief Interface publique du cycle de vie de l'application.
******************************************************************************/
#ifndef LABFY_INVESTIGATION_APPLICATION_H
#define LABFY_INVESTIGATION_APPLICATION_H
/**
* @brief Représentation opaque de l'application.
*
* Les détails GTK sont volontairement masqués au reste du programme.
*/
typedef struct Application Application;
/**
* @brief Crée et initialise une application Labfy Investigation.
*
* @return Une nouvelle application, ou NULL en cas d'échec.
*/
Application *application_new(void);
/**
* @brief Lance la boucle principale de l'application.
*
* @param application Application à exécuter.
* @param argc Nombre d'arguments de la ligne de commande.
* @param argv Tableau des arguments de la ligne de commande.
*
* @return Code de sortie retourné par GTK.
*/
int application_run(Application *application, int argc, char **argv);
/**
* @brief Libère les ressources possédées par l'application.
*
* Cette fonction accepte NULL.
*
* @param application Application à libérer.
*/
void application_free(Application *application);
#endif

Binary file not shown.

View file

@ -0,0 +1,115 @@
/******************************************************************************
* @file application.c
* @brief Implémentation du cycle de vie de l'application GTK.
******************************************************************************/
#include "core/application.h"
#include <gtk/gtk.h>
/**
* @brief Identifiant unique utilisé par GLib pour l'application.
*/
#define APPLICATION_ID "com.labfytools.investigation"
/**
* @brief Dimensions initiales de la fenêtre principale.
*/
#define DEFAULT_WINDOW_WIDTH 1000
#define DEFAULT_WINDOW_HEIGHT 650
/**
* @struct Application
* @brief État interne de l'application.
*
* Cette structure reste privée à ce module afin d'empêcher les autres
* composants de manipuler directement les objets GTK.
*/
struct Application
{
GtkApplication *gtk_application;
};
/**
* @brief Crée la fenêtre minimale lors de l'activation de l'application.
*
* Cette fonction est privée au module. Elle est appelée par GTK lorsque
* l'application reçoit le signal "activate".
*
* @param gtk_application Application GTK ayant reçu le signal.
* @param user_data Données utilisateur associées au signal.
*/
static void application_on_activate(GtkApplication *gtk_application,
gpointer user_data)
{
GtkWidget *window = NULL;
(void)user_data;
window = gtk_application_window_new(gtk_application);
gtk_window_set_title(GTK_WINDOW(window), "Labfy Investigation");
gtk_window_set_default_size(
GTK_WINDOW(window),
DEFAULT_WINDOW_WIDTH,
DEFAULT_WINDOW_HEIGHT
);
gtk_window_present(GTK_WINDOW(window));
}
Application *application_new(void)
{
Application *application = NULL;
application = g_new0(Application, 1);
application->gtk_application = gtk_application_new(
APPLICATION_ID,
G_APPLICATION_DEFAULT_FLAGS
);
if (application->gtk_application == NULL)
{
g_free(application);
return NULL;
}
g_signal_connect(
application->gtk_application,
"activate",
G_CALLBACK(application_on_activate),
application
);
return application;
}
int application_run(Application *application, int argc, char **argv)
{
if (application == NULL || application->gtk_application == NULL)
{
return 1;
}
return g_application_run(
G_APPLICATION(application->gtk_application),
argc,
argv
);
}
void application_free(Application *application)
{
if (application == NULL)
{
return;
}
if (application->gtk_application != NULL)
{
g_object_unref(application->gtk_application);
}
g_free(application);
}

View file

@ -0,0 +1,27 @@
/******************************************************************************
* @file main.c
* @brief Point d'entrée de Labfy Investigation.
******************************************************************************/
#include "core/application.h"
#include <stdlib.h>
int main(int argc, char **argv)
{
Application *application = NULL;
int exit_status = EXIT_FAILURE;
application = application_new();
if (application == NULL)
{
return EXIT_FAILURE;
}
exit_status = application_run(application, argc, argv);
application_free(application);
return exit_status;
}