Puede que se esté preguntando como hacer que GTK haga algo útil
cuando se encuentra en gtk_main
. Bien, tiene varias
opciones. Utilizando las rutinas siguientes puede crear una función
a la que se llamará cada interval
milisegundos.
gint gtk_timeout_add( guint32 interval,
GtkFunction function,
gpointer data );
El primer argumento es el número de milisegundos que habrá entre dos llamadas a su función. El segundo argumento es la función a la que desea llamar, y el tercero, los datos que le pasará a ésta función. El valor devuelto es un ``identificador'' (un valor entero) que puede utilizar para detener las llamadas haciendo:
void gtk_timeout_remove( gint tag );
También puede hacer que cesen las llamadas a la función haciendo que la misma devuelva cero o FALSE. Obviamente esto significa que si quiere que se continue llamando a su función, deberá devolver un valor distinto de cero, es decir TRUE.
La declaración de su función debería ser algo como:
gint timeout_callback( gpointer data );
Otra característica divertida de GTK, es la habilidad que tiene de
comprobar datos por usted en un descriptor de fichero (tal y como
se devuelven por open(2)
o socket(2)
). Esto es especialmente
útil para las aplicaciones de red. La función:
gint gdk_input_add( gint source,
GdkInputCondition condition,
GdkInputFunction function,
gpointer data );
Donde el primer argumento es el descriptor de fichero que desea vigilar, y el segundo especifica que es lo que quiere que GDK busque. Puede ser uno de los siguientes:
Tal y como se habrá imaginado, el tercer argumento es la función a la que desea que se llame cuando se den las condiciones anteriores, y el cuarto son los datos que se le pasarán a ésta función.
El valor devuelto es un identificador que puede utilizarse para que GDK pare de vigilar ese fichero, utilizando la función
void gdk_input_remove( gint tag );
La función a la que quiere que se llame deberá declararse así:
void input_callback( gpointer data,
gint source,
GdkInputCondition condition );
Donde source
y condition
están especificados más arriba.
¿Qué le parece si tuviese una función a la que se llamase cuando no ocurriese nada?
gint gtk_idle_add( GtkFunction function,
gpointer data );
Esto hace que GTK llame a la función especificada cuando no ocurra nada más.
void gtk_idle_remove( gint tag );
No voy a explicar el significado de los argumentos ya que se parece
mucho a los que he explicado más arriba. La función a la que se apunta
mediante el primer argumento de gtk_idle_add
será a la que se
llame cuando llegue el momento. Como antes, si devuelve FALSE hará que
cese de llamarse a la función.