WIP: Ok (cleaned) mais erreur de segmentation à la fermeture de la fenêtre

This commit is contained in:
Jean Sirmai 2024-02-16 09:05:41 +01:00
parent 9e1d54d469
commit a8477025fe
Signed by: jean
GPG Key ID: FB3115C340E057E3
2 changed files with 15 additions and 13 deletions

Binary file not shown.

28
main.c
View File

@ -12,6 +12,8 @@
#include <glib-2.0/glib.h> #include <glib-2.0/glib.h>
#include <gtk-4.0/gtk/gtk.h> #include <gtk-4.0/gtk/gtk.h>
#define verb 0
// Simplified TreeNode structure for demonstration purposes // Simplified TreeNode structure for demonstration purposes
struct TreeNode_t struct TreeNode_t
{ {
@ -48,7 +50,7 @@ void add_child_node (struct TreeNode_t *parent, struct TreeNode_t *child)
} }
} }
static insert_data() // (TreeNode_t *root) static void insert_data (struct TreeNode_t *root)
{ {
struct TreeNode_t *A = create_tree_node("A"); add_child_node(root, A); struct TreeNode_t *A = create_tree_node("A"); add_child_node(root, A);
struct TreeNode_t *B = create_tree_node("B"); add_child_node(A, B); struct TreeNode_t *B = create_tree_node("B"); add_child_node(A, B);
@ -89,7 +91,7 @@ GListModel* get_children_model (struct TreeNode_t *parent)
GtkStringList *list = NULL; GtkStringList *list = NULL;
if (parent) { if (parent) {
printf("[get_children_model] here is %s content : ", parent->text); if (verb) printf("[get_children_model] here is %s content : ", parent->text);
child = parent->child; child = parent->child;
@ -98,11 +100,11 @@ GListModel* get_children_model (struct TreeNode_t *parent)
} }
while(child) { while(child) {
gtk_string_list_append(list, child->text); gtk_string_list_append(list, child->text);
printf("%s ", child->text); if (verb) printf("%s ", child->text);
child = child->next; child = child->next;
} }
} }
printf("\n"); if (verb) printf("\n");
return G_LIST_MODEL(list); return G_LIST_MODEL(list);
} }
@ -114,11 +116,11 @@ GListModel* create_model_func(GObject *item, gpointer user_data)
struct TreeNode_t *parent = NULL; struct TreeNode_t *parent = NULL;
struct TreeNode_t *res = NULL; struct TreeNode_t *res = NULL;
gchar *string = gtk_string_object_get_string(GTK_STRING_OBJECT(item)); const char* string = gtk_string_object_get_string(GTK_STRING_OBJECT(item));
parent = root; parent = root;
while (cur) { while (cur) {
if (strcmp(string, cur->text) == NULL) { if (! strcmp(string, cur->text)) {
res = cur; res = cur;
break; break;
} }
@ -130,7 +132,7 @@ GListModel* create_model_func(GObject *item, gpointer user_data)
} }
} }
printf("[create_model_func] here is %s item\n", string); if (verb) printf("[create_model_func] here is %s item\n", string);
return get_children_model(cur); return get_children_model(cur);
} }
@ -148,7 +150,7 @@ void on_setup_factory (GtkListItemFactory *factory, GtkListItem *list_item, gpoi
{ {
GtkWidget* expander = gtk_expander_new (NULL); GtkWidget* expander = gtk_expander_new (NULL);
gtk_list_item_set_child (list_item, expander); gtk_list_item_set_child (list_item, expander);
printf("[on_setup_factory] here is an expander\n"); if (verb) printf("[on_setup_factory] here is an expander\n");
} }
void on_bind_factory (GtkListItemFactory *factory, GtkListItem *list_item, gpointer user_data) void on_bind_factory (GtkListItemFactory *factory, GtkListItem *list_item, gpointer user_data)
@ -172,14 +174,14 @@ void on_bind_factory (GtkListItemFactory *factory, GtkListItem *list_item, gpoin
gboolean is_expanded = gtk_tree_list_row_get_expanded(row); gboolean is_expanded = gtk_tree_list_row_get_expanded(row);
//gtk_tree_list_row_set_expanded(row, !is_expanded); //gtk_tree_list_row_set_expanded(row, !is_expanded);
} else { } else {
printf("[on_bind_factory] here is NON %s content\n", text); if (verb) printf("[on_bind_factory] here is NON %s content\n", text);
} }
} }
void on_selection_changed (GtkSelectionModel* self, guint position, void on_selection_changed (GtkSelectionModel* self, guint position,
guint n_items, gpointer user_data) guint n_items, gpointer user_data)
{ {
printf("Cc\n"); if (verb) printf("Cc\n");
} }
// Application activation callback // Application activation callback
@ -207,7 +209,7 @@ void app_activate (GApplication *app, gpointer user_data)
(GDestroyNotify)g_object_unref //(GDestroyNotify)free_tree_node (GDestroyNotify)g_object_unref //(GDestroyNotify)free_tree_node
); );
GtkSingleSelection *selection_model = gtk_single_selection_new ( GtkSingleSelection *selection_model = gtk_single_selection_new ( // GtkSelectionModel
G_LIST_MODEL (tree_model)); G_LIST_MODEL (tree_model));
gtk_single_selection_set_autoselect(selection_model, FALSE); gtk_single_selection_set_autoselect(selection_model, FALSE);
@ -215,7 +217,7 @@ void app_activate (GApplication *app, gpointer user_data)
g_signal_connect (selection_model, "selection-changed", g_signal_connect (selection_model, "selection-changed",
G_CALLBACK(on_selection_changed), NULL); G_CALLBACK(on_selection_changed), NULL);
GtkWidget *list_view = gtk_list_view_new (selection_model, factory); GtkWidget *list_view = gtk_list_view_new (GTK_SELECTION_MODEL(selection_model), factory);
gtk_window_set_child(GTK_WINDOW(window), list_view); gtk_window_set_child(GTK_WINDOW(window), list_view);
@ -226,7 +228,7 @@ int main (int argc, char **argv)
{ {
// Create a simple tree structure // Create a simple tree structure
root = create_tree_node("Root"); root = create_tree_node("Root");
insert_data(); insert_data(root);
GtkApplication *app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE); GtkApplication *app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE);
g_signal_connect(app, "activate", G_CALLBACK(app_activate), NULL); g_signal_connect(app, "activate", G_CALLBACK(app_activate), NULL);