目次


GNOMEnclature

GNOME 2 に備える: 第1 回

これからの展望

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: GNOMEnclature

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:GNOMEnclature

このシリーズの続きに乞うご期待。

この連載記事について

装いも新たなGNOMEnclatureコラムへようこそ!新たなコンテンツで再出発したこのコラムは、GNOME 2プラットフォームを最大限に利用するためのお手伝いをします。最初のいくつかの記事では、GNOME 2とGNOME 1の相違点について示し、GNOMEに関する最先端の知識を皆さんに提供します。これらの記事は、これからGNOMEアプリケーションの作成に取りかかろうとする開発者にとっては、理想的な入門編となり、また、GNOME 1からGNOME 2への既存アプリケーションの移植を必要とするGNOME開発者にとっても心強い味方となることでしょう。

まず、基礎を固めましょう。そして、GNOME 2の基礎を理解できたところで、さらに掘り下げて、GNOME 2プラットフォームにおいて新しいライブラリーを最大限に活用する方法を紹介します。このシリーズが最終回を迎える頃までに、独自のNautilusビューの記述、panelアプレットの作成など、さまざまな成果が期待できるでしょう。

この記事について

GNOMEはGTK+ をベースとして構築されているため、GTK+ 1.2とGTK+ 2の間の変更内容について説明することが、この連載記事のスタートとして最もふさわしいでしょう。第1回のこの記事では、GTK+ 2に注目し、新しいウィジェットとGTK+ 2が使うATLおよびPangoライブラリーについて簡単に説明することにします。この連載の後半では、GTK+ 2オブジェクト・システムをさらに掘り下げて検討し、今回の記事で取り上げる2つの新しいウィジェットについても詳しく説明します。

GTK+ 2入門

次世代GTK+ について詳しく見ていく前に、おそらく皆さんは、GNOME 2が製品版にいつ組み込まれるかという点について関心をもっていることでしょう。GNOME 2は、2002年2月15日にリリースが予定されています。GnumericやEvolutionのような大規模なアプリケーションは、その後しばらくしてからGNOME 2に移植されることになります。

それでは、GTK+ について話を進めることにしましょう。GTK+ は本来、Gimp (GTKはGimp ToolKitの略語)での使用のために開発されたものです。GTK+ は、現在LinuxやWindowsを始めとする多くのプラットフォームで提供されています。さらに、GNOME、Mozilla、Gimpに代表される膨大な数のフリー・ソフトウェアでも使用されています。

GTK+ 1と同様、GTK+ 2もGLibに依存していますが、これはCの開発者にとって有用なライブラリーです。GLibは、オブジェクト・システムや、ハッシュ・テーブル、リスト、ツリーなどのデータ構造を始め、多くの優れた機能を備えており、プログラミング作業を容易なものとします。

GTK+ 2はまた、ATKおよびPangoにも依存しています。ATKはアクセシビリティ・ツールキットであり、身体に障害のあるユーザーがGTK+ を利用できるようにするためのものです。Pangoは、国際化対応テキストを出力するためのフレームワークです。この両パッケージについては、この記事の後半で説明します。

GTK+ 2のインストール

この記事を最大限に活用するためには、GTK+ 2を立ち上げ、動作させることをお勧めします。GTK+ 2をインストールするにあたっては、まずpkg-config 0.8以上がシステムにインストール済みであることを確認してください。主なディストリビューションにはすべて、pkg-configを提供するパッケージがあります。もちろん、GTK+ 2もglib、atk、pangoなどの外部ライブラリーに依存しています。これらのライブラリーは、GTK+ 2のコンパイルよりも先にインストールが必要です。通常、手順としては、glib、atk、pango、gtk+ source tarballs (この記事の最後の参考文献を参照)の最新バージョンを先にダウンロードすることが最もよいでしょう。最新の「vx.y」ディレクトリーは、現在「v1.3」となっています。

