On Tue, 2008-02-12 at 23:24 -0300, Sebastian Gonzalez wrote: > Hola: > me llamo sebastian gonzalez, llevo un par de meses en todo esto del > sofware libre y opensource, hace unos dias empeze a aprender GTK+ para > tratar de contribuir, ya hago ventanas, botones, box, y todo lo > basico. my pregunta es: como puedo utilizar la misma vetana al pasar a > otra funcion?, ya que cuando paso a otra funcion tengo que hacer otra > ventana > Hola Sebastian,
Si, justamente el truco esta por aqui, La definicion de las se~ales es que puedas pasar un parametro arbitrario (un gpointer) para la funcion que tengas como receptor de tu se~al. Sin snipear, el codigo que colocaste... > gtk_signal_connect(GTK_OBJECT(boton), "clicked", > GTK_SIGNAL_FUNC(boton_funcion), NULL); > > De antemano, gracias. > > PD: les mando el codigo para que entiendan lo que quiero hacer. > > #include <gtk/gtk.h> > > void boton_funcion(); > > int main (int argc, char * argv[]){ > > GtkWidget *ventana, *boton, *etiqueta2; > GtkWidget *vbox; > > gtk_init(&argc, &argv); > > ventana=gtk_window_new(GTK_WINDOW_TOPLEVEL); > gtk_window_set_default_size(GTK_WINDOW(ventana), 200, 200); > boton=gtk_button_new_with_label("Boton"); > etiqueta2=gtk_label_new("Presione el boton para tener otra > ventana"); > vbox=gtk_vbox_new(TRUE, 0); > gtk_box_pack_start((GtkBox *) vbox, etiqueta2, TRUE, TRUE, 0); > gtk_box_pack_start((GtkBox *) vbox, boton, TRUE, TRUE, 0); > gtk_container_add(GTK_CONTAINER(ventana), vbox); > gtk_signal_connect(GTK_OBJECT(ventana), "delete_event", > GTK_SIGNAL_FUNC(gtk_main_quit), NULL); > gtk_signal_connect(GTK_OBJECT(boton), "clicked", > GTK_SIGNAL_FUNC(boton_funcion), NULL); > gtk_window_set_title(GTK_WINDOW(ventana), "Ventana"); > gtk_widget_show_all(ventana); > gtk_main(); > return 0; > } > void boton_funcion(){ > GtkWidget *etiketa, *boton, *ventana2; > > ventana2=gtk_window_new(GTK_WINDOW_TOPLEVEL); > etiketa=gtk_label_new(" Otra ventana mas "); > gtk_container_add(GTK_CONTAINER(ventana2), etiketa); > gtk_window_set_title(GTK_WINDOW(ventana2), "boton_funcion"); > gtk_widget_show_all(ventana2); > } ...tiene un problema. En este caso, cuando llamas a la funcion boton_funcion, lo que le pasas realmente es un gpointer. Y puedes encapsular casi cualquier cosa ahi. Incluso, un widget. La definicion de una funcion de recepcion de se~al cuando existe la se~al button.clicked es static void funcion (GtkWidget *widget, gpointer data) dice que widget es el widget que llama la funcion, y data es el puntero a otro tipo de datos. Y puedes pasar incluso un control GtKWidget por ahi. Por ejemplo, en esta linea gtk_signal_connect(GTK_OBJECT(boton), "clicked", GTK_SIGNAL_FUNC(boton_funcion), NULL); Puedes perfectamente cambiarla a gtk_signal_connect(GTK_OBJECT(boton), "clicked", GTK_SIGNAL_FUNC(boton_funcion), (gpointer) ventana ); De ahi cuando declares tu funcion: static void boton_click (GtkWidget * widget, gpointer data) Usas algo como GtkWidget * ventanawd = (GtkWidget *) data; Y como existe un arbol de herencias en GTK+ para determinar un widget en particular (por algo puedes pasarlo a una se~al) podrias buscarlo, pero es algo mas lento. Creo que German podria aclarar mas la melcocha que acago de decir. Saludos! --j