Bonjour à tous,

J'ai un treview à deux colonnes, l'une contient une chaine de caractères et l'autre un pixbuf, je souhaiterais que lorsqu'on clique sur l'image, une fonction soit appelée, j'ai essayé ceci mais sans succès, la fonction n'est pas appellée :

mon .h :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
enum//pour numeroter les colonnes
{
	Message,
 	Solve_It,
 	N_Signal
};
 
//third notebook : signals incoming from serial port
typedef struct GSignals//mes liststore et listview
{
	//table of signals
	GtkListStore* all;
	//tabe viewale
	GtkWidget* ListView;
	//iterator
	GtkTreeIter iterS;
}tsGSignals;
 
typedef struct GSignalParam//des parametres uniques pour chaque fonction de callback
{
	//set image clickable
	GtkWidget *event_box;
	GtkWidget *solve_it;
	char param[8];
}tsGSignalParam;
le fichier .c avant gtk_main :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
//je pense que c'est une facon assez classique qui ne necessite pas trop d'explication
sGVar.sGS.all = gtk_list_store_new(N_Signal,
									   G_TYPE_STRING,
										GDK_TYPE_PIXBUF
									   );
	sGVar.sGS.ListView = gtk_tree_view_new_with_model(GTK_TREE_MODEL(sGVar.sGS.all));
	temp_string = g_strdup_printf("signaux");
	gtk_notebook_append_page(GTK_NOTEBOOK(sGVar.note_book), GTK_WIDGET(sGVar.sGS.ListView), gtk_label_new(temp_string));
	//show the list
	//message
	cell_renderS = gtk_cell_renderer_text_new();
	columnS = gtk_tree_view_column_new_with_attributes("message", cell_renderS, "text", Message, NULL);
	gtk_tree_view_append_column(GTK_TREE_VIEW(sGVar.sGS.ListView), columnS);
	//solve it
	cell_renderS = gtk_cell_renderer_pixbuf_new();
	columnS = gtk_tree_view_column_new_with_attributes("résoudre", cell_renderS, "pixbuf", Solve_It, NULL);
	gtk_tree_view_append_column(GTK_TREE_VIEW(sGVar.sGS.ListView), columnS);
et la fonction ou j'ajoute des lignes (appelée par des signaux à la sigaction) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
void AddSignal(eEvent event, char* param)
{
	printf("signal added\n");
//je creer un nouvel ensemble de parametres
	tsGSignalParam* sParam = malloc(sizeof(tsGSignalParam));
//avec un event box pour capter un signal (cf image dans la doc de gtk )
	sParam->event_box = gtk_event_box_new();
	sParam->solve_it = gtk_image_new_from_file("images/solve_it");
//je met l'image dans l'event box
	gtk_container_add (GTK_CONTAINER (sParam->event_box), sParam->solve_it);
	gtk_list_store_append(sGVar.sGS.all, &(sGVar.sGS.iterS));
	switch(event)
	{
		case cProbe_Join :
			gtk_list_store_set(sGVar.sGS.all, &(sGVar.sGS.iterS), Message, "nouvelle sonde", Solve_It, gtk_image_get_pixbuf(GTK_IMAGE(sParam->solve_it)), -1);
			g_signal_connect (G_OBJECT (sParam->event_box),
							  	"button_press_event",
		 						G_CALLBACK (SignalAddProbe),
					 			(gpointer)sParam);
			break;
		case cProbe_Leave :
			gtk_list_store_set(sGVar.sGS.all, &(sGVar.sGS.iterS), Message, "sonde perdue", Solve_It, gtk_image_get_pixbuf(GTK_IMAGE(sParam->solve_it)), -1);
			g_signal_connect (G_OBJECT (sParam->event_box),
							  "button_press_event",
		 						G_CALLBACK (SignalRemoveProbe),
					 			(gpointer)sParam);
			break;
		default :
			gtk_list_store_set(sGVar.sGS.all, &(sGVar.sGS.iterS), Message, "signal inconnu", Solve_It, gtk_image_get_pixbuf(GTK_IMAGE(sParam->solve_it)), -1);
			break;
	}
}
Ca ne m'étonne pas beaucoup que ca ne marche puisque le signal est connecté à l'event box alors que j'utilise le pixbuf de l'image contenu dans l'event box pour l'affichage mais liststore demande un pixbuf.
Bref, j'ai regardé avec les colonnes, les gtk_treview_get_selection et les cellrenderer sans succès.
Autre point : en connectant mon signal, je passe des paramètres, puisque j'ai une liste, est-ce-que chaque ligne sera connectée avec les paramètres qui lui sont propres (les tsGSignalParam*) ou aurai-je un programme bien buggé et plein de fuites mémoires ?
Meri de votre aide, n'hésitez pas à me reprendre si je ne suis pas clair, c'est mon premier post.

edit : faire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
 gtk_widget_add_events(sParam->solve_it, GDK_BUTTON_PRESS_MASK);
avant de connecter le signal ne donne rien non plus, n'y at-il pas moyen de mettre l'image sous forme de WIdget plutot que de pixbuf dans la liststore ? Je pense que je pourrais ainsi capter les signaux.

config : kubuntu 8.04, gtk+-2.0