아마 gtk_main에서 어떻게 GTK에게 유용한 작업을 하게 만들지 궁금할 것이다. 여기에는 몇가지 옵션이 있다. 이 함수를 이용하면 매 millisecond마다 호출될 타임아웃 함수를 만들수 있다.
gint gtk_timeout_add (guint32 interval,
GtkFunction function,
gpointer data);
첫번째 인자는 우리가 함수를 호출하는데 걸린 시간이다. 두번째는 부르려 했던 함수고, 세번째는 이 callback함수로 넘겨진 데이터다. 리턴값은 정수형의 "tag"으로 이 함수를 호출함으로써 타임아웃을 중지하기 위해 쓰인다.
void gtk_timeout_remove (gint tag);
우리는 callback함수에서 0또는 FALSE를 리턴함으로써 이 타임아웃 함수를 중지시킬 수도 있다. 당연히 이것은 우리의 함수가 계속되기 위해서는 0이 아닌 값, 말하자면 TRUE를 리턴해야 함을 의미한다.
우리의 callback함수의 선언은 이런 형태로 해야한다.
gint timeout_callback (gpointer data);
GTK의 또다른 괜찮은 기능 하나는, 우리를 위해 파일 식별자(file descriptor) 의 데이터를 체크해 준다는 점이다(open(2) 혹은 socket(2)로 리턴되는대로). 이것은 특히 네트웍 어플에 유용하다. 이 함수를 보자.
gint gdk_input_add (gint source,
GdkInputCondition condition,
GdkInputFunction function,
gpointer data);
첫번째 인자는 보고자 하는 file descriptor고, 두번째는 GDK가 찾을 것을 설정해 준다. 이것은 이들 중 하나가 될 것이다.
GDK_INPUT_READ - 우리의 file descriptor를 읽을 준비가 된 데이터가 있을 때 우리의 함수를 호출한다.
GDK_INPUT_WRITE - 우리의 file descriptor가 쓸(write) 준비가 되었을 때 우리의 함수를 호출한다.
이미 눈치챘겠지만, 세번째 인자는 위의 조건이 만족될 때 호출될 함수고, 네번째는 이 함수에 넘겨질 데이터다.
리턴값은 GDK가 file descriptor를 모니터하는 것을 아래의 함수를 이용해서 멈추게 할 tag이다.
void gdk_input_remove (gint tag);
Callback함수가 선언되어야 한다.
void input_callback (gpointer data, gint source,
GdkInputCondition condition);
더이상 아무것도 일어나지 않을 때 호출할 함수는 무엇인가?
gint gtk_idle_add (GtkFunction function,
gpointer data);
이것은 더이상 아무것도 발생하지 않을 때 GTK가 지정된 함수를 호출하도록 해준다.
void gtk_idle_remove (gint tag);
이 함수의 인자들은 위에서 설명한 어느 것과 매우 비슷하기 때문에 여기서 또 설명하진 않겠다. gtk_idle_add의 첫번째 인자로 주어진 함수는 기회가 오면 언제든지 호출될 것이다. 다른 것들과 마찬가지로, FALSE를 리턴하게 되면 idle 함수는 호출이 중단될 것이다.