X Window System コアプロトコル
多くのクライアントプログラムは、Xlibというクライアントライブラリを通してXサーバと通信する。クライアントは一般に Xaw、Motif、GTK、Qt といったライブラリを使うが、これらもXサーバとの通信には Xlib を使っている。Xlib を使うことで、以下のようになる。
Xlib を使うと、クライアントは応答とイベントの観点で同期的に動作可能となる。 Xlib では、要求を送信すると適当な応答があるまでブロックする。言い換えれば、Xlib を使っていないクライアントがあったとしたら、要求パケット送信後に応答を待つ間に他の処理が可能である。ただし、クライアントがマルチスレッド化されている場合は、Xlib を使っていても同様のことが可能である。 Xサーバは非同期にイベントを送信するが、Xlib はイベントをクライアント内のキューに蓄積する。クライアントは、明示的にライブラリ関数を呼び出したときだけそのキュー上のイベントにアクセスする。言い換えれば、クライアントがあるイベントを待っている場合、強制的にブロックまたはビジーウェイトとなる。
操作には、リソースを変化させるもの(例えば、ウィンドウを移動させる要求)と、サーバからそのリソースに関するデータを得るもの(例えば、ウィンドウの属性を要求する場合)がある。
識別子はクライアント内だけでなく、サーバ内で一意である。例えば、2つのウィンドウがそれぞれ別のクライアントが生成したものであっても、同じ識別子を持つことはない。クライアントは識別子さえ指定できれば、任意のオブジェクトにアクセスでき、例えば別のクライアントが生成したリソースも識別子が分かっていればアクセスできる(サーバから与えられた範囲外の識別子をサーバへの要求パケットに指定可能である)。
結果として、同じサーバに接続された2つのクライアントがあるとき、識別子によって一意にリソースが指定される。例えば、あるクライアントが識別子 0x1e00021 のウィンドウを生成し、その番号 0x1e00021 を別のアプリケーションに渡したとする(手段は何でも良い。例えば、ファイルに番号を書き込み、それを別のアプリケーションが読むという方法でもよい)。すると、その別のアプリケーションが同じウィンドウに対して操作可能となる。これは例えば Ghostviewの X 版で利用されている。Ghostview はサブウィンドウを生成し、その識別子を環境変数にセットして Ghostscript を呼び出す。Ghostscript は PostScript ファイルの内容をそのウィンドウに描画する。
リソースは、それを生成したクライアントがサーバとのコネクションをクローズしたときに正常に削除(破壊)される。ただし、コネクションをクローズする前にクライアントから破壊を要求することもできる。
ピクスマップとは、描画に使われるメモリ領域である。ピクスマップの内容がそのままウィンドウとして表示されるわけではなく、ピクスマップの内容(の一部)がウィンドウに転送されたり、逆にウィンドウからピクスマップに内容が転送されたりする。これによりダブルバッファリングなどの技法が可能となっている。ウィンドウ上で可能なグラフィカルな操作の多くは、ピクスマップ上でも可能である。
ウィンドウとピクスマップを総称して「描画領域; drawables」と呼ぶ。描画領域の内容データはサーバ側に置かれる。クライアントはサーバに対して描画領域の内容を転送してもらうこともできるし、逆に内容をサーバに送ることもできる。
Xlib では要求をサーバに即座に送信せず、output buffer というキューに蓄積する。その内容が実際に送信されるのは、以下のタイミングである。 XFlashなどのライブラリ関数を使って明示的に送信を要求したとき。 Xサーバからの応答を待つ必要のあるライブラリ関数を呼び出したとき(例えば、XGetWindowAttributes)。 イベントキューにイベントがあるか問い合わせたとき(例えば、XNextEvent 呼び出し)で、かつブロックするような呼び出しをしたとき(例えば、XNextEvent はキューが空だとブロックする)。
Xtのような上位ライブラリ(さらに上位として Xaw や Motif がある)では、イベントに対応したコールバック関数を使うことができる。つまり、上位ライブラリがイベントキューを常時監視し、必要に応じて適切なコールバック関数を呼び出す。また、ウィンドウの再描画が必要となるようなイベントは Xt 内部で処理される。
XCB などの下位レベルのライブラリはプロトコルへの非同期アクセスを提供し、レイテンシ隠蔽効果が大きい。