Prompterプログラムの解説(1/3)
それではPrompterの実装を例題にして、GTK+プログラミングの基礎を解説します。
ファイル構成とデータ構造
Prompterは、以下のC言語ソースファイルに分割されて記述されています。これらのソースコードに対応したヘッダファイルがあるほか、すべてのファイルから読みこまれるヘッダファイルの「prompter.h」があります。「prompter.h」には、全体に関係する定義が記されています。
| ファイル名 | 説明 |
| ctrl.c | スライド操作のコントロールを行います。 |
| data.c | スライドの入れ換えに伴うデータ操作を行います。 |
| gui.c | スライドやノートの表示などGUI関連の処理を行います。 |
| opt.c | コマンドラインオプションの処理を行います。 |
| util.c | エラー処理付きのメモリ確保など、汎用の処理を定義しています。 |
各ファイルに記述されるソースコードに関連したデータ構造は、各々のヘッダファイルで定義されます。その関連を次図に示します。各スライドのページ情報を格納するPmptPage型のデータ以外は、PmptCtrl型のデータを介して相互に参照可能となっています。

処理の骨格
ではまずメイン関数から見ていきましょう。main()は「ctrl.c」で定義されています。
int main (int argc, char** argv) { PmptOpt opt; PmptGUI gui; PmptData data; PmptCtrl ctrl = { &opt, &gui, &data }; opt.ctrl = gui.ctrl = data.ctrl = &ctrl; pmpt_gui_init (&gui, &argc, &argv); pmpt_opt_init (&opt, argc, argv); pmpt_data_load (&data); pmpt_gui_config (&gui); pmpt_gui_main (&gui); return 0; }
メイン関数の7行め(空行は除く)までで、データ構造の初期化を行います。pmpt_opt_init()ではコマンドライン引数を解析してデータファイルの指定やオプション設定の処理も行います。
続いてpmpt_data_load()でデータファイルの読み込みを行います。この関数はファイル「data.c」で定義されています。GTK+プログラミングとは関係ないため詳細な説明は省きますが、ファイルを1行ずつ読み込み、ページ区切りとして利用している^Lで区切りながらページデータのリスト構造を作っていきます。そして最後に総ページ数の配列を確保し、リストを手繰って順次PmptPage型の配列に格納するという処理を行っています。
その後の処理がいよいよGTK+プログラミングの本質です。まずpmpt_gui_config()でGUIのウィジットやスライド表示の初期設定を行います。そしてpmpt_gui_main()でメインループに入ります。
このてのGUIプログラミングでは、GUIの設定をしたあと、最後にイベントループを入る関数を呼ぶというスタイルが一般的です。GTK+も御多分にもれず、イベントループに入る関数gtk_main()を呼ぶと、そこから抜け出す処理が行われない限りは戻って来ません。後は、ユーザーの操作などで生じるイベントに従って呼び出される関数が、その都度、コールバックされます。このような処理をイベントドリブンと言います。
どのようなイベントが起こるとどの関数が呼び出されるかは、ウィジットの初期設定の際に決めておきます。今回は、ウィンドウの破棄が行われたときの振舞いと、キーを押されたときに呼び出される関数だけを設定しました。
ところで、実はpmpt_gui_main()の中味はgtk_main()だけです。したがってpmpt_gui_main()を呼ぶかわりにgtk_main()を直接呼んでもかまいません。GUI関係の処理の定義をひとつのファイルにまとめたかったことと、将来の拡張用として、やや冗長な設計としました。
