X Window System コアプロトコルは、ネットワーク環境でグラフィカルユーザーインターフェース(GUI)を構築するための基本プロトコルです。このプロトコルは、クライアント・
サーバモデルに基づき、
サーバがディスプレイやキーボード、マウスなどの
入出力デバイスを制御し、アプリケーションはクライアントとして動作します。クライアントと
サーバ間、およびクライアント間のやり取りを規定し、ウィンドウの描画やイベント処理などの基本機能を提供します。また、Xコアプロトコルと呼ばれることもあります。
プロトコルの構造
X Window System コアプロトコルでは、パケットは要求(Request)、応答(Reply)、イベント(Event)、エラー(Error)の4種類に分類されます。これらのパケットは、ネットワークを通じて非同期に転送されます。
- - 要求パケット: クライアントからサーバに対して、ウィンドウの生成などの操作を依頼します。
- - 応答パケット: サーバが要求に応じてクライアントにデータを返します。
- - イベントパケット: サーバからクライアントに、ユーザーの操作やシステムの事象を通知します。
- - エラーパケット: サーバが要求処理中にエラーが発生したことをクライアントに知らせます。
パケットの送受信順序はプロトコル上では厳密に規定されていませんが、要求パケットが応答、イベント、エラーパケットを生成する可能性があります。
設計思想
X Window System の設計原則は「機構を生成するものであって、ポリシーを生成するものではない」というものです。この原則に基づき、コアプロトコルはクライアント間の具体的なやり取りについては規定せず、別の仕様である ICCCM や freedesktop.org の仕様に委ねています。また、ウィジェットツールキットを使うことで、アプリケーションの見た目や操作性が規定されるようになっています。
コネクションの確立
クライアントと
サーバ間の通信は、パケットの交換によって行われます。クライアントが
サーバへの接続を確立し、最初のパケットを送信します。このパケットには、使用する
エンディアン、プロトコルのバージョン、
認証方式などが含まれています。
サーバは、接続を受け入れるか、
認証のためのパケットを返すか、または接続を拒否します。
接続が受け入れられると、クライアントは
サーバからデータを受け取り、その後の通信で使用します。
ウィンドウ
X Window System では、GUIで一般的に使われる「ウィンドウ」を「トップレベルウィンドウ」と呼び、ウィンドウ内ウィンドウを「サブウィンドウ」と呼びます。ボタンやメニューなどのグラフィカル要素もサブウィンドウとして扱われます。
クライアントは、既存のウィンドウのサブウィンドウの生成を要求できます。これにより、ウィンドウは階層構造を形成し、そのルートとなるのがルートウィンドウです。ルートウィンドウは
サーバ起動時に自動的に生成され、画面全体を覆う特殊なウィンドウです。トップレベルウィンドウは、ルートウィンドウの直接のサブウィンドウです。
ウィンドウの内容は常に保持されるとは限りません。ウィンドウが移動、リサイズ、隠蔽されると、内容が失われる場合があります。クライアントは「バッキングストア」を要求できますが、
サーバが必ずしも応じるとは限りません。従って、クライアントはバッキングストアに依存せず、再描画が必要な場合はそのイベントを受け取り処理する必要があります。
各ウィンドウは、サイズ、位置、背景画像、バッキングストア要否などの属性を持ちます。ウィンドウは、InputOutput型(画面表示あり)またはInputOnly型(入力専用)のいずれかです。ウィンドウの外枠や
タイトルバーは
ウィンドウマネージャが作成し、クライアントは関与しません。
ピクスマップと描画領域
ピクスマップは、描画に使用されるメモリ領域です。ピクスマップの内容が直接ウィンドウに表示されるのではなく、ピクスマップとウィンドウ間でデータの転送が行われます。これにより、ダブルバッファリングなどの高度な描画技術が実現します。
ウィンドウとピクスマップは総称して「描画領域」と呼ばれ、描画領域のデータは
サーバ側に保存されます。クライアントは、
サーバに描画領域の内容を要求したり、描画データを
サーバに送信したりできます。
グラフィックコンテキストとフォント
クライアントは、領域の生成、コピー、点、線、多角形、テキストなどの描画操作を
サーバに要求できます。これらの操作には、「グラフィックコンテキスト」と呼ばれるパラメータの構造体が用いられます。グラフィックコンテキストには、前景色、背景色、テキストフォントなどが含まれます。
フォントは
サーバ側で管理され、
ファイルシステムから読み込まれたり、フォント
サーバからネットワーク経由で取得されます。クライアントは、利用可能なフォント一覧を取得し、フォントのロード/アンロードを要求できます。また、テキストを描画するために必要なスペースを問い合わせることもできます。
フォント名はXコアプロトコルレベルでは任意の
文字列であり、X Logical Font Description Conventions により、属性に対応した命名規則が規定されています。
最近では、クライアント側でフォントを用意することが多くなり、
サーバ側フォントの使用は減少傾向にあります。
ウィンドウ、ピクスマップ、フォントなどのデータは全て
サーバに格納され、クライアントはそれらのオブジェクトの
識別子を使って
サーバにアクセスします。これらのオブジェクトを「リソース」と呼びます。リソースを生成する際、クライアントは
識別子を指定する必要があります。
識別子は32
ビット整数で、クライアントごとに一意です。
リソースが生成されると、クライアントはその
識別子を使って
サーバに操作を要求します。
識別子は、クライアントだけでなく、
サーバ全体でも一意です。このため、あるクライアントで生成したリソースを別のクライアントが操作することも可能です。リソースは、生成したクライアントとの接続が閉じられたときに削除されます。
イベント
イベントは、
サーバからクライアントに送信されるパケットで、ユーザーの操作やウィンドウの状態変化などの事象を通知するために使用されます。イベントは常にウィンドウに関連付けられており、クライアントはイベントマスクを設定することで、受け取るイベントの種類を指定できます。
Exposeイベントは、ウィンドウの一部が表示されたときに送信され、クライアントはその部分を再描画する必要があります。
色
色は、32
ビットの符号なし
整数であるピクセル値で表現されます。ピクセル値は、カラーマップと呼ばれる
RGB値のテーブルに対応付けられます。カラーマップの扱い方によって、PseudoColor、StaticColor、GrayScale、StaticGray、DirectColor、TrueColorの6種類のvisual classがあります。
X
サーバは、
色深度ごとに複数のvisual typeをサポートします。クライアントはウィンドウ生成時、
色深度とvisual typeの
識別子を指定する必要があります。
ハードウェアの制約によって、カラーパレットが制限される場合があり、その場合は標準カラーマップを利用することで、異なるアプリケーション間で色の一貫性を保つことができます。
アトム
アトムは、
文字列を表す32
ビット整数です。アトムは、
文字列を短い固定サイズで表すことで、ネットワーク効率を向上させるために導入されました。クライアントは、
サーバに対してアトムの生成を要求できます。アトムは特定のクライアントに関連付けられておらず、
サーバが終了するまで存続します。
プロパティ
ウィンドウは、属性とプロパティを持ちます。属性はウィンドウのサイズや位置など、プロパティはウィンドウに関連付けられた任意のデータです。プロパティには名前、
データ型、値があり、これらは全てアトムとして表現されます。
プロパティは、主にクライアント間通信に使用され、例えばウィンドウの名前や状態を共有するために利用されます。
ウィンドウマネージャは、ウィンドウのプロパティを読み、
タイトルバーにウィンドウ名を表示したりします。
キーマッピング
X Window Systemでは、物理キーにkeycodeが割り当てられ、押下されたキーを特定します。keycodeは、キーに印字された文字や用語(keysym)と関連付けられます。キーが押下または解放されると、
サーバはクライアントにKeyPressまたはKeyReleaseイベントを送信し、クライアントはkeycodeと修飾状態からkeysymを特定し、対応する文字を生成します。
修飾キーは、他のキーの解釈を変える役割を果たし、シフトキー、コントロールキー、Altキーなどが含まれます。X
サーバは、
修飾キーとkeycodeの対応表を保持しており、クライアントが変更することも可能です。
グラブ
グラブとは、キーボードとマウスの全イベントを特定のクライアントに送信する状態です。クライアントは、キーボードのグラブ、マウスのグラブ、または両方のグラブを要求できます。グラブには、アクティブグラブとパッシブグラブの2種類があります。
グラブを使用すると、あるクライアントが他のクライアントからのイベントを遮断し、特定の操作に集中できます。
その他
Xコアプロトコルには、ウィンドウ間の親子関係、セレクション、入力フォーカス、
カーソル形状などに関する要求があります。また、クライアントは特定のリソースの所有者を終了させる要求もでき、
サーバはその接続を終了させます。
拡張
X Window System コアプロトコルは、拡張性を考慮して設計されています。拡張は、新たな要求、応答、イベント、エラーパケットを追加することで、プロトコルの機能を拡張します。
クライアントが
サーバに接続する際、
サーバは接続を許可するか、拒否するか、
認証を要求することができます。
認証プロセスはプロトコルでは規定されておらず、
認証の種類に依存します。
Xlib とその他のクライアントライブラリ
多くのクライアントプログラムは、
Xlibというクライアントライブラリを通じてX
サーバと通信します。
Xlibは、クライアントが応答とイベントの観点で同期的に動作できるようにします。また、
Xlibは要求をバッファリングし、明示的に送信されるまで
サーバに送信しません。
上位のライブラリ(Xt、Xaw、Motifなど)では、イベントに対応したコールバック関数を使用できます。一方、
XCBなどの下位レベルのライブラリはプロトコルへの非同期アクセスを提供します。
Xコアプロトコルで指定されないこと
X Window System コアプロトコルでは、クライアント間通信やGUI要素の実現方法は規定されていません。これらの機能は、ICCCM、freedesktop.org、ウィジェットツールキットなどの別の仕様でカバーされています。
クライアント間通信は、セレクション、カットバッファ、ドラッグアンドドロップ、
ウィンドウマネージャ、セッションマネージャと密接に関連しています。また、ユーザーセッションの開始方法もXコアプロトコルでは規定されていません。