rem: if ( !strncmp ( chaine, liste_tmp->data, strlen ( chaine ) ) )
add: if ( !g_utf8_collate ( chaine, liste_tmp->data ) )
context: static gboolean affiche_proposition ( GtkWidget *entree,				      gchar *texte,				      gint longueur,				      gint *position,				      GtkComboFix *combofix ){    GSList *liste_tmp, *liste_affichee;    GtkStyle *style_label;    GdkColor couleur_bleue;    GtkWidget *liste, *scrolled_window, *label, *event_box;    gint menu_rempli, menu_rempli_ok, ligne_en_cours, i;    gchar *chaine, *completion, *categorie;    if (bloque_proposition)	return(FALSE);#define COULEUR_RED  40000#define COULEUR_GREEN  40000#define COULEUR_BLUE  65535    /* Initialisation des couleurs */    couleur_bleue.red = COULEUR_RED ;    couleur_bleue.green = COULEUR_GREEN;    couleur_bleue.blue = COULEUR_BLUE;    /*   pour éviter un warning lors de la compil : */    categorie = "";    /*   si la liste de mot est nulle, soit force_text n'est pas mis, et on vire, soit il est mis, */    /* et on vide l'entrée avant de virer */    if ( !combofix->liste  )    {	if ( combofix -> force_text )	{	    gtk_signal_handler_block_by_func ( GTK_OBJECT ( combofix->entry ),					       GTK_SIGNAL_FUNC ( efface_texte ),					       combofix );	    gtk_editable_delete_text ( GTK_EDITABLE ( combofix->entry ),				       0,				       -1 );	    gtk_signal_handler_unblock_by_func ( GTK_OBJECT ( combofix->entry ),						 GTK_SIGNAL_FUNC ( efface_texte ),						 combofix );	    if ( position )		*position = 0;	}	return TRUE;    }    /* recherche de la complétion */recherche_completion:    for ( i=0; texte && i < longueur; i++)    {	if ( isupper(texte[i]) )	{	    case_sensitive = 1;	    break;	}    }    chaine = (gchar *) gtk_entry_get_text ( GTK_ENTRY ( combofix -> entry ));    completion = NULL;    if ( chaine && strlen ( chaine ) )    {	liste_tmp = combofix-> liste_completion;	while ( liste_tmp && !completion )	{	    if ( !case_sensitive )	    {		if ( !g_strncasecmp ( chaine, liste_tmp->data, strlen ( chaine ) ) )		    completion = liste_tmp -> data;	    }	    else	    {		if ( !strncmp ( chaine, liste_tmp->data, strlen ( chaine ) ) )		    completion = liste_tmp -> data;	    }	    liste_tmp = liste_tmp -> next;	}    }    else	completion = "";    /* commence par vérifier l'entrée si force_text = 1 */    /* si le mot n'existe pas dans la liste autorisée, efface ce qui a été ajouté */    if ( combofix -> force_text	 &&	 !completion	 &&	 entree )    {	gtk_signal_handler_block_by_func ( GTK_OBJECT ( combofix->entry ),					   GTK_SIGNAL_FUNC ( efface_texte ),					   combofix );	if ( position )	{	    gtk_editable_delete_text ( GTK_EDITABLE ( combofix->entry ),				       *position - longueur,				       *position );	    (*position) = *position - longueur;	}	else	    gtk_editable_delete_text ( GTK_EDITABLE ( combofix->entry ),				       0,				       -1 );	gtk_signal_handler_unblock_by_func ( GTK_OBJECT ( combofix->entry ),					     GTK_SIGNAL_FUNC ( efface_texte ),					     combofix );	goto recherche_completion;    }    /*   si on voulait juste une complétion sans popup, on la fait et on s'en va */    /* ne fait pas la complétion si c'est du texte effacé */    if ( entree && !combofix -> affiche_liste && completion )    {	if ( completion )	{	    gtk_combofix_set_text ( combofix,				    completion );	    /*  l'affichage de la sélection se fera plus tard ( une fois l'objet dessiné ) */	    rafraichir_selection = 1;	}	return TRUE;    }    /* on commence à récupérer toutes les lignes qu'on va inclure dans la box */    /* si le nb de lignes est > à lignes_max, on n'affiche pas */    /* si on a clické sur l'arrow, on affiche toute la liste */    if ( entree == GINT_TO_POINTER ( -1 ) )	chaine = texte;    else	chaine = (char *) gtk_entry_get_text ( GTK_ENTRY ( combofix->entry ));    liste_tmp = combofix->liste;    liste_affichee = NULL;    ligne_en_cours = 0;    if ( combofix -> complex )	while ( liste_tmp )	{	    GSList *sous_liste_tmp;	    GSList *sous_liste_affichee;	    /* protection si pas de catég à une sous-categ */	    categorie = "";	    sous_liste_tmp = liste_tmp -> data;	    sous_liste_affichee = NULL;	    while ( sous_liste_tmp )	    {		gchar *string;		string = g_strdup ( sous_liste_tmp -> data );		/* la comparaison est différente selon que ce soit une catég ou une sous catég : */		/*  pour une catég, on la compare directement avec l'entrée */		/* pour une sous-catég, on compare categ : sous-categ avec l'entrée */		if ( string[0] != '\t' )		{		    gchar *string_tot;		    /* c'est une catégorie */		    /* sauvegarde de la catégorie pour tester les sous-catégories */		    categorie = string;		    string_tot = g_strconcat ( string,					       " : ",					       NULL );		    if ( !g_strncasecmp ( chaine,					  string_tot,					  strlen ( chaine )) 			 ||			 !g_strncasecmp ( chaine,					  string_tot,					  strlen ( string_tot )))		    {			/* cette catégorie devra être affichée */			sous_liste_affichee = g_slist_append ( sous_liste_affichee,							       string );			ligne_en_cours++;		    }		}		else		{		    if ( !g_strncasecmp ( chaine,					  g_strconcat ( categorie,							" : ",							string + 1,							NULL ),					  strlen ( chaine )))		    {			/* cette sous-catég devra être affichée */			sous_liste_affichee = g_slist_append ( sous_liste_affichee,							       string );			ligne_en_cours++;		    }		}		if ( combofix -> lignes_max		     &&		     ligne_en_cours > combofix -> lignes_max )		{		    if ( GTK_WIDGET_VISIBLE ( combofix->popup ))		    {			gtk_widget_hide ( combofix->popup );			gtk_grab_remove ( combofix -> popup );			gdk_pointer_ungrab ( GDK_CURRENT_TIME );		    }		    return TRUE;		}		sous_liste_tmp = sous_liste_tmp -> next;	    }	    /* on a fait le tour de la sous-liste du combofix complex */	    /* on ajoute la sous-liste des textes à afficher dans liste_affichee */	    liste_affichee = g_slist_append ( liste_affichee,					      sous_liste_affichee );	    liste_tmp = liste_tmp -> next;	}    else	while ( liste_tmp )	{	    gchar *string;	    /* protection si pas de catég à une sous-categ */	    categorie = "";	    string = liste_tmp -> data;	    /* la comparaison est différente selon que ce soit une catég ou une sous catég : */	    /*  pour une catég, on la compare directement avec l'entrée */	    /* pour une sous-catég, on compare categ : sous-categ avec l'entrée */	    if ( string[0] != '\t' )	    {		gchar *string_tot;		/* sauvegarde de la catégorie pour tester les sous-catégories */		categorie = string;		string_tot = g_strconcat ( string,					   " : ",					   NULL );		if ( !g_strncasecmp ( chaine,				      string_tot,				      strlen ( chaine ) ) 		     ||		     !g_strncasecmp ( chaine,				      string_tot,				      strlen ( string_tot )))		{		    liste_affichee = g_slist_append ( liste_affichee,						      string );		    ligne_en_cours++;		}	    }	    else	    {		if ( !g_strncasecmp ( chaine,				      g_strconcat ( categorie,						    " : ",						    string + 1,						    NULL ),				      strlen ( chaine ) ) )		{		    liste_affichee = g_slist_append ( liste_affichee,						      string );		    ligne_en_cours++;		}	    }	    if ( combofix -> lignes_max		 &&		 ligne_en_cours > combofix -> lignes_max )	    {		if ( GTK_WIDGET_VISIBLE ( combofix->popup ))		{		    gtk_widget_hide ( combofix->popup );		    gtk_grab_remove ( combofix -> popup );		    gdk_pointer_ungrab ( GDK_CURRENT_TIME );		}		return TRUE;	    }	    liste_tmp = liste_tmp -> next;	}    /*   si on est censé trier, c'est ici, où on ne trie que les lignes qu'on va afficher */    if ( combofix -> auto_sort )    {	if ( combofix -> complex )	{	    liste_tmp = liste_affichee;	    while ( liste_tmp )	    {		liste_tmp -> data = classe_combofix ( liste_tmp -> data );		liste_tmp = liste_tmp -> next;	    }	}	else	{	    liste_affichee = classe_combofix ( liste_affichee );	    /* 	  combofix -> liste_completion = g_slist_sort ( combofix -> liste_completion, */	    /* 							(GCompareFunc) classe_alphabetique ); */	}    }    /* on crée la nouvelle box si necessaire en fonction du contenu de l'entrée */    /* et la complétion */    scrolled_window = gtk_scrolled_window_new ( FALSE,						FALSE );    gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW ( scrolled_window ),				     GTK_POLICY_AUTOMATIC,				     GTK_POLICY_AUTOMATIC );    liste = gtk_vbox_new ( TRUE,			   0 );    gtk_signal_connect_after ( GTK_OBJECT ( liste ),			       "size-allocate",			       GTK_SIGNAL_FUNC ( realize_scrolled_window ),			       combofix );    gtk_scrolled_window_add_with_viewport ( GTK_SCROLLED_WINDOW ( scrolled_window ),					    liste );    if ( combofix->event_box )	g_slist_free ( combofix->event_box );    combofix->event_box = NULL;    style_label = gtk_style_copy ( gtk_widget_get_style (  combofix -> arrow ));    style_label->bg[GTK_STATE_PRELIGHT] = couleur_bleue;    liste_tmp = liste_affichee;    menu_rempli = 0;    menu_rempli_ok = 0;    if ( combofix -> complex )	while ( liste_tmp )	{	    GSList *sous_liste_tmp;	    sous_liste_tmp = liste_tmp -> data;	    while ( sous_liste_tmp )	    {		gchar *string;		string = g_strdup ( sous_liste_tmp -> data );		if ( string[0] != '\t' )		{		    /* c'est une catégorie, on la met dans la liste */		    /* on met la catég dans la variable qui sera utilisée dans l'affichage de la sous catég */		    categorie = string;		    /* permet d'éviter d'avoir une barre en haut */		    menu_rempli_ok = 1;		    /* on met une séparation si nécessaire */		    if ( menu_rempli )		    {			label = gtk_hseparator_new ();			gtk_box_pack_start ( GTK_BOX ( liste ),					     label,					     TRUE,					     TRUE,					     0 );			combofix->event_box = g_slist_append ( combofix->event_box,							       label );			menu_rempli = 0;		    }		    /* création de l'event_box */		    event_box = gtk_event_box_new ();		    gtk_widget_set_style ( event_box,					   style_label );		    gtk_object_set_data ( GTK_OBJECT ( event_box ),					  "texte",					  string );		    gtk_signal_connect ( GTK_OBJECT ( event_box ),					 "enter-notify-event",					 GTK_SIGNAL_FUNC ( met_combofix_en_prelight ),					 combofix );		    gtk_signal_connect ( GTK_OBJECT ( event_box ),					 "button-press-event",					 GTK_SIGNAL_FUNC ( click_sur_label ),					 combofix );		    /* création du label */		    label = gtk_label_new ( string );		    gtk_misc_set_alignment ( GTK_MISC ( label ),					     0,					     0.5 );		    gtk_widget_set_style ( label,					   style_label );		    gtk_container_add ( GTK_CONTAINER ( event_box ),					label );		    gtk_box_pack_start ( GTK_BOX ( liste ),					 event_box,					 TRUE,					 TRUE,					 0 );		    combofix->event_box = g_slist_append ( combofix->event_box,							   event_box );		}		else		{		    /* c'est une sous-categ, on la met dans la liste avec un espace devant */		    /* création de l'event_box */		    event_box = gtk_event_box_new ();		    gtk_widget_set_style ( event_box,					   style_label );		    gtk_object_set_data ( GTK_OBJECT ( event_box ),					  "texte",					  g_strconcat ( categorie,							" : ",							string + 1,							NULL ));		    gtk_signal_connect ( GTK_OBJECT ( event_box ),					 "enter-notify-event",					 GTK_SIGNAL_FUNC ( met_combofix_en_prelight ),					 combofix );		    gtk_signal_connect ( GTK_OBJECT ( event_box ),					 "button-press-event",					 GTK_SIGNAL_FUNC ( click_sur_label ),					 combofix );		    string = g_strdelimit ( string,					    "\t",					    ' ' );		    string = g_strconcat ( "     ",					   string,					   NULL );		    label = gtk_label_new ( string );		    gtk_misc_set_alignment ( GTK_MISC ( label ),					     0,					     0.5 );		    gtk_widget_set_style ( label,					   style_label );		    gtk_container_add ( GTK_CONTAINER ( event_box ),					label );		    gtk_box_pack_start ( GTK_BOX ( liste ),					 event_box,					 TRUE,					 TRUE,					 0 );		    combofix->event_box = g_slist_append ( combofix->event_box,							   event_box );		}		sous_liste_tmp = sous_liste_tmp -> next;	    }	    if ( menu_rempli_ok )	    {		menu_rempli = 1;		menu_rempli_ok = 0;	    }	    liste_tmp = liste_tmp -> next;	}    else	while ( liste_tmp )	{	    gchar *string;	    string = liste_tmp -> data;	    if ( string[0] != '\t' )	    {		/* c'est une categ, on l'affiche */		/* on met la catég dans la variable qui sera utilisée dans l'affichage de la sous catég */		categorie = string;		/* création de l'event_box */		event_box = gtk_event_box_new ();		gtk_widget_set_style ( event_box,				       style_label );		gtk_object_set_data ( GTK_OBJECT ( event_box ),				      "texte",				      string );		gtk_signal_connect ( GTK_OBJECT ( event_box ),				     "enter-notify-event",				     GTK_SIGNAL_FUNC ( met_combofix_en_prelight ),				     combofix );		gtk_signal_connect ( GTK_OBJECT ( event_box ),				     "button-press-event",				     GTK_SIGNAL_FUNC ( click_sur_label ),				     combofix );		/* création du label */		label = gtk_label_new ( string );		gtk_misc_set_alignment ( GTK_MISC ( label ),					 0,					 0.5 );		gtk_widget_set_style ( label,				       style_label );		gtk_container_add ( GTK_CONTAINER ( event_box ),				    label );		gtk_box_pack_start ( GTK_BOX ( liste ),				     event_box,				     TRUE,				     TRUE,				     0 );		combofix->event_box = g_slist_append ( combofix->event_box,						       event_box );	    }	    else	    {		/* c'est une sous-categ, on la met dans la liste avec un espace devant */		/* création de l'event_box */		event_box = gtk_event_box_new ();		gtk_widget_set_style ( event_box,				       style_label );		gtk_object_set_data ( GTK_OBJECT ( event_box ),				      "texte",				      g_strconcat ( categorie,						    " : ",						    string + 1,						    NULL ));		gtk_signal_connect ( GTK_OBJECT ( event_box ),				     "enter-notify-event",				     GTK_SIGNAL_FUNC ( met_combofix_en_prelight ),				     combofix );		gtk_signal_connect ( GTK_OBJECT ( event_box ),				     "button-press-event",				     GTK_SIGNAL_FUNC ( click_sur_label ),				     combofix );		string = g_strconcat ( "     ",				       string,				       NULL );		label = gtk_label_new ( string );		gtk_misc_set_alignment ( GTK_MISC ( label ),					 0,					 0.5 );		gtk_widget_set_style ( label,				       style_label );		gtk_container_add ( GTK_CONTAINER ( event_box ),				    label );		gtk_box_pack_start ( GTK_BOX ( liste ),				     event_box,				     TRUE,				     TRUE,				     0 );		combofix->event_box = g_slist_append ( combofix->event_box,						       event_box );	    }	    liste_tmp = liste_tmp -> next;	}    if ( entree && completion )    {	/* on affiche maintenant la complétion dans le combofix */	gtk_combofix_set_text ( combofix,				completion );	/*  l'affichage de la sélection se fera plus tard ( une fois l'objet dessiné ) */	rafraichir_selection = 1;    }    /*la liste est maintenant créée ; si la popup était déjà faite, on remplace l'ancienne liste, sinon, on crée la popup */    /* la position et la taille de la popup seront calculées quand la taille sera allouée */    combofix -> label_selectionne = -1;    if ( !GTK_WIDGET_REALIZED ( combofix->popup ) )    {	if ( !completion || !g_slist_length ( combofix->event_box ))	    return TRUE;	gtk_container_add ( GTK_CONTAINER ( GTK_BIN ( combofix -> popup ) -> child  ),			    scrolled_window );	combofix -> box = scrolled_window;	gtk_widget_show_all ( combofix->popup );	gtk_grab_add ( combofix -> popup );	gdk_pointer_grab (combofix->popup->window, 			  TRUE,			  GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |			  GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK |			  GDK_POINTER_MOTION_MASK,			  NULL, 			  NULL, 			  GDK_CURRENT_TIME);    }    else	if ( !GTK_WIDGET_VISIBLE ( combofix->popup ) )	{	    gfloat value;	    if ( !completion  || !g_slist_length ( combofix->event_box ))		return TRUE;	    value = gtk_scrolled_window_get_vadjustment ( GTK_SCROLLED_WINDOW  ( combofix->box ) ) -> value;	    gtk_widget_destroy ( combofix->box );	    gtk_container_add ( GTK_CONTAINER ( GTK_BIN ( combofix -> popup ) -> child ),				scrolled_window );	    combofix -> box = scrolled_window;	    gtk_widget_show_all ( combofix->popup );	    gtk_grab_add ( combofix -> popup );	    gdk_pointer_grab (combofix->popup->window, 			      TRUE,			      GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |			      GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK |			      GDK_POINTER_MOTION_MASK,			      NULL, 			      NULL, 			      GDK_CURRENT_TIME);	    gtk_adjustment_set_value ( gtk_scrolled_window_get_vadjustment ( GTK_SCROLLED_WINDOW  ( scrolled_window ) ),				       value );	}	else	{	    if ( !completion  || !g_slist_length ( combofix->event_box ))	    {		gtk_widget_hide ( combofix->popup );		gtk_grab_remove ( combofix -> popup );		gdk_pointer_ungrab ( GDK_CURRENT_TIME );		return TRUE;	    }	    gtk_widget_destroy ( combofix->box );	    gtk_container_add ( GTK_CONTAINER ( GTK_BIN ( combofix -> popup ) -> child ),				scrolled_window );	    combofix -> box = scrolled_window;	    gtk_widget_show_all ( combofix->popup );	}    return TRUE;}