X Window Systemプロトコルとアーキテクチャ

X Window System（X11、X）は、ネットワーク透過なビットマップディスプレイ用ウィンドウシステムである。本項目は、X11のプロトコルと技術的構造の詳細を解説する。

Xクライアントサーバモデルとネットワーク透過性

Xはクライアントサーバモデルに基づいている。「Xサーバ」プログラムはグラフィックディスプレイのあるコンピュータ上で動作し、各種「クライアントプログラム」と通信する。サーバはグラフィカルな出力（ウィンドウ）の要求を受け付け、（キーボードやマウスの）ユーザー入力をクライアントに送信する。
X では、サーバがユーザーの使っているマシン上で動作し、クライアントは他のマシンでも動作できる。これは一般的なクライアントサーバモデル(「クライアント」がユーザーのコンピュータ上で、「サーバ」が遠隔のコンピュータ上で動作する)とは逆であり、Xを新たに使おうとする人は、この逆転に戸惑うことが多い。X の用語はエンドユーザーやハードウェアよりもプログラムの観点を採用している。遠隔にあるプログラムはローカルなマシン上で動作するXサーバのディスプレイと接続し、クライアントとして機能する。ローカルなXディスプレイは入っているトラフィックを受け付けるので、サーバとして機能する。
サーバとクライアント間の通信プロトコルは透過性を実現している。クライアントとサーバは同じマシン上でも動作できるし、異なったマシン上でも動作できる。それらマシンのアーキテクチャやオペレーティングシステムの差異は問題にならない。クライアントとサーバ間の通信をインターネット上で行う場合、暗号化されたコネクション上でトンネリングすることでコンピュータセキュリティを確保できる。

ウィンドウ

他のグラフィカルユーザインタフェースでウィンドウと呼ばれるものは、X Window System では「トップレベルウィンドウ」と呼ばれる。「ウィンドウ」は他のウィンドウの中にあるウィンドウも含めた用語である（「親ウィンドウ」と「子ウィンドウ」）。ボタン、メニュー、アイコンといったグラフィカルな要素も全てウィンドウを使って実現される。
ウィンドウは常に親ウィンドウの子ウィンドウとして生成される。このため、ウィンドウ群は木のような階層を形成する。この階層構造の根にあたるウィンドウを「ルートウィンドウ」と呼び、サーバが自動的に生成する。トップレベルウィンドウは、ルートウィンドウの直接の子ウィンドウである。見た目では、ルートウィンドウは画面と同じ大きさで、全てのウィンドウの背後にある。

識別子

ウィンドウ、フォントなどに関する全てのデータはサーバに格納される。クライアントはそれらオブジェクトの識別子を知っている。識別子は整数であり、サーバとやり取りする際のオブジェクトを指定する名前の役割を果たす。例えば、クライアントがウィンドウを生成したい場合、サーバに対して識別子を指定してウィンドウ生成を要求する。サーバはウィンドウを生成すると、それを指定された識別子と結びつける。この識別子はその後のクライアントからの要求に使われる（例えば、そのウィンドウに文字列を描画する場合など）。
識別子はサーバ上で一意であり、クライアント間でも重ならない。2つの異なるクライアントが作成したウィンドウであっても、2つのウィンドウが同じ識別子を持つことはない。クライアントは、自身が生成したオブジェクトでなくとも、識別子さえ知っていれば、そのオブジェクトにアクセスできる。

属性とプロパティ

各ウィンドウには事前定義された属性群とプロパティ群があり、それらは全てサーバに格納されていて、クライアントは適切な要求によってそれらにアクセスできる。属性とは、大きさ、位置、背景色などのウィンドウに関するデータである。プロパティとは、ウィンドウに付加されたデータである。属性とは異なり、プロパティは X Window System コアプロトコルのレベルでは何の意味も持たない。クライアントは任意のデータをウィンドウのプロパティに格納できる。
プロパティには、名前と型と値がある。命令型プログラミング言語における変数に似ていて、アプリケーションは新たなプロパティを生成するときに名前と型を指定し、値を格納できる。プロパティはウィンドウ毎にあるので、各ウィンドウに同じ名前のプロパティがある場合、型と値はそれぞれ異なる。
プロパティはクライアント間通信で主に使われる。例えば、WM_NAME という名前のプロパティはウィンドウの名前を格納するのに使われる。ウィンドウマネージャはこのプロパティを読んで、そのウィンドウの上辺に名前を表示する。
ウィンドウのプロパティ群は xprop プログラムを使って表示できる。特に xprop -root とすればX resource（en:X resources）を含むルートウィンドウのプロパティが表示される。

イベント

イベントとは、サーバからクライアントに送信されるパケットで、クライアントが関心を持つ可能性のある事象を通知する。クライアントはサーバに対して、別のクライアントにイベントを送信するよう要求でき、これを使ってクライアント間通信がなされる。例えば、あるクライアントが現在選択されているテキストを要求する場合、選択が行われているウィンドウを制御しているクライアントにイベントが送信される。
ウィンドウの内容は状況によって破壊されることがある（例えば、別のウィンドウの陰になった場合）。破壊された内容を見えるようにするため、サーバは Expose イベントをクライアントに送り、クライアントにウィンドウの再描画の必要があることを知らせる。
他には、キーボードやマウスからの入力を知らせるイベント、新たなウィンドウの生成を知らせるイベントなどがある。
ある種のイベントは常にクライアントに送られるが、ほとんどのイベントはクライアントが事前に指定していないと送信されない。例えば、キーボード入力しか受け付けないクライアントは、キーボードに関するイベントのみを指定し、マウスに関するイベントは指定しないといったことが考えられる。

Xlib などのクライアントライブラリ

クライアントプログラムの多くは、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（あるアプリケーションを別のアプリケーションの子ウィンドウとして動作させる際の詳細な規定）などがある。

セレクション、カットバッファ、ドラッグ・アンド・ドロップ

セレクション (selection)、カットバッファ (cut buffer)、ドラッグ・アンド・ドロップ (drag-and-drop) は、ユーザーが X Window System でウィンドウからウィンドウにデータを転送するための機構である。セレクションとカットバッファは一般に、ユーザーがウィンドウ内のテキストなどの何らかのデータを選択し、それを他のウィンドウに貼り付けるのに使われる。ドラッグ・アンド・ドロップは、ユーザーがウィンドウ内の何かを選択し、選択したものの上でマウスをクリックし、それを他のウィンドウにドラッグするという場合に使われる。
2つのウィンドウはそれぞれ独立した別々のアプリケーションが制御しているので、Xサーバに接続された2つのクライアントが相互にやり取りしないとデータ転送できない。X Window System コアプロトコルはセレクションの交換に対応した要求やイベントを用意しているが、転送自体はクライアント同士のイベント送信とウィンドウプロパティで実現され、これはセレクションの転送に限った話ではない。
クライアント間で転送されるデータには様々なものがある。テキストであることが多いが、ピクスマップや数値やオブジェクトのリストなどもある。
セレクションとドラッグ・アンド・ドロップは能動的機構である。あるウィンドウ上でテキストを選択した場合、そのウィンドウを制御しているクライアントがデータを要求しているアプリケーションにデータを転送するプロトコルを能動的にサポートしていなければならない。対照的にカットバッファは受動的機構である。ユーザーがテキストを選択した場合、その内容はカットバッファに転送され、元のウィンドウを制御していたアプリケーションが終了してウィンドウが消えても、カットバッファ内の内容は残る。

セッションマネージャ

「セッション (session)」の状態とは、大まかに言えばある時点での「デスクトップの状態」、すなわちウィンドウ群の現在の内容の総体である。より正確に言えば、それらウィンドウ群を管理しているアプリケーションと、それらアプリケーションが要求されたときにウィンドウの状態を復元するのに必要とする情報の集まりである。Xセッションマネージャとは、セッションの状態を保存し復元するプログラムである。
セッションマネージャを使うと何ができるかというと、ログアウトして再びログインしたときに、ログアウト前と全く同じウィンドウ群が表示されるという効果がわかりやすい。このため、セッションマネージャはログアウト時点の動作中アプリケーションの名前を記録しておき、再度ログインした際にそれらを再開させる。各アプリケーションの状態も復元するには、アプリケーション自体が実行状態をセッションマネージャの要求に応じて保存し、再開時に復元できるようになっている必要がある。
X Window System にはデフォルトのセッションマネージャとして xsm がある。他のセッションマネージャとしては、例えばKDEのデフォルトのセッションマネージャである ksmserver などがある。

Xディスプレイマネージャ

Xディスプレイマネージャは、X Window System のグラフィカルなログインプロンプトを表示するプログラムである。それだけでなく、Xディスプレイマネージャはローカルのコンピュータ上で1つ以上のXサーバを起動し、遠隔にあるコンピュータで動作するXクライアントからのコネクション要求を受信する。ローカルなサーバはディスプレイマネージャによって起動され、相互に接続し、ログイン画面を表示する。遠隔のサーバはディスプレイマネージャとは独立して起動され、ディスプレイマネージャと接続する。この場合、ディスプレイマネージャは一種のグラフィカルなtelnetサーバのように働く。Xサーバがディスプレイマネージャと接続することでセッションが開始される。このとき、このセッションで実行されるプログラムはディスプレイマネージャの動作しているコンピュータ上で動作するが、入出力はXサーバの動作するコンピュータ上で行われる（そして、ユーザーはそのXサーバの動作する遠隔のコンピュータを使っている）。
XDMは X Window System の基本のディスプレイマネージャである。他のディスプレイマネージャとしては、GNOME ディスプレイマネージャー (GDM)、KDEディスプレイマネージャ (KDM) などがある。

ユーザインタフェースの要素

初期のX向けウィジェット・ツールキットとしては、Xaw (Athena Widget Set)、OLIT (OPEN LOOK Instrinsics Toolkit)、XView、Motif、Tkなどがある。OLITとXViewはサン・マイクロシステムズのかつてのデスクトップ環境 OpenWindows のベースとなっている。
Motif は Common Desktop Environment (CDE) のベースとなっており、Solaris、AIX、HP-UX といった商用UNIXのデスクトップ環境として使われていた。
比較的新しいツールキットとしては、Qt（KDE）、GTK+（GNOME）、wxWidgets、FLTK などがある。