Ver Mensaje Individual
  #14 (permalink)  
Antiguo 29/12/2003, 12:01
gerar
 
Fecha de Ingreso: diciembre-2003
Mensajes: 7
Antigüedad: 21 años, 4 meses
Puntos: 0
No se puede cerrar un gtk_main concreto, se deben ir cerrando al contrario de como se abrieron.
No se muy bien lo que hace tu programa, pero te explicaré lo que yo se sobre el main loop y tal vez así puedas resolver el problema. Por cierto, esto vale para cualquier lenguaje de programación, ya que el funcionamiento de GTK+ es el mismo para todos y las instrucciones te las pongo en C porque veo que es el lenguaje que tu estas utilizando.

Como sabes, en el modelo de programación por eventos, tu creas los widgets de tu aplicación y en un momento determinado tu programa se queda parado, esperando los eventos (señales) del sistema o del usuario (como puede ser un click sobre un boton, etc). Esto en GTK+ se gestiona con lo que se denomina "bucle de eventos" (main loop) que es un bucle interno desde donde GTK+ controla los estados de los elementos de la aplicación. Cuando tu haces gtk_main() estas cediendo el control de tu programa al main loop de GTK+.

El bucle de eventos de GTK+ es único, el hecho de que hagas varios gtk_main no genera nuevos bucles que manejas eventos distintos, de hecho todas las instancias de gtk_main() son funcionalmente idénticas, todas ellas vigilan la misma cola de eventos y el mismo bucle.

La utilidad de crear varias instancias de gtk_main() en un programa, suele ser simplemente para bloquear o parar el flujo del programa mientras no se produzcan ciertas condiciones, por ejemplo en un dialogo modal para mostrar un mensaje al usuario:

gtk_window_set_modal (GTK_WINDOW (dialog));
gtk_signal_connect (GTK_OBJECT (dialog), "destroy",
GTK_SIGNAL_FUNC (gtk_main_quit()), NULL);
gtk_widget_show (dialog);
gtk_main();

Si el usuario destruye este dialogo, se ejecuta un gtk_main_quit() que anula el gtk_main() del dialogo y nos devuelve al flujo normal del programa. Por tanto, siempre hay que ir haciendo pares de gtk_main y gtk_main_quit.

Nunca deberían producirse problemas como el que comentas si se utilizan los gtk_main para hacer algo sencillo como en el ejemplo anterior, para manejos mas complicados es mejor utilizar gtk_grab_add con la técnica que nos ha mostrado epplestun.

Por tanto, como verás, las ventanas de tu aplicación no están asociadas a ningún bucle gtk_main, simplemente lo que pasa es que cuando haces el último gtk_main_quit se cierra el bucle y se acaba el programa y en consecuencia se destruyen las ventanas que quedan vivas.

En cualquier caso, puedes jugar con gtk_main_level que te devuelve el numero de gtk_main() que quedan por cerrar, ya que cada vez que haces un gtk_main se suma uno al level y cada vez que haces un gtk_main_quit se resta uno al level.

Saludos