GNOME

Which Glade do you use?

現在、翻訳作業中の GTK+ リファレンス・マニュアルではウィジェットのサンプルを必要に応じて挿入できるようになっており、GUI セクション単位で翻訳し終わったら画像を作るようにしている。その際に、GUI の動きを視覚的に確認する時はたいてい Glade のお世話になっているのだけれども、GTK+ の 1.0系から変わらぬインタフェースを提供してきた 2.0系の他に、3.0系 (一応、安定版?) と 3.1系 (それとも開発版?) では Glade 自身のインタフェースが大きく異なるので、ちょっととまどってしまう。
3.0系以前、紹介したように 2.0系を踏襲してか、UI パレットやプロパティ・ダイアログ、そしてツリー・ダイアログがそれぞれ separated になっている:
glade-3-3.0.2-20061204.png
一方の 3.1系は、全てのダイアログを一つのウィンドウの中に integrated したものになっている:
glade-3-3.1.2-20061216.png
3.1系では、複数のユーザ・インタフェースの定義を一つの .glade ファイルにまとめている場合、個々のインタフェースを切り換えながら表示することになり、これが結構面倒な状況を作り出す可能性あり。3.0系では、それぞれ別個のウィンドウとして表示されるのでインタフェース間で比較しながら設計できるけど、3.1系では完全な切り換え方式なためちょっとつらい。
一応、共にアンドゥ/リドゥ機能をサポートしているのは非常にありがたく、.glade ファイルのインポート/エキスポートも可能なので GUI アプリケーションの開発における UI と実機能を分離して設計できるようになっているのだけれど、やっぱり「簡単」で「素早く」ユーザ・インタフェースを設計するには、デザイナ側の操作性も重要なんだけれどねぇ :|。慣れなのかなぁ。
他にも Gazpacho というpython ベースのデザイナも開発が進んでいるようだけれども、今ひとつ不安定で存在感が無いというか…:P:
gazpacho-0.7.0-20061204.png
ja.po を翻訳する手前、個人的には一つに固定して欲しいなぁ (タイミング良く こんなメールが流れていたな、そういえば)。
で結局、リファレンス・マニュアルに挿入する画像はプログラムを直接書いていろいろ大きさなどを調節したものを使っている。

GTK+ Ref. translation progress (TAKE 5).

第三章 「GTK+ のウィジェットとオブジェクト」の Numeric/Text Data Entry まで完了:)
このセクションにあるウィジェットは、ユーザに何か文字列を入力してもらう場面や上限/下限値を持つような値を視覚的に指定するような場面でよく利用するインタフェースであり、入力を促すメッセージを表示する GtkLabel とペアにして利用することが多い。特に、現代のユーザ・インタフェースは未だキーボードに依存する場面が多々あり、ユーザが入力したデータを解析し加工するのがアプリケーションの主たる目的とするならば、これらのインタフェースは必須なわけだ。
人間工学の観点からみると、キーボードという入力機器は必ずしも最適なハードウェアではないと言われるけれども、現代の UI ツールキットでは、このような人間とハードウェアとの間にあるギャップを埋めるような利便性を追求する方向で実装していくことで、一応、満足しているようだ。それは GTK+ も例外ではなく、キーボードから文字列を入力するのを支援するための補完機能を提供している。GTK+ の場合、その実装はちょっと複雑だけれど、アプリケーションから利用する API はとても簡単。例えば:

