add: if (bloque_proposition) return;
context: static gboolean affiche_proposition ( GtkWidget *entree,				  gchar *texte,				  gint longueur,				  gint *position,				  GtkComboFix *combofix ){  GtkStyle *style_label;  GtkWidget *liste;  GSList *liste_tmp;  gchar *chaine;  GtkWidget *label;  GtkWidget *event_box;  gint menu_rempli;  gint menu_rempli_ok;  gchar *completion;  GtkWidget *scrolled_window;  GdkColor couleur_bleue;  GSList *liste_affichee;  gchar *categorie;  gint ligne_en_cours;#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'entre 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 compltion */ recherche_completion:  chaine = (gchar *) gtk_entry_get_text ( GTK_ENTRY ( combofix -> entry ));  completion = NULL;  if ( strlen ( chaine ) )    {      liste_tmp = combofix-> liste_completion;      while ( liste_tmp && !completion )	{	  if ( !g_strncasecmp ( chaine,				liste_tmp->data, 				strlen ( chaine ) ) )	    completion = liste_tmp -> data;	  	  liste_tmp = liste_tmp -> next;	}    }  else    completion = "";  /* commence par vrifier l'entre si force_text = 1 */  /* si le mot n'existe pas dans la liste autorise, 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 compltion sans popup, on la fait et on s'en va */  /* ne fait pas la compltion si c'est du texte effac */  if ( entree && !combofix -> affiche_liste && completion )    {      if ( completion )	{	  gtk_combofix_set_text ( combofix,				  completion );	  	  /*  l'affichage de la slection se fera plus tard ( une fois l'objet dessin ) */	  rafraichir_selection = 1;	}      return TRUE;    }  /* on commence  rcuprer 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 catg  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 diffrente selon que ce soit une catg ou une sous catg : */	    /*  pour une catg, on la compare directement avec l'entre */	    /* pour une sous-catg, on compare categ : sous-categ avec l'entre */	    if ( string[0] != '\t' )	      {		gchar *string_tot;				/* c'est une catgorie */		/* sauvegarde de la catgorie pour tester les sous-catgories */		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 catgorie devra tre affiche */		    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-catg devra tre affiche */ 		    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 catg  une sous-categ */	categorie = "";	string = liste_tmp -> data;	/* la comparaison est diffrente selon que ce soit une catg ou une sous catg : */	/*  pour une catg, on la compare directement avec l'entre */	/* pour une sous-catg, on compare categ : sous-categ avec l'entre */	if ( string[0] != '\t' )	  {	    gchar *string_tot;	    /* sauvegarde de la catgorie pour tester les sous-catgories */	    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 cre la nouvelle box si necessaire en fonction du contenu de l'entre */  /* et la compltion */  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 catgorie, on la met dans la liste */		/* on met la catg dans la variable qui sera utilise dans l'affichage de la sous catg */		categorie = string;		/* permet d'viter d'avoir une barre en haut */		menu_rempli_ok = 1;		/* on met une sparation si ncessaire */		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;		  }		/* cration 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_en_prelight ),				     combofix );		gtk_signal_connect ( GTK_OBJECT ( event_box ),				     "button-press-event",				     GTK_SIGNAL_FUNC ( click_sur_label ),				     combofix );		/* cration 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 */		/* cration 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_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 catg dans la variable qui sera utilise dans l'affichage de la sous catg */	    categorie = string;	    /* cration 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_en_prelight ),				 combofix );	    gtk_signal_connect ( GTK_OBJECT ( event_box ),				 "button-press-event",				 GTK_SIGNAL_FUNC ( click_sur_label ),				 combofix );	    /* cration 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 */	    /* cration 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_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 compltion dans le combofix */      gtk_combofix_set_text ( combofix,			      completion );      /*  l'affichage de la slection se fera plus tard ( une fois l'objet dessin ) */            rafraichir_selection = 1;    }  /*la liste est maintenant cre ; si la popup tait dj faite, on remplace l'ancienne liste, sinon, on cre la popup *//* la position et la taille de la popup seront calcules quand la taille sera alloue */  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;}