これまでずっとGTK+ 2について話しておきながら、GTK+ 1.3のインストールを勧めるのは、奇妙に思われるかもしれません。しかし、これには理由があります。この記事の執筆時点では、GTK+ 1.3.11が、提供されているGTK+ の最新のバージョンでした。GTK+ に完全な本番使用の態勢が整えば、GTK+ 2.0がリリースされる予定です。それまでの間、テストで使用するのはGTK+ 1.3でも十分です。GTK+ 1.3には、正式なGTK+ 2.0リリースの新機能のほとんどが搭載されています。

さて、この点をはっきりさせたところで、新しいGTK+ をインストールする話に戻りましょう。GTK+ 2にはビルド時の依存関係がいくつかあるため、最初にglibをインストールし、続いてatk、pango、gtk+ の順にインストールすることが重要です。各パッケージを次のようにインストールします。

リスト1. GTK+ および サポート・ライブラリー・ソースのインストール
tar xzvf package-version.tar.gz
cd package-version
./configure
make
make install

すべてのインストールが終わると、gtk-demoを起動することができます。この小さなプログラムによって、GTK+ 2がどのように動作するのかを見ることができます。

では、GTK+ 2で加わった新機能にはどのようなものがあるでしょうか。多くの人々の要望に応える機能の1つは、GTK+ でアンチエイリアス化フォントを使用できるという機能です。これはGTK+ 2の新機能です。GTK+ 2フォントのアンチエイリアシングは、Xftライブラリーと、XFree86 4以上のXRender拡張機能によるものです。

環境変数GDK_USE_XFT=1を設定するだけで、アンチエイリアス化フォントをGTK+ 2アプリケーションに使用できるようになります。GDK_USE_XFTが1に設定されているシェルから起動するGTK+ 2アプリケーションはすべて、アンチエイリアス化テキストを出力します。アンチエイリアス化テキストを使用可能にして、もう一度gtk-demoを実行してみてもよいでしょう。

アンチエイリアス化テキストを使用したダイアログの例
アンチエイリアス化テキストを使用したダイアログの例

ダブル・バッファー方式とイメージ処理

GTK+ 2のグラフィックに関する改良点は、フォント・アンチエイリアシングだけではありません。GTK+ 2はダブル・バッファー方式によって、表示画面の更新を行います。GTK+ 1はダブル・バッファー方式を備えていなかったため、GTK+ 1アプリケーションでは、再描画やサイズ変更の際にちらつきが発生することもありました。GTK+ 2にはこの問題はなく、新しいGTK+ 2アプリケーションでははるかにスムーズな描画が可能です。

単純に見栄えが良くなったのに加えて、GTK+ 2には開発者の視点からも多くの改良が加えられています。たとえば、GdkPixbuf (以前は独立したライブラリー)がGTK+ に属すようになりました。GdkPixbufは、GIF、PNG、JPEG、BMPなどさまざまな形式による画像データの読み込みと保存を行います。GdkPixbuf がGTK+ の一部となったことにより、GTK+ 自体でそれらの機能が利用可能となり、メニュー、ツールバー、ボタンのために、アルファ・ブレンドされたアイコンを作成できるようになりました。

これは、gnome.gifという小さな画像データをロードするGTK+ 2のサンプル・プログラムです。

このサンプル・プログラムでは、gtk_image_new_from_file()関数を使ってGtkImageオブジェクトを作成します。GtkImageオブジェクトは、自動的にこの画像データをロードしますが、GdkPixbufを内部的に使用してこれを行います。

リスト2. GtkImageオブジェクトを使用してイメージを表示
#include <gtk/gtk.h>
int
main (int argc, char **argv) 
{
	GtkWidget *window;
	GtkWidget *image;   
	gtk_init (&argc, &argv);
	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
	g_signal_connect (G_OBJECT (window), "destroy", gtk_main_quit, NULL);
	image = gtk_image_new_from_file ("gnome.gif");
	gtk_container_add (GTK_CONTAINER (window), image);
	gtk_widget_show_all (window);
        
	gtk_main ();
   	
	return 0;
}

この簡単なプログラムのコンパイル方法は以下のとおりです。

gcc `pkg-config --cflags --libs gtk+-2.0` -o image-button image-button.c

