TOC

ターミナル上で動かすプログラムとは違い、GUIのプログラムはユーザーの様々な行動を予測しなければなりません。例えば、ターミナル上では、キーボードからの入力を制御・解析すればいいのですが、GUIプログラムの場合、メニューから何を選択したか、どのボタンを押したか、又はウインドウクローズボタンを押したかどうか、という様々なことを考えなければなりません。

ユーザーが何かの動作を行った場合、それを「シグナル」として認識し、「コールバック関数」に制御を引きわたします。このシグナルとコールバックの考え方がとても重要です。

ユーザーがなにもしない場合、プログラムはずっとなんらかのシグナルがあるまで待機します。GTK+では、gtk_main()関数がその役割を果たします。これは無限ループのようなもので、これを抜け出すためにはgtk_main_quit()を使用します。

以下ではもうすこし具体的に解説します。

シグナル

Gtkのオブジェクトに対して何かの動作を行った場合、その動作をシグナルとして認識することができます。

g_signal_connect(instance, detailed_signal, c_handler, data);

instanceは動作を受けたオブジェクト、detailed_signalは動作の詳細、c_handlerはコールバック関数名、dataはコールバック関数に渡すデータ名です。

例1

ウインドウ(window)が閉じるボタンを押して閉じるとき(destroy)、プログラムを終了する(gtk_main_quit)

g_signal_connect(window,"destroy",gtk_main_quit,NULL);

例2

ボタン(button1)をクリックしたとき(clicked)、関数func()に引数pointerをつけて引きわたす。

g_signal_connect(button1,"clicked",func,pointer);

コールバック関数

コールバック関数の形式は決まっています。

void func(GtkWidget *widget, gpointer data);

GtkWidgetはシグナルを受け取ったオブジェクト、すなわち、g_signal_connectの1番目の引数、gpointerは4番目の引数です。

index / 次へ