Probleme de callback avec GTK

Top Page

Reply to this message
Author: Patrick Begou
Date:  
To: ML Guilde
Subject: Probleme de callback avec GTK
Bonjour,

Je reviens à la charge avec GTK :-(
Je ne parviens pas a passer des données en paramètre dans un callback.
Ce doit être une erreur basique de compréhension du mécanisme, mais je
sèche... Si quelqu'un peut me donner un tuyau...

J'ai simplifié autant que possible le bout de code ci dessous.

Je crée une variable entière appelée "zero" ligne 16
int zero=0;
et j'essaie de la passer en paramètre au callback ligne 35
gtk_signal_connect(GTK_OBJECT(zone),"expose_event",GTK_SIGNAL_FUNC(dessine),(gpointer)
&zero);

J'affiche l'adresse de cette variable dans le main ligne 18
cerr<<"ici @zero = "<<&zero<<endl;
et je l'affiche dans le callback ligne 53
cerr<<"la @zero = "<<(int*)user_data<<endl;

et cela     n'a rien a voir!


je compile avec:
sur une machine 64 bits en FC9:
g++ `pkg-config --cflags --libs gtk+-2.0` tuto4.C -o tuto4

sur une machine 32 bits en FC4:
g++ `gtk-config --cflags` tuto4.C `gtk-config --libs` -o tuto4

Même résultat donc ça vient de moi :-((

Merci de votre aide.

Patrick
--
===============================================================
|  Equipe M.O.S.T.         | http://most.hmg.inpg.fr          |
|  Patrick BEGOU           |       ------------               |
|  LEGI                    | mailto:Patrick.Begou@hmg.inpg.fr |
|  BP 53 X                 | Tel 04 76 82 51 35               |
|  38041 GRENOBLE CEDEX    | Fax 04 76 82 52 71               |

===============================================================
#include <cstdlib>
#include <iostream>
#include <gtk/gtk.h>
#include <gdk/gdk.h>

using namespace std;

void dessine(GtkWidget *p_widget, gpointer user_data);

int main(int argc, char **argv)
{
GtkWidget *p_window=NULL;     // la fenetre principale
GtkWidget *p_main_box=NULL;   // un conteneur vertical


GtkWidget *zone=NULL;     // la zone de dessin
int zero=0;


cerr<<"ici @zero = "<<&zero<<endl;

// Initialisation de Gtk
gtk_init(&argc, &argv);


// Creation de la fenetre principale et de
// son callback pour une sortie propre.
p_window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_signal_connect(GTK_OBJECT(p_window),"destroy",GTK_SIGNAL_FUNC(gtk_main_quit),NULL);

// insertion d'un conteneur vertical
p_main_box=gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(p_window),p_main_box);

// insertion de la zone de dessin
zone=gtk_drawing_area_new();
gtk_signal_connect(GTK_OBJECT(zone),"expose_event",GTK_SIGNAL_FUNC(dessine),(gpointer) &zero);
gtk_box_pack_start(GTK_BOX(p_main_box),zone,FALSE,FALSE,0);
gtk_widget_set_usize(zone,400,200);

// Affichage
gtk_widget_show_all(p_window);

//boucle principale
gtk_main();

return EXIT_SUCCESS;
}

//========================================
// la fonction callback
//========================================
void dessine(GtkWidget *p_widget, gpointer user_data)
{
cerr<<"la @zero = "<<(int*)user_data<<endl;
}