コンパイルが終わったら、./image-buttonを実行してみてください。次のように表示されるはずです。

Pango

Pangoは、国際化テキストのレイアウトと表示を行う多機能フレームワークです。Pangoによって、GTK+ 2は米国やヨーロッパ以外の地域の人々にとってたいへん便利なものとなりました。Pangoは、左から右へ読むテキスト以外も処理することができ、複雑な言語も容易に処理することができます。また、使用されるコンテキストに応じてさまざまな形態をとる文字を処理することができます。

Pangoは、双方向テキストをサポートし、左から右へ読むテキストと右から左へ読むテキストを混合することができます。また、アラビア語やタミル語のような各種の複雑な書記法を処理するためのプラグインもあります。しかし、Pangoの機能は、国際化対応機能だけにとどまりません。Pangoライブラリーは、XftおよびXRender拡張機能を利用してアンチエイリアス化テキストの描画を処理することができます。詳細については、Pangoに関するdeveloperWorksの2つの記事(参考文献を参照)をご覧ください。

UnicodeとUTF-8

GTK+ 2では、gtk_*()関数に渡されるストリングは、ユニコードUTF-8エンコード方式になるものと思われます。UTF-8を内部的に使用することで、GTK+ 2は、旧バージョンのGTK+ にあった国際化対応に関する問題をすべて排除することになります。

ASCIIはUTF-8のサブセットであるため、この変更は皆さんが想像するほどには、既存のGTK+ コードに大きな影響を及ぼすものではありません。ただし、ASCIIはUTF-8に直接マップしますが、その逆は真ではありません。英語以外の文字セットの多くは、UTF-8でコード化されると1文字あたり1バイトより多くなります。通常の文字のエンコード方式よりも大きいものを処理するためには、UTF-8ストリング上で文字の反復が必要な場合、g_utf8_next_char() (これは実質的にはマクロ)という名前の特殊な関数を使う必要があります。このマクロは、必要に応じて大/小バイトの「ホップ」を行います。次に、その簡単な例を示します。これはUTF-8ストリングを検査して反復するものです。

リスト3. UTF-8ストリングの検査と反復
gchar *p;
g_return_if_fail (g_utf8_validate (str));
p = str;
while (p) {
        gunichar c = g_utf8_get_char (p)
	
	/* Do something with c. */
	p = g_utf8_next_char (p);
}

ロケールでコード化されたストリングをUTF-8に変換する必要がある場合には、次のように使うことができます。

リスト4. ロケール・エンコード化ストリングのUTF-8への変換
gchar* g_locale_to_utf8 (const gchar *opsysstring,
                         gssize length,
                         gsize *bytes_read,
                         gsize *bytes_written,
                         GError **error);

読み取り/書き込みのバイト数を気にしないのであれば、最後の3つの引数はNULLにすることもできます。NULLで終了するストリングをこの関数に渡す場合には、長さを -1に設定します。たとえば、次のようにします。

utf8_string = g_locale_to_utf8 (locale_string, -1, NULL, NULL, NULL);

Atk、アクセシビリティ・ツールキット

GTK+ 2は、アクセシビリティ・ツールキットであるATKをフルに活用します。ATKは、視覚障害や身体の不自由などの障害のあるユーザーによるGTK+ 2アプリケーションの使用を可能にします。今後の記事では、ATKについてさらに詳細に説明し、障害を持つユーザーによるアプリケーションの利用を可能とする方法について紹介していく予定です。さしあたっては、GNOME Accessibility Project (参考文献を参照)をご覧ください。

ストック・アイテム

GNOME 1とGNOME 2はどちらも「ストック・アイテム」をサポートします。これにより開発者は、共通のメニュー項目やボタンをきわめて簡単にアプリケーションに追加することができます。ストック・アイテムは、アプリケーション内に限らず、グローバルに定義することができるため、GNOMEアプリケーション全体の体裁の統一も容易に行うことができます。

通常、個々のストック・アイテムは、アイコン、テキスト・ラベル、オプショナル・アクセラレーター・キーによって構成されます。またストック・アイテムは、アプリケーションの体裁の統一のほか、国際化対応にも大きく貢献します。翻訳すべきアプリケーションのデータを開発者が個別に持つのではなく、1回の翻訳作業を全体に反映させることが可能となります (GTK+ ライブラリーによって)。また、GNOME 2では、プラットフォーム、ストック・アイテムのサポートがgnome-libsからGTK+ に移されたため、より多くのアプリケーションに対して統一性のある「ルック・アンド・フィール」を与えることができます。

「フロッピー・ディスク」の図柄と「Save」のラベルを持つボタンを作成するサンプル・コードの一部を次に紹介します。

リスト5. 「フロッピー・ディスク」の図柄と「Save」のラベルを持つボタンの作成
GtkWidget *button;
button = gtk_button_new_from_stock (GTK_STOCK_SAVE);

次に示すのは、4つのストック・アイテムを使ったツールバーです。

4つのストック・アイテムを使ったツールバー
4つのストック・アイテムを使ったツールバー

ストック・アイテムは、次のようにメニュー項目にも使うことができます。

リスト6. 「フロッピー・ディスク」の図柄と「Save」のラベルを使うメニュー項目の作成
GtkWidget *menu_item;
menu_item = gtk_image_menu_item_new_from_stock (GTK_STOCK_SAVE);

このコードは、「フロッピー・ディスク」の図柄と「Save」のラベルで構成されるメニュー項目を作成します。さらに、Ctrl+Sキーボード・ショートカットをメニュー項目に自動的に接続します。ストック・アイテムを使うことにより、どのようなプログラムが使われている場合でも、Ctrl-Sが常にデフォルトのショートカットとなります。

ストック・アイテムを利用できる場合には、これによってメニュー項目、ツールバー、ボタンを作成することを強くお勧めします。ユーザー・インターフェースがより統一性のとれたものとなることはもちろん、作業時間とコード行の節約にも役立ちます。

ストック・アイテムはまた、独自のアプリケーションにおいてローカルに作成することもできます。そうすることにより、別の場所にそのアイテムを使う場合にも、時間とコードを節約することができ、また、意味のある分かりやすいアイコンを使うことができるようになります。

マークアップ

GTK+ 2では、テキスト・ウィジェットを指定する際に、さまざまなフォント、サイズ、色、スタイルをより簡単に使用することができます。この新たな機能は、GMarkupという小規模なマークアップ言語をサポートするようになったPangoによって可能となったともいえます。GMarkupは、軽量のXMLライクな構文であり、gtk_*()関数のストリングにタグを埋め込むだけで、さまざまなテキスト・スタイルを指定することができます。次にその例を示します。

リスト7. Pangoマークアップの例
#include <gtk/gtk.h>
int
main (int argc, char **argv) 
{
        GtkWidget *window;
        GtkWidget *label;
        gchar     *markup_text;
                gtk_init (&argc, &argv);
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        g_signal_connect (G_OBJECT (window), "destroy", gtk_main_quit, NULL);
        label = gtk_label_new ("A <span color=\"blue\">blue</span> <big>and</big> <b>bold</b> label");
        gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
        gtk_container_add (GTK_CONTAINER (window), label);
        gtk_widget_show_all (window);
        gtk_main ();
      return 0;
}

また、コンパイルは次のように行います。

gcc `pkg-config --cflags --libs gtk+-2.0` -o label-markup label-markup.c

このコード例は、実行すると次のように出力されます。

Pangoマークアップ
Pangoマークアップ

キーボード・ナビゲーション

いくつかの新機能によって、GTK+ 2では、キーボードのみで簡単なアクセスができるユーザー・インターフェースがより簡単に作成できるようになりました。まず、GTK+ 1の場合に比べて、ウィジェットのフォーカスの切り替えも確実に行えるようになりました。タブと矢印キーのみで、確実に操作ができます。第2に、新しいダイアログ・ウィジェットであるGtkDialogが、Escキーを自動的に処理し、ダイアログを閉じます。第3として、キーボード・アクセラレーター (ニーモニック) の作成もきわめて容易になりました。次の操作を行うだけで、ニーモニックが設定されたボタンを作成することができます。

button = gtk_button_new_with_mnemonic ("_Quit");

次に、Alt+Qを押すことにより、ボタンをアクティブにすることができます。アンダースコアーが前に置かれた文字にはアンダーラインが引かれ、それがキーボード・ショートカットであることを示します。

次に、ノートブック・ページとボタンにニーモニックを使った例を示します。

GTK+ 2ニーモニックの例
#include <gtk/gtk.h>
int
main (int argc, char **argv) 
{
	GtkWidget *window;
	GtkWidget *vbox;
	GtkWidget *label;
	GtkWidget *page;
	GtkWidget *notebook;
	GtkWidget *button;
	
	gtk_init (&argc, &argv);
	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        g_signal_connect (G_OBJECT (window), "destroy", gtk_main_quit, NULL);
	gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
	vbox = gtk_vbox_new (FALSE, 0);
	gtk_container_add (GTK_CONTAINER (window), vbox);
	/* Create our notebook and two pages, with mnemonics. */
	notebook = gtk_notebook_new ();
	gtk_box_pack_start (GTK_BOX (vbox), notebook, TRUE, TRUE, 0);
	label = gtk_label_new_with_mnemonic ("Page _1");
	gtk_notebook_append_page (GTK_NOTEBOOK (notebook), 
	                          gtk_label_new ("Page one"), label);
	
	label = gtk_label_new_with_mnemonic ("Page _2");
	gtk_notebook_append_page (GTK_NOTEBOOK (notebook), 
	                          gtk_label_new ("Page two"), label);
	/* Create a button with a mnemonic as well. */
	button = gtk_button_new_with_mnemonic ("_Quit");
	gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 0);
	/* Make the quit button actually quit. */
	g_signal_connect (button, "clicked", gtk_main_quit, NULL);
	gtk_widget_show_all (window);
	
	gtk_main ();
        
	return 0;
}

コンパイルは、次のように行います。

gcc `pkg-config --cflags --libs gtk+-2.0` -o mnemonics mnemonics.c

表示されたイメージの中のニーモニックに注目してください。

GTK+ ニーモニック
GTK+ ニーモニック
GTK+ ニーモニック

GtkTreeView

GtkTreeViewは、GtkCListとGtkCTreeに代わる新たなツリーおよびリストのウィジェットです。これまで、データとビューの間の論理的な分離が十分ではなく、そのため、カスタムのセル・レンダラーの記述は困難でした。GtkTreeViewを使うことにより、こうした問題は解決されました。さらに、GtkTreeViewには編集可能なテキスト・セルがあり、伸びる矢印 (アニメーション) で画面に彩りを添えることもできます。

稼働中のGtkTreeView
稼働中のGtkTreeView
稼働中のGtkTreeView

GtkTextView

新しいGtkTextViewのウィジェットは、従来のGtkTextのウィジェットから大きく進歩し、たくさんの優れた機能を備えています。

  • 混在するフォント、スタイル、テキスト・カラーの使用をサポートし、行送りと調整の設定が行単位で可能。
  • すべてのテキストがUTF-8で、Pangoによって表示される (完全国際化対応)。
  • 長い行は、ワード・ラップ、または文字単位での折り返しが可能。
  • イメージや、他のウィジェットの組み込みが可能。
  • GtkTextViewは、モデル/ビュー/コントローラーの設計を採用しており、同じテキスト・バッファーの複数ビューをサポート。

新たなGtkTextViewのウィジェットの表示例は以下のようなものです。

稼働中のGtkTextView
稼働中のGtkTextView
稼働中のGtkTextView

結論

GTK+ 2の新たな機能を詳細に検討しました。そこで、これからGNOME 2プラットフォームの他の部分へと話を進めてもよいでしょう。第2回の記事では、新しいGlib-2オブジェクト・システムに関して取り上げます。どうぞ、お楽しみに。では、次回またお会いしましょう。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux, Open source
ArticleID=288054
ArticleTitle=GNOMEnclature: GNOME 2 に備える: 第1 回
publish-date=01012002