Bucle de ejecución y eventos

Como es habitual en cualquier librería de desarrollo de interfaces gráficos, en GTK+ se usa el modelo de programación por eventos. Este modelo consiste en la asociación de determinadas acciones ("eventos") a determinadas operaciones ("funciones"). Dichas acciones, o eventos, marcan un cambio de estado de determinado objeto, de forma que la aplicación pueda ser informada de ello.

Los eventos en GTK se refieren, en terminología GObject, a señales especificadas en la definición de las clases de los distintos widgets. Así, por ejemplo, el widget GtkButton tiene definida una señal llamada "clicked" que es emitida (emitir una señal es la terminología usada en GTK) cuando el botón en cuestión es pulsado por el usuario, de forma que la aplicación no tiene más que "conectarse" a dicha señal para ser informada por GTK+ cada vez que dicho botón es pulsado.

Para que éste sistema de señales funcione correctamente, se usa lo que se denomina el bucle de eventos, que no es más que un bucle interno de GTK+, en el que se van, una y otra vez, comprobando los estados de cada uno de los elementos de la aplicación, e informando de dichos cambios a los elementos que se hayan registrado para ser informados. Este concepto es exactamente idéntico al del bucle de ejecución contenido en la librería GLib, y, de hecho, no es más que una ampliación de dicho concepto para hacerlo funcionar en aplicaciones con interfaz gráfica. Este bucle de eventos GTK+ se traduce básicamente en dos funciones, que son:

	void       gtk_main                (void);
	void       gtk_main_quit           (void);
      

Estas dos funciones, análogas a g_main_run y g_main_quit representan el interfaz que tienen las aplicaciones para usar el bucle de eventos. Como en el caso de su equivalente en GLib, gtk_main ejecuta el bucle de eventos. Esto significa que, una vez que se haya realizado la llamada a gtk_main, se cede todo el control de la aplicación a GTK. Es decir, gtk_main no retorna hasta que, dentro de algun manejador (instalado ANTES de llamar a gtk_main) se haga una llamada a gtk_main_quit, que, como su nombre indica, termina el bucle de eventos de GTK+.

Un ejemplo de una típica aplicación GTK+ sería:

	int main (int argc, char *argv[])
	{
	    gtk_init (&argc, &argv);
	    /* creación del interfaz principal */
	    /* conexión a las distintas señales */

	    gtk_main ();

	    return 0;
	}
      

Como puede comprobarse, el programa inicializa GTK+, crea el interfaz básico, conecta funciones a las distintas señales en las que esté interesado (llamadas a g_signal_connect), para seguidamente llamar a gtk_main para que se ejecute la aplicación. Cuando en algun manejador de señal realicemos una llamada a gtk_main_quit, gtk_main retornará, tras lo cual la aplicación termina.

Señales

Las señales en GTK+ no son más que una muestra de uso extensivo del sistema de objetos de GLib. Las señales son el medio mediante el cual GTK+ informa a las aplicaciones de los eventos producidos en el interfaz gráfico. Estos eventos o señales normalmente estan relacionados con un cambio de estado en determinado widget, como el ejemplo de la clase GtkButton que se mencionaba en el apartado anterior, que tiene definida una señal llamada "clicked" para informar de la pulsación, por parte del usuario, del botón en cuestión.