X Window Systemプロトコルとアーキテクチャ
ウィンドウマネージャは、ウィンドウの全体的見た目や他のGUI要素を制御する。X Window System が使用されているマシン毎に異なる見た目となるのは、主にウィンドウマネージャが違うためか、あるいはウィンドウマネージャの設定が異なるためである。
ウィンドウマネージャは、ウィンドウの位置決め、ウィンドウ周囲の装飾の配置、アイコンの処理、特定キーストロークの処理(例えば ALT-F4 押下でウィンドウをアイコン化するなど)といった処理をする。
Xサーバから見れば、ウィンドウマネージャも通常のクライアントと違いはない。初期の位置決めや周囲の装飾の配置は、ウィンドウマネージャによる以下のような要求で制御される。
アプリケーションは、サーバがウィンドウの子ウィンドウを表示する前に、イベントを送信してもらうよう設定できる。
アプリケーションは、親ウィンドウの変更を要求できる。
ウィンドウマネージャは、第一の要求を使ってトップレベルウィンドウ(ルートウィンドウの子ウィンドウ)の表示要求をインターセプトする。他のアプリケーションがトップレベルウィンドウの表示を要求すると、サーバは表示する前にウィンドウマネージャにイベントを送る。
各ウィンドウには事前定義された属性群とプロパティ群があり、それらは全てサーバに格納されていて、クライアントは適切な要求によってそれらにアクセスできる。属性とは、大きさ、位置、背景色などのウィンドウに関するデータである。プロパティとは、ウィンドウに付加されたデータである。属性とは異なり、プロパティはX Window System コアプロトコルのレベルでは何の意味も持たない。クライアントは任意のデータをウィンドウのプロパティに格納できる。
プロパティには、名前と型と値がある。命令型プログラミング言語における変数に似ていて、アプリケーションは新たなプロパティを生成するときに名前と型を指定し、値を格納できる。プロパティはウィンドウ毎にあるので、各ウィンドウに同じ名前のプロパティがある場合、型と値はそれぞれ異なる。
プロパティはクライアント間通信で主に使われる。例えば、WM_NAMEという名前のプロパティはウィンドウの名前を格納するのに使われる。ウィンドウマネージャはこのプロパティを読んで、そのウィンドウの上辺に名前を表示する。
ウィンドウのプロパティ群はxpropプログラムを使って表示できる。特にxprop -rootとすればX resource(en:X resourcesを含むルートウィンドウのプロパティが表示される。
ウィンドウ、フォントなどに関する全てのデータはサーバに格納される。クライアントはそれらオブジェクトの識別子を知っている。識別子は整数であり、サーバとやり取りする際のオブジェクトを指定する名前の役割を果たす。例えば、クライアントがウィンドウを生成したい場合、サーバに対して識別子を指定してウィンドウ生成を要求する。サーバはウィンドウを生成すると、それを指定された識別子と結びつける。この識別子はその後のクライアントからの要求に使われる(例えば、そのウィンドウに文字列を描画する場合など)。
識別子はサーバ上で一意であり、クライアント間でも重ならない。2つの異なるクライアントが作成したウィンドウであっても、2つのウィンドウが同じ識別子を持つことはない。クライアントは、自身が生成したオブジェクトでなくとも、識別子さえ知っていれば、そのオブジェクトにアクセスできる。