gtk-demo

GUIアプリの基本はXlibだが、Xlibをそのまま使ってプログラムを書くのは非常に面倒。
http://www.postgresql.jp/branch/shikoku/300c30aa30fc30f330bb30df30ca30fc2007-5fb35cf6300d306e30bb30df30ca30fc8cc76599/5fb35cf630bb30df30ca30fc-897f5c3e.pdf/view
で以前発表してるけど、フォントを指定したり、文字色や背景色を指定しないと、どうにもならない。
しかし、GUIアプリの基本である。

  • 1.初期化
  • 2.無限ループ(イベント・シグナルの処理)
  • 3.終了処理

というパターンで一応作成可能。

面倒なことが嫌いな場合は、toolkitを使う。基本はXt(X toolkit)であるが、これも非常に面倒。ということで、gtk+というGIMPという画像処理ソフト用に開発されたツールキット(Gimp ToolKit)を調査する。

URLは以下の通り。
http://www.gtk.org/


上記のpdfファイルにも書いてあるが、基本的にはデモを見てから作るのが楽だと思う。そのデモはgtk-demoというコマンドで実行できる。手元の環境では、

$ which gtk-demo
/usr/bin/gtk-demo
$ rpm -qf /usr/bin/gtk-demo
gtk2-devel-2.16.3-1m.mo6.i686

となっている。

とりあえず、ソースコードを眺めてみる。
http://www.gtk.org/download-linux.html
ここからダウンロードし、

$ tar xzf gtk+-2.16.3.tar.bz2
$ cd gtk+-2.16.3

gtk-demoのソースコードを探すため、Makefile.amを調査する。

$ find . -name "Makefile.am" -exec grep gtk-demo {} \+
./demos/Makefile.am:SUBDIRS = gtk-demo
./demos/gtk-demo/Makefile.am:bin_PROGRAMS = gtk-demo

これより、./demos/gtk-demoというディレクトリにあることが分かる。findコマンドの使い方は、infoを読むこと。findのセキュリティに対する修正は読む価値がある。

./demos/gtk-demo/Makefile.amを読むと、

gtk_demo_SOURCES =              \
        $(demos)                \
        demo-common.h           \
        main.c                  \
        demos.h

こんな記述がある。これで、gtk-demoをビルドするために使用するソースコードがこれだけあるということが分かる。$(demo)というのは、それより上でdemoという変数に代入されている。

しかし、それらのソースコードgtk-demoというアプリケーションを実行するとソースコードが見れるので、そちらを見ていく。

$ gtk-demo

で起動すると、左右に二つの枠で表示されるアプリケーションが実行される。左側がデモのリストで、右側に情報タブとソースタブがある。
左側のリストをダブルクリックすると、デモウィンドウが表示され、もう一度ダブルクリックすると、デモウィンドウが消える。Sourceタブをクリックすると、そのウィンドウを表示するソースコードを見ることができる。

残念ながら、このソースコードはウィンドウを表示する(または消去する)ためのものなので、単体でビルドすることはできないし、ヘッダファイルdemo-common.hをincludeするものは、かなり編集しないとビルドできない。

しかし、基本的には、

GtkWidget *
do_demoname

ではじまるところを、

int
main

で書き直し、

  if (!window)

の内部をmain関数として記述するとビルド可能なソースコードになる。ビルドするためには、gccへオプションを渡してあげる必要があるのだが、
http://openseminar.okaya.ma/2009/wiki.cgi?page=%B8%F8%B3%AB%BB%F1%CE%C1
ここの、GUIプログラム入門(3)を見てもらいたい。
pkg-configについては、別の機会に書こうと思う。

さて、これで簡単なGUIプログラムが書くコードサンプルが揃ったので、今度は適当なサンプルを使ってパッケージにしてみる。