PDA

View Full Version : [gtk] passare pių di un parametro alle callback


Arpeda
14-04-2004, 12:03
ciao ragazzi,

sto sbattendo la testa su come fare a passare pių di un parametro alle callback
vi spiego in breve il mio caso d'uso:
ho un bottone, o meglio un menų da cui scelgo delle voc, a seconda da quale scelta faccio accanto creo un'altro menų.
Ho quindi bisogno di un puntatore all'hbox a cui fare riferimento e un'altro al secondo menų creato, in modo tale da ditruggerlo e ricrearlo quando cambio scelta :)

Ho pensato di risolvere il problema creandomi una struttura, con 2 campi in cui memorizzo i puntatori dei 2 widget, e nella funzione chiamata poi li utilizzo, in questo modo:


struct _puntatori {
GtkWidget *hbox;
GtkWidget *optionmenu;
GtkWidget *textbox;
};

typedef struct _puntatori Puntatori;
...
void generate_om_from1 ( GtkWidget *widget, gpointer data )
{

GtkWidget *menu;
GtkWidget *optionmenu1;
GtkWidget *menu_option_1;
GtkWidget *menu_option_2;
GtkBox *hbox;
Puntatori *p;

p = (Puntatori *) data;
hbox = (GtkBox *) p->hbox;
....
}

GtkWidget * do_entry ( GtkWidget *widget )
{
GtkWidget *hbox;
GtkWidget *menu;
GtkWidget *optionmenu1;
GtkWidget *menu_option_1;
GtkWidget *menu_option_2;
GtkWidget *menu_option_3;
Puntatori p;

hbox = gtk_hbox_new ( FALSE, 3 );
gtk_container_add ( GTK_CONTAINER(widget), hbox );

p.hbox = hbox;
p.optionmenu = NULL;
p.textbox = NULL;
...
menu_option_1 = gtk_menu_item_new_with_mnemonic (" ");
g_signal_connect ( G_OBJECT(menu_option_1), "activate", G_CALLBACK(generate_om_from1), (gpointer) (&p) );
...
}


Ma porca zozza mi viene restituito questo messaggio in run time:

(gtk-menu:6928): GLib-GObject-WARNING **: invalid uninstantiatable type `<invalid>' in cast to `GtkBox'

(gtk-menu:6928): Gtk-CRITICAL **: file gtkbox.c: line 371 (gtk_box_pack_start): assertion `GTK_IS_BOX (box)' failed

debuggando l'applicazione ho visto che all'interno della callback i valori di hbox non sono gli stessi di quelli nella funzione chiamante e l'errore dovrebbe stare li ...

Ciao
Arpeda

Arpeda
14-04-2004, 12:06
mentre scrivevo il post ho trovato la soluzione ....
ho semplicemente spostato tutta la funzione do_entry nel main del programma ed ora il programma funziona correttamente.

la versione di gcc che uso č la seguente:
gcc (GCC) 3.3.2 20031218 (Gentoo Linux 3.3.2-r5, propolice-3.3-7)

ciao
Arpeda