01: /* -*- Mode: C; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- */
02: /*
03:  * gcc -g -o entry-completion `pkg-config --cflags --libs gtk+-2.0` gtkentrycompletion.c
04:  */
05: #include <gtk/gtk.h>
06: 
07: GtkTreeModel *
08: create_completion_model (void)
09: {
10:   GtkListStore *store;
11:   GtkTreeIter iter;
12: 
13:   store = gtk_list_store_new (1, G_TYPE_STRING);
14: 
15:   /* Append one word */
16:   gtk_list_store_append (store, &iter);
17:   gtk_list_store_set (store, &iter, 0, "GNOME", -1);
18: 
19:   /* Append another word */
20:   gtk_list_store_append (store, &iter);
21:   gtk_list_store_set (store, &iter, 0, "total", -1);
22: 
23:   /* And another word */
24:   gtk_list_store_append (store, &iter);
25:   gtk_list_store_set (store, &iter, 0, "totally", -1);
26: 
27:   /* And another word */
28:   gtk_list_store_append (store, &iter);
29:   gtk_list_store_set (store, &iter, 0, "エントリの補完", -1);
30: 
31:   return GTK_TREE_MODEL (store);
32: }
33: 
34: int main (int   argc,
35:           char *argv[] )
36: {
37:   GtkWidget *window;
38:   GtkWidget *vbox;
39:   GtkWidget *frame;
40:   GtkWidget *hbox;
41:   GtkWidget *vbox1;
42:   GtkWidget *entry;
43:   GtkEntryCompletion *completion;
44:   GtkTreeModel *completion_model;
45: 
46:   gtk_init (&argc, &argv);
47: 
48:   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
49: 
50:   vbox = gtk_vbox_new (FALSE, 1);
51:   gtk_container_add (GTK_CONTAINER (window), vbox);
52: 
53:   frame = gtk_frame_new ("");
54:   gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
55: 
56:   hbox = gtk_hbox_new (FALSE, 3);
57:   gtk_container_add (GTK_CONTAINER (frame), hbox);
58: 
59:   vbox1 = gtk_vbox_new (FALSE, 1);
60:   gtk_box_pack_start (GTK_BOX (hbox), vbox1, FALSE, FALSE, 40);
61: 
62:   entry = gtk_entry_new ();
63:   gtk_box_pack_start (GTK_BOX (vbox1), entry, FALSE, FALSE, 15);
64: 
65:   completion = gtk_entry_completion_new ();
66:   gtk_entry_set_completion (GTK_ENTRY (entry), completion);
67:   g_object_unref (completion);
68: 
69:   completion_model = create_completion_model ();
70:   gtk_entry_completion_set_model (completion, completion_model);
71:   g_object_unref (completion_model);
72: 
73:   gtk_entry_completion_set_text_column (completion, 0);
74: 
75:   gtk_widget_show_all (window);
76: 
77:   gtk_main ();
78: 
79:   return 0;
80: }

このプログラムは、文字列を入力するウィジェットGtkEntryCompletion 型オブジェクトを追加して、キーボードから文字列を全て入力することなく、入力したい文字列を選択できるよう促すインタフェース。このオブジェクトは GtkTreeModel というツリー型の「データベース」を保有しており、その中に入力を補完するためのキーワードを登録しておくと、実際に入力している最中に補完候補としてそのキーワードをプルダウン型のセル・ウィジェットに表示してくれる。ウェブ・ブラウザで URI を入力するような場面ではおなじみのインタフェースだ。
その詳細は:
7〜32行の create_completion_model() の中で補完候補のキーワードを登録している。store がキーワードを格納するデータベースで、iter はキーワードを格納した場所を保持し、入力した文字列と照会した結果を取り出す際に使用する。この関数はキーワードを格納したデータベースを main() に返す。
34行以降が main() 関数で、インタフェースを表現するウィジェットをいろいろ生成し gtk_main() でおなじみのループに入る。文字列の入力に関連するウィジェットの生成は62行以降で、それ以前はインタフェースを構成するいろいろなウィジェットを見栄え良く配置する処理だ。
62〜63行目で GtkEntry ウィジェットを生成し window にパッキングする。そして、65〜66行目で補完機能を提供する GtkEntryCompletion 型の見えないオブジェクトを生成して、専用の関数で GtkEntry に追加する。69行目では、前述の補完候補のキーワードを登録する関数を呼び出してそのデータベースを受け取り、専用の関数で GtkEntryCompletion 型オブジェクトに関連付ける。73行目でちょっと見栄えを整え、74行目で全てのウィジェットを表示し、最後にループに入るといった感じ。とても簡単。ちなみに、66行目で関連付けたデータベースはコピーがセットされるので 67行目で解放することが可能。
ということで、オリジナルの英語版には無いけれど、このプログラムを実行した結果をウィジェットの見本に追加しておく。
See Also GTK+ リファレンスマニュアル: v2.8.x 版の API リファレンス (未だ翻訳中)
See Also CVS リポジトリ: GTK+ リファレンスマニュアルの CVS リポジトリ (英文併記)

GTK+ Ref. translation progress (TAKE 4).

第三章 「GTK+ のウィジェットとオブジェクト」の Display WidgetsButtons and Toggles まで完了:)
これらのセクションにあるウィジェットは、GTK+ アプリケーションでもっともよく利用するインタフェースの類だ。インタフェース的にも機能的にもシンプルだからか。たいていのグラフィカルなインタフェースは、ここにあるラベルやボタンの類で表現できるとも言えし。
バージョン 1.2系と 2.0系の間でも、これらのウィジェットの API に大きな違いはなく、追加されているとすると、補助的なアクセラレータを表すニーモニック (mnemonic) に関するものぐらいかな。
See Also GTK+ リファレンスマニュアル: v2.8.x 版の API リファレンス (未だ翻訳中)
See Also CVS リポジトリ: GTK+ リファレンスマニュアルの CVS リポジトリ (英文併記)

Whoo! Brasero can now burn on my machine.

前のバージョンで CD に書き込めなかった問題は最近リリースされた v0.5.1 では修正された模様:

2006 : 0.5.1
This is a bug fix release:
- Many fixes for DVD+RW size/content detection
- Fixes/improvements for blanking DVD+-RW, now allow to use quick option
- Add pmount to potentially (u)mount volumes

(リリースノートより抜粋)
ということで、データ CD を作成してみた:
brasero_can_burn_cd-20061118.png
ドライブのランプが点滅しているので、どうやら書き込みは問題なさそう。
brasero_can_complete_burn-20061118.png
うm。完了したようだ。ついでに、データの一貫性も確認してみる:
brasero_can_check_consistency-20061118.png
ちょっと時間がかかったけれど、ちゃんとデータが書き込まれていた :)
ということで、ja.po を更新して commit しておいた。

A frontend of Gdb for GNOME.

Gdb をサポートした Namiver をビルド・インストールしてみた。まだ v0.1.0 ながらも普通にデバッグができる (Gdb の単なる GUI フロントエンドなので当然といえば当然だけれども :)):
メイン・ウィンドウ
nemiver-0.1.0-2006111901.png
ソース・コードは Gtksourceview のC++ラッパーを使って強調表示が可能。
基本的なデバッグ・コマンド (しか無いのだけれど) は Gdb に準じている:
コンテキスト・メニュー
nemiver-0.1.0-2006111902.png
デバッグ・ターゲットを普通に呼び出すこともできるし:
nemiver-0.1.0-2006111903.png
コア・ファイルからデバッグもできるし:
nemiver-0.1.0-2006111904.png
実行中のプロセスにもアタッチできる:
nemiver-0.1.0-2006111905.png
それに加えて、Nemiver 上でデバッグしている際のセッションを保存することができ、任意に読み込んで作業へ復帰できる:
nemiver-0.1.0-2006111906.png
メイン・ウィンドウの下側にあるペインには、デフォルトの Gdb のコマンドを実行したりデバッグ・ターゲットの出力結果なども表示できる。
といった感じ。似たようなフロントエンドとしては DDD があるけれど、それの GTK+版を目指しているようだ。未だリモートデバッグができないなど、機能的にはこれからだけれども。というか、このアプリの作者が以前作っていた MlView も長い時間をかけた割には中途半端で完成していないので、この先どうなるか分からないけれども、一応 ja.po を作っておいた。次回のリリースあたりで送付してみるかな。