rem: gtk_widget_destroy ( GTK_WIDGET ( dialog ) );
context: void supprimer_sous_categ ( struct struct_sous_categ *sous_categ, gint no_categ ){    gint i, ope_trouvee, echeance_trouvee;    GSList * liste_tmp2;    struct struct_categ *categ;    GtkTreeSelection * selection;    GtkTreeModel * model;    GtkTreeIter iter;    categ = categ_par_no ( no_categ );    /* fait le tour des opés pour en trouver une qui a cette sous-catégorie */    p_tab_nom_de_compte_variable = p_tab_nom_de_compte;    ope_trouvee = 0;    for ( i=0 ; i<nb_comptes ; i++ )    {	GSList *liste_tmp;	liste_tmp = LISTE_OPERATIONS;	while ( liste_tmp )	{	    struct structure_operation *operation;	    operation = liste_tmp -> data;	    if ( operation -> categorie == categ -> no_categ		 &&		 operation -> sous_categorie == sous_categ -> no_sous_categ )	    {		ope_trouvee = 1;  modification_fichier(TRUE);		liste_tmp = NULL;		i = nb_comptes;	    }	    else		liste_tmp = liste_tmp -> next;	}	p_tab_nom_de_compte_variable++;    }    /* fait le tour des échéances pour en trouver une qui a cette catégorie  */    liste_tmp2 = liste_struct_echeances;    echeance_trouvee = 0;    while ( liste_tmp2 )    {	struct operation_echeance *echeance;	echeance = liste_tmp2 -> data;	if ( echeance -> categorie == categ -> no_categ && echeance -> sous_categorie == sous_categ -> no_sous_categ )	{	    echeance_trouvee = 1;	    liste_tmp2 = NULL;	}	else	    liste_tmp2 = liste_tmp2 -> next;    }    if ( ope_trouvee || echeance_trouvee )    {	GtkWidget *dialog, *hbox, *bouton_categ_generique, *combofix, *bouton_transfert;	GSList *liste_combofix, *pointeur, *liste_tmp, *liste_categ_credit, *liste_categ_debit;	gint i, resultat, nouveau_no_categ, nouveau_no_sous_categ;	struct struct_categ *nouvelle_categ;	struct struct_sous_categ *nouvelle_sous_categ;	gchar **split_categ;	dialog = dialogue_special_no_run ( GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL,					   make_hint ( _("Selected sub-category still contains transactions."),						       _("If you want to remove this sub-category but want to keep transactions, you can transfer them to another (sub-)category.  Otherwise, transactions can be simply deleted along with their category.") ));	/*       mise en place du choix tranfert vers un autre categ */	hbox = gtk_hbox_new ( FALSE,			      5 );	gtk_box_pack_start ( GTK_BOX ( GTK_DIALOG ( dialog ) -> vbox ),			     hbox,			     FALSE,			     FALSE,			     0 );	bouton_transfert = gtk_radio_button_new_with_label ( NULL,							     COLON(_("Transfer transactions to category"))  );	gtk_box_pack_start ( GTK_BOX ( hbox ),			     bouton_transfert,			     FALSE,			     FALSE,			     0 );	pointeur = liste_struct_categories;	liste_combofix = NULL;	liste_categ_credit = NULL;	liste_categ_debit = NULL;	while ( pointeur )	{	    struct struct_categ *categorie;	    GSList *sous_pointeur;	    categorie = pointeur -> data;	    if ( categorie -> type_categ )		liste_categ_debit = g_slist_append ( liste_categ_debit,						     g_strdup ( categorie -> nom_categ ) );	    else		liste_categ_credit = g_slist_append ( liste_categ_credit,						      g_strdup ( categorie -> nom_categ ) );	    sous_pointeur = categorie -> liste_sous_categ;	    while ( sous_pointeur )	    {		struct struct_sous_categ *sous_categorie;		sous_categorie = sous_pointeur -> data;		if ( sous_categorie -> no_sous_categ !=  sous_categ -> no_sous_categ )		{		    if ( categorie -> type_categ )			liste_categ_debit = g_slist_append ( liste_categ_debit,							     g_strconcat ( "\t",									   sous_categorie -> nom_sous_categ,									   NULL ) );		    else			liste_categ_credit = g_slist_append ( liste_categ_credit,							      g_strconcat ( "\t",									    sous_categorie -> nom_sous_categ,									    NULL ) );		}		sous_pointeur = sous_pointeur -> next;	    }	    pointeur = pointeur -> next;	}	/*   on ajoute les listes des crÃ©dits / débits à la liste du combofix du formulaire */	liste_combofix = g_slist_append ( liste_combofix,					  liste_categ_debit );	liste_combofix = g_slist_append ( liste_combofix,					  liste_categ_credit );	combofix = gtk_combofix_new_complex ( liste_combofix,					      TRUE,					      TRUE,					      TRUE,					      0 );	gtk_box_pack_start ( GTK_BOX ( hbox ),			     combofix,			     TRUE,			     TRUE,			     0 );	/*       mise en place du choix supprimer le categ */	hbox = gtk_hbox_new ( FALSE,			      5 );	gtk_box_pack_start ( GTK_BOX ( GTK_DIALOG ( dialog ) -> vbox ),			     hbox,			     FALSE,			     FALSE,			     0 );	bouton_categ_generique = gtk_radio_button_new_with_label ( gtk_radio_button_group ( GTK_RADIO_BUTTON ( bouton_transfert )),								   PRESPACIFY(_("Just remove this sub-category.")) );	gtk_box_pack_start ( GTK_BOX ( hbox ),			     bouton_categ_generique,			     FALSE,			     FALSE,			     0 );	gtk_widget_show_all ( dialog );      retour_dialogue:	resultat = gtk_dialog_run ( GTK_DIALOG ( dialog ) );	if ( resultat != GTK_RESPONSE_OK )	{	    gtk_widget_destroy ( GTK_WIDGET ( dialog ) );	    return;	}	nouveau_no_categ = 0;	nouveau_no_sous_categ = 0;	if ( gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( bouton_transfert )) )	{	    if ( !strlen (gtk_combofix_get_text ( GTK_COMBOFIX ( combofix ))))	    {		dialogue_warning_hint ( _("It is compulsory to specify a destination category to move transactions but no category was entered."),					_("Please enter a category!"));		goto retour_dialogue;	    }	    /* récupère les no de categ et sous categ */	    split_categ = g_strsplit ( gtk_combofix_get_text ( GTK_COMBOFIX ( combofix )),				       " : ",				       2 );	    nouvelle_categ = categ_par_nom ( split_categ[0],					     0,					     0,					     0 );	    if ( nouvelle_categ )	    {		nouveau_no_categ = nouvelle_categ -> no_categ;		nouvelle_sous_categ =  sous_categ_par_nom ( nouvelle_categ,							    split_categ[1],							    0 );		if ( nouvelle_sous_categ )		    nouveau_no_sous_categ = nouvelle_sous_categ -> no_sous_categ;	    }	    g_strfreev ( split_categ );	}	else	{	    nouveau_no_categ = 0;	    nouveau_no_sous_categ = 0;	}	/* on fait le tour des opés pour mettre le nouveau numéro de categ et sous_categ */	p_tab_nom_de_compte_variable = p_tab_nom_de_compte;	for ( i = 0 ; i < nb_comptes ; i++ )	{	    liste_tmp = LISTE_OPERATIONS;	    while ( liste_tmp )	    {		struct structure_operation *operation;		operation = liste_tmp -> data;		if ( operation -> categorie == categ -> no_categ		     &&		     operation -> sous_categorie == sous_categ -> no_sous_categ )		{		    operation -> categorie = nouveau_no_categ;		    operation -> sous_categorie = nouveau_no_sous_categ;		}		liste_tmp = liste_tmp -> next;	    }	    p_tab_nom_de_compte_variable++;	}	/* fait le tour des échéances pour mettre le nouveau numéro de categ et sous_categ  */	liste_tmp = liste_struct_echeances;	while ( liste_tmp )	{	    struct operation_echeance *echeance;	    echeance = liste_tmp -> data;	    if ( echeance -> categorie == categ -> no_categ		 &&		 echeance -> sous_categorie == sous_categ -> no_sous_categ )	    {		echeance -> categorie = nouveau_no_categ;		echeance -> sous_categorie = nouveau_no_sous_categ;		if ( !echeance -> categorie )		    echeance -> compte_virement = 0;	    }	    liste_tmp = liste_tmp -> next;	}	modification_fichier(TRUE);	demande_mise_a_jour_tous_comptes ();	gtk_widget_destroy ( GTK_WIDGET ( dialog ) );    }    /* supprime dans la liste des categ  */    categ -> liste_sous_categ = g_slist_remove ( categ -> liste_sous_categ,						 sous_categ );    enleve_selection_ligne_categ();    if ( mise_a_jour_combofix_categ_necessaire )	mise_a_jour_combofix_categ  ();    selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(arbre_categ));    if ( selection && gtk_tree_selection_get_selected(selection, &model, &iter))    {	gtk_tree_store_remove ( GTK_TREE_STORE(categ_tree_model), &iter );    }        modification_fichier(TRUE);}