2009年02月22日

gtkに手をつけてみた。

SDLでテキストを表示するには自前でテクスチャーを用意するか
SDL_ttfを使うかで簡便というには程遠い。
gtkはWindowsでいうとwin32APIとかMFCといったところだろうか
不必要に巨大にならないのであれば使える部分は使いたいと考え
なんかデモでも/usr/local/binに転がっているかと探したら
実用的なコマンドツールはないものの
gtk-demoとpygtk-demoというのがあった。
そこでgtkによるプログラミングの可能性ほ調べてみた。
gtk-demoのサンプルだがソース自体表示してくれる。
これらを単独でビルドするには関数として宣言してある部分を


int
main(int argc, char **argv)
{
gtk_init(&argc, &argv);

に書き換え

最初の方をコメントアウトしつつ閉じるように変更

// gtk_window_set_screen (GTK_WINDOW (window),
// gtk_widget_get_screen (do_widget));//戻り用なのでいらない


// g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), //&window);
g_signal_connect(G_OBJECT(window), "destroy", //← destroyシグナルハンドラを
G_CALLBACK(gtk_main_quit), NULL); //← gtk_main_quitに設定


メインループを追加して関数の終わりをウィジェットでなくてintに変更

gtk_main(); // ← メインループを実行
return 0;

という形で

ビルドは

gcc -O2 -o gtk_001 gtk_001.c \
`pkg-config gtk+-2.0 --cflags --libs`


みたいにした。
実行時は現状libXext-1.0.5,1のせいで余計なエラーメッセージがでるので



./gtk_001 2> /dev/null

とエラーメッセージを削る形で起動させる。

というのは現時点でGUIが必要なのは入力と出力のインターフェース目的としてだと考えられるからだ。
ビルド時間は短いのでソースだけでの運用すら可能と感じるものもおおかったがそのまま使えるものはなかった。
とりあえずカラーダイアログと印刷ダイアログ、インプットを変更するダイアログデモは
ウィジェット理解の助けになりそうだ。

ここでいくつかのデモのうちdemo-common.hとその実態がないと動かないことに気づいた。
あとファイルサイズはせいぜい10kbyteなのだが使用リソースが結構大きいので
メッセージボックスを多数出すようなものは一つのアプリとして作らないと不味いと感じた。

もう一つのpygtk-demoだがぱっとみはgtk-demoと同じだ。
python用のgtkバインディングはxfce環境に必須であるため
これだけでもpythonを覚える意味はあるかと思ったが
よくみるとgtk-demo以上に漠然としたサンプルだった。またこれも使用リソースがより大きい。
ただpython自体のサンプルとしても良いと思ったが
はじめて触ったpythonはスクリプト自体にテキスト処理をしてしまうと解釈できなくなってしまう仕様であり
blender等以外では使いたくない感じだ。

ここでgtk-1.2とperlバインディングについてもみてみたが
perlのgtk2バインディングはなにやらいれなくてはいけないものが多い。
これをやるならpygtkを素直に使った方が良いと思い
p5-gtkというgtk1.2のバインディングの方だけ試してみた。
gtk2よりリソースは若干少ないものの挙動が怪しい。あえて使うメリットはないとみた。

gtk-1.2でhello world的な事もやってみたがいろいろな相性の問題があるのか
ウィジェットのサイズ調整がうまくできなかった。

なんやかやでちょっとした入力やメッセージなら
ターミナルソフトをshかperlで起動した方がよっぽど汎用性があると感じた。

gtkで特に使ってみたかったというか真面目に作る気が起きないので欲しいものとしては
ファイルダイアログがあるのだがgtk-demoにはなかったので
アイコンとかいらないのでなんとかテストするものをくみたててみた。

引数を初期値として選んだ値を返す。
ほんとはokボタンだけにしたかったのだが組み方が分からなかったのだ。

/*
gcc -O2 -o gtk_005 gtk_005.c \
`pkg-config gtk+-2.0 --cflags --libs`

./gtk_005 test 2> /dev/nul
//*/
#include

static void file_sel( GtkWidget *w,
GtkFileSelection *fs )
{
g_print ("%s\n", gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs)));
}

int main( int argc,
char *argv[] )
{
GtkWidget *filew;

gtk_init (&argc, &argv);

filew = gtk_file_selection_new ("File selection");

g_signal_connect (G_OBJECT (filew), "destroy",
G_CALLBACK (gtk_main_quit), NULL);

/* "ok_button" ->file_ok_sel*/
g_signal_connect (G_OBJECT (GTK_FILE_SELECTION (filew)->ok_button),
"clicked", G_CALLBACK (file_sel), (gpointer) filew);

/* "cancel_button" -> gtk_widget_destroy */
g_signal_connect_swapped (G_OBJECT (GTK_FILE_SELECTION (filew)->cancel_button),
"clicked", G_CALLBACK (gtk_widget_destroy),
G_OBJECT (filew));

//初期値
if ( argv[1] ){
gtk_file_selection_set_filename (GTK_FILE_SELECTION(filew), argv[1]);
//
}
gtk_widget_show (filew);
gtk_main ();
return 0;
}



このファイルダイアログとインプット、メッセージボックス、パラメータ入力、あるいは作業プロセス表示など
文字のあるようなものをコマンドラインで使えるものを数点揃えたい。
リソース使用量の点からみてもSDLの方がフレームワークとしては優れているというのも今回の結論ではある。
ラベル:GTK
posted by Xo_ox at 23:17| Comment(0) | FreeBSDアプリ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。