SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

GTK+プログラミング:プレゼンテーション支援ツールの開発

アンチョコ付きプレゼンテーションツール「Prompter」

Prompterプログラムの解説(1/3)

 それではPrompterの実装を例題にして、GTK+プログラミングの基礎を解説します。

ファイル構成とデータ構造

 Prompterは、以下のC言語ソースファイルに分割されて記述されています。これらのソースコードに対応したヘッダファイルがあるほか、すべてのファイルから読みこまれるヘッダファイルの「prompter.h」があります。「prompter.h」には、全体に関係する定義が記されています。

Prompterのソースファイル
ファイル名説明
ctrl.cスライド操作のコントロールを行います。
data.cスライドの入れ換えに伴うデータ操作を行います。
gui.cスライドやノートの表示などGUI関連の処理を行います。
opt.cコマンドラインオプションの処理を行います。
util.cエラー処理付きのメモリ確保など、汎用の処理を定義しています。

 各ファイルに記述されるソースコードに関連したデータ構造は、各々のヘッダファイルで定義されます。その関連を次図に示します。各スライドのページ情報を格納するPmptPage型のデータ以外は、PmptCtrl型のデータを介して相互に参照可能となっています。

Prompterのデータ構造
Prompterのデータ構造

処理の骨格

 ではまずメイン関数から見ていきましょう。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関係の処理の定義をひとつのファイルにまとめたかったことと、将来の拡張用として、やや冗長な設計としました。

次のページ
Prompterプログラムの解説(2/3)

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

飯尾 淳(イイオ ジュン)

1970年生まれ。株式会社三菱総合研究所 情報通信技術研究本部 情報技術研究グループ 主任研究員。専門は、画像処理とユーザインタフェース……のはずが、なぜか最近はOSS普及振興の手伝いで多忙な毎日を過ごしている。著書に「Linuxによる画像処理プログラミング」、「リブレソフトウェアの利用と開発~I...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/389 2006/05/24 00:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー