ターミナル上で動かすプログラムとは違い、GUIのプログラムはユーザーの様々な行動を予測しなければなりません。例えば、ターミナル上では、キーボードからの入力を制御・解析すればいいのですが、GUIプログラムの場合、メニューから何を選択したか、どのボタンを押したか、又はウインドウクローズボタンを押したかどうか、という様々なことを考えなければなりません。
ユーザーが何かの動作を行った場合、それを「シグナル」として認識し、「コールバック関数」に制御を引きわたします。このシグナルとコールバックの考え方がとても重要です。
ユーザーがなにもしない場合、プログラムはずっとなんらかのシグナルがあるまで待機します。GTK+では、gtk_main()関数がその役割を果たします。これは無限ループのようなもので、これを抜け出すためにはgtk_main_quit()を使用します。
以下ではもうすこし具体的に解説します。
Gtkのオブジェクトに対して何かの動作を行った場合、その動作をシグナルとして認識することができます。
g_signal_connect(instance, detailed_signal, c_handler, data);
instanceは動作を受けたオブジェクト、detailed_signalは動作の詳細、c_handlerはコールバック関数名、dataはコールバック関数に渡すデータ名です。
ウインドウ(window)が閉じるボタンを押して閉じるとき(destroy)、プログラムを終了する(gtk_main_quit)
g_signal_connect(window,"destroy",gtk_main_quit,NULL);
ボタン(button1)をクリックしたとき(clicked)、関数func()に引数pointerをつけて引きわたす。
g_signal_connect(button1,"clicked",func,pointer);
コールバック関数の形式は決まっています。
void func(GtkWidget *widget, gpointer data);
GtkWidgetはシグナルを受け取ったオブジェクト、すなわち、g_signal_connectの1番目の引数、gpointerは4番目の引数です。