X Window Systemプロトコルとアーキテクチャ
クライアントプログラムの多くは、Xlibというクライアント用ライブラリを経由してサーバと通信する。さらに、多くの場合Xlibを直接使うのではなく、Motif、GTK、Qt といったライブラリを使う。
X Window System コアプロトコルは、クライアント間の通信機構としてプロパティとイベントを提供しており、特にクライアント間のメッセージイベントがある。しかし、そのやり取りを規定するプロトコルは存在しない。そのようなプロトコルは個別のクライアント間通信規定で扱われる。
Inter-Client Communication Conventions Manualは、セレクションによるそのようなデータ交換のプロトコルとウィンドウマネージャとアプリケーションのやり取りを規定している。しかし、この仕様には混乱があり、理解するのが困難と言われてきた。アプリケーションのルック・アンド・フィールと通信の一貫性は、一般にデスクトップ環境を指定してプログラミングすることで保たれる。
Inter-Client Exchange (ICE) プロトコルはクライアント間のやり取りのためのプロトコル構築のフレームワークとなり、これを使って特定のプロトコルを構築できる。例えば、X Session Manager Protocol (XSMP) はICEに基づくプロトコルで、Xセッションマネージャ(後述)とアプリケーション間のやり取りを規定している。
より新しい規定としてfreedesktop.orgによる仕様群がある。これには、Xdnd(ドラッグ・アンド・ドロップ規定)、Xembed(あるアプリケーションを別のアプリケーションの子ウィンドウとして動作させる際の詳細な規定)などがある。
X Window System コアプロトコルはセレクションの交換に対応した要求やイベントを用意しているが、転送自体はクライアント同士のイベント送信とウィンドウプロパティで実現され、これはセレクションの転送に限った話ではない。
クライアント間で転送されるデータには様々なものがある。テキストであることが多いが、ピクスマップや数値やオブジェクトのリストなどもある。
セレクションとドラッグ・アンド・ドロップは能動的機構である。あるウィンドウ上でテキストを選択した場合、そのウィンドウを制御しているクライアントがデータを要求しているアプリケーションにデータを転送するプロトコルを能動的にサポートしていなければならない。対照的にカットバッファは受動的機構である。ユーザーがテキストを選択した場合、その内容はカットバッファに転送され、元のウィンドウを制御していたアプリケーションが終了してウィンドウが消えても、カットバッファ内の内容は残る。
多くのウィンドウマネージャはRe-parenting Window Managerと呼ばれ、フレームウィンドウと呼ばれる大きなトップレベルウィンドウを生成し、本来のウィンドウをその子ウィンドウとして表示する。画面上はフレームウィンドウの内側に本来のウィンドウが表示される。フレームウィンドウは若干大きいので、周辺部分は元のウィンドウで覆われない。この部分が周囲の装飾(ボーダーやタイトルバー)の表示に使われる。
ウィンドウマネージャはフレームウィンドウでのマウスクリックを管理する。このため、ボーダー部分やタイトルバー部分でマウスをクリックしてドラッグすることで、ウィンドウを移動させたり、サイズを変更したりできる。
ウィンドウマネージャはアイコンや関連するGUI要素の制御も行う。アイコンという概念はX Window System コアプロトコルのレベルでは存在せず、ウィンドウマネージャによって実装されている。例えば、ウィンドウを「アイコン化」するとき、FVWMなどのウィンドウマネージャがウィンドウをアンマップし、見えないようにし、アイコン名のウィンドウと(もしあれば)アイコンの画像のウィンドウを生成する。このようにアイコンの制御は完全にウィンドウマネージャが行っている。中には全くアイコンを実装していないウィンドウマネージャもある(例えば wm2)。