GNOMEだけじゃない標準
このお約束は、自由を縛る、というものといより、知識や経験を明文化していったものであると言える。このようなお約束は必ずしもGNOMEだけに閉じたものではない。GNOME以外のフリーのデスクトップ環境であるKDEや、デスクトップ環境に縛られない旧来の形のアプリケーションにとっても有用なものはGNOMEの世界の外でまとめてしまったほうが役に立つ。そのようなお約束を開発し、まとめている場所であるfreedesktop.orgの提供する標準たちをいくつか紹介しよう。
freedesktop.orgとは、GNOMEやKDEといったデスクトップ環境のプロジェクトとは独立したグループである。LinuxなどのUNIX系OSとX Window System上をデスクトップとして利用するために必要な技術に関する標準を提案し、まとめ、公開している場である。ここで提案されているものがすべてのプロジェクトで採用されるというわけではないが、GNOMEやKDEなどで実際に使われているものもある。
X Window Systemというウインドウシステムは、ポリシーではなくメカニズムを提供するものである、というのが目標となって開発されてきた。アプリケーション間でどのようなデータを構成するのか、画面構成やツールキットはどういう姿をするべきか、などといった約束事はほとんどない。なんらかの約束事を策定し、運用するのに使える基礎的な土台のみが提供されている。
そのために柔軟性は高く、いろんなことはできるといえるのではあるが、その反面、アプリケーション間の統一感、連携性に乏しい。ちょっとしたアプリケーションを作るにしても自分でさまざまなお膳立てをせねばならず、GUIであることを十分で活かせるのはむつかしかった。商用UNIX OSではMotif/CDEやOpenViewなどが提案されてきたが、MacやWindowsなどのパソコン用のシステムにくらべてかなり見おとりのするものでしかなかった。そのような状況を打破すべく、Qtツールキットを用いたKDEや、GTK+ツールキットを使ったGNOMEが提案され開発されてきているのである。
デスクトップ環境のプロジェクトとしてはKDEやGNOME以外にもGNU Step、XFCE、Enlightment、Window Maker、ROXなど他のものもあるが、それらで完全に独自の道を完全に進んでしまうのは無駄である。共通して使える知識や技術は共有してしまおうというのが、freedesktop.org (X Desktop Group)である。freedesktop.orgではさまざまな標準、規約、技術が公開されているが、その中からGNOMEやKDEで使われている3つのものについて紹介しよう。
Extended Window Manager Hints
GNOMEとはウインドウマネージャの一種である、などという誤解に基づく解説を昔は良く見たのものだが、さすがにそのようなものは減ってきた。では、ウインドウマネージャとは具体的には何だろう。ウインドウマネージャが従うべき動作はX11の附属文書である、Inter-Client Communication Conventions Manual(以下、ICCCM) に記述されている。ここでは、ウインドウマネージャ以外のアプリケーション(X11クライアント)がウインドウマネージャに対して提供すべき情報(プロパティ)、どのようなイベントが通知されるのか、が列挙されている。
プロパティとしてどのようなものがあるのか、具体的に見てみるにはxpropを使うことができる。Xで何かターミナル、たとえばktermやgnome-terminalなどを起動し、その上でxpropというコマンドを入力してみよう。マウスカーソルが十字形に変化するので、適当なウインドウの上でクリック。すると、プロパティの名前(WM_NAMEなど)、型(STRINGとかCARDINALとか)、値(“emacs21@machine”や123など)、がずらずらと表示される。
ウインドウマネージャが気にするのは「WM_」で始まる名前のプロパティだ。WM_NAMEがウインドウの名前、ウインドウの状態(通常状態か、アイコン状態か)を示すWM_STATE、アイコン状態の時に表示する名前を示すWM_ICON_NAME、といったものがICCCMで定義されている。
しかしこのICCCMで定義されている情報だけでは、イマドキのデスクトップを実現するには不足である。この不足を補うものとして、freedesktop.orgで「Extended Window Manager Hints(以下、EWMH)」が提供されている。
EWMHでは_NET_で始まる名前のプロパティを定義している。ベンダ独自のプロパティは_で始まるものを使うように、と、ICCCMではされている。
EWMHで定義されているプロパティとしては、仮想デスクトップの数を表現する_NET_NUMBER_OF_DESKTOPS、アプリケーションの「アイコンの画像データ」を格納する_NET_WM_ICON、ウインドウの名前をUTF-8で表現した_NET_WM_NAME、アイコン状態か通常状態か非表示か、程度しかウインドウの状態を表現できないWM_STATEを補助するものとしての_NET_WM_STATE、などなどがある。_NET_WM_STATEでは最大化されているのか、タスクバーに表示すべきではない、全画面表示している、などを表現可能だ。GNOMEにおいては、GTK+(のGDK/X11)で実装されている。
System Tray
System Trayとは、アプリケーションの管理下にあるパネル上に表示されるアイコンで、アプリケーションのなんらかの状態を表示するものである。Windows XPでは通知エリアなどとも呼ばれているものだ。メールソフトがメールの新着を通知したり、インスタントメッセージのアプリケーションがメッセージの到着を示したり、音楽演奏ソフトが音楽を再生中かどうか、などを表示する。GNOMEでは「通知エリアアプレット」というものをパネルにはりつけておくと、System Tray規約をサポートしたアプリケーションからの情報が、このアプレット上に並んで表示される。サポートしたアプリケーションとしてはインスタントメッセンジャーであるgaimや、音楽演奏ソフトのxmms(のxmms-statusプラグイン)がある。
このSystem Trayによって、アプリケーションがどのワークスペースにあろうとも、緊急の情報をユーザに提示することができるため、チャットやゲームなどのアプリケーションでも有用かもしれない。
GNOMEにおいては、共通に使われるライブラリはない。そのかわり、libeggという、標準ライブラリとして採用される前段階の開発の場所となっているモジュール内の、trayというコンポーネントにSystem Trayを実装したコードがある。各アプリケーションは、ここからソースコードを自分に取りこんで実装している。将来のGNOMEのライブラリには標準的なAPIが提供されることになるかもしれない。
Desktop Entry Specification
Desktop Entry Specificationでは、アプリケーションと、その起動方法、アプリケーションの説明、アイコンデータといった情報をまとめたファイルである「Desktop Entries」とよばれるファイルの形式を定めている。GNOMEやKDEのランチャは、この Desktop Entriesを読みこんでメニューにアイコンや説明を表示し、ユーザが選択すると、そこに記載された手順によってアプリケーションを起動する。ファイルの拡張子は .desktop とすることになっている。また「ディレクトリ」を表現するファイルの名前としては「.directory」が使われる。
GNOMEの標準的なファイルマネージャであるNautilusは、このデスクトップファイルを見つけると、それを元にアプリケーションを起動したり、他のフォルダを開いたりするアイコンを表示する。また、デスクトップに置かれるホームへのリンクや「ここからスタート」なども、このDesktop Entriesの形式のファイルとして~/.gnome-desktop(あるいは~/Desktop)に置かれている。
Desktop Entriesは単純なテキストファイルであり、表示に使用する名前、その各国語での表現、アイコンの画像データのファイル名、アプリケーションの起動コマンドライン、などが key=value の形式で列挙される。文字コードは、以前は各国語ごとのエンコーディングがまざった状態になっていたが、最近ではUTF-8に統一されている。
その他
freedesktop.orgでは、以上の他に、GTK+やQtのアプリケーション間で共通にドラッグ&ドロップが扱えるXdndや、アプリケーションが参照したファイルの履歴を記録する手順や形式を定めたRecent File Storage Specification、グラフィックビューアやファイルマネージャが記録する画像のサムネイルの保存方法を定めたThumbnail Managing Standard、アプリケーションが起動中であることをシステムに通知し、ユーザに視覚的なフィードバックなどを与えることができるようにするためのStartup Notification等々の情報が公開されている。
X用のアプリケーションを開発する際、それがGNOMEやKDE用のものではなくても、ここに挙げられたような手順や規約、技術を使ってみることを検討してみるのはいかがだろうか。