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
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