X Window System コアプロトコル
X Window System では、全ての個々の物理キー(キーボードのキー)に 8 から 255 の数が割り当てられていて、これを keycode と呼ぶ。keycode はキーを特定するだけであり、そのキーに印字されている特定の文字や用語(例えば "Page Up")の識別はできない。それら文字や用語は keysym で識別される。keycode は実際の1つのキーに対応しているが、keysym は、例えばシフトキーなどの修飾キーが同時に押されたかどうかに対応して決定される。
キーが押下されたり、解放されたとき、サーバは KeyPress イベントあるいは KeyRelease イベントを適当なクライアントに送信する。これらのイベントには以下の情報が含まれる。
押下されたキーの keycode
現在の修飾状態(シフト、コントロールなど)とマウスボタンの状態
つまりサーバは、keycode と修飾状態を特定の文字に変換せずに送信する。この変換をするのは、クライアントの役割である。例えば、クライアントがあるキーとシフト修飾キーが押下されていることをイベントで通知されたとする。通常このキーが "a" という文字を生成するなら、クライアントは、このイベントによって文字 "A" を得る。
アトム(Atom)とは、文字列を表す32ビット整数である。文字列が任意の長さであるのに対してアトムは常に32ビット整数であり、プロトコル設計者は文字列を短い固定サイズで表すためにアトムを導入した。アトムは短いため、同じ文字列をパケットとして何度も送信するような場合に利用される。これによってネットワークの利用効率が向上する。アトムはまた、イベントパケットのような固定サイズのパケットで利用される。
正確には、アトムはサーバが保持する文字列の識別子である。リソース(ウィンドウやピクスマップ)の識別子に似ているが、2つの点で異なる。まず第一に、アトムの識別子はサーバが設定するのであって、クライアントは指定できない。つまり、クライアントが新たなアトム生成を要求するときは、サーバに文字列を送信するだけであり、識別子は指定しない。サーバはその文字列に識別子を割り当て、クライアントへの応答パケットでそれを返す。第二に、アトムは特定のクライアントとは関連しない。アトムは、生成されるとクライアントが終了しても存続し、サーバが終了するまで残る(リソースのデフォルトの振る舞いはそれとは異なる)。
グラブは事前に指定されたキーまたはマウスボタンが押下されたときのみ効力を発揮し、解放された時点で終了する。
クライアントはキーボードかマウスポインタ、あるいは両方についてグラブ状態を確立できる。グラブ要求にはキーボードやマウスポインタのフリーズ要求を含めることもできる。グラブとフリーズの違いは、グラブがイベント受信者を変更するのに対して、フリーズはイベントの配信そのものを停止する点である。デバイスがフリーズされると、それが生成するイベントはキューに格納され、通常はフリーズ状態が解除されたときに溜めておいたイベント群が送信される。
マウスポインタのイベントの場合、イベント配信に影響を与える別の要素として、イベントマスクがある。これは、イベントの種類ごとに配信するか捨てるかを指定するものである。
グラブ要求には、グラブが確立していない状態でグラブしようとしているクライアントにイベントが送られようとしたとき、どうすべきかを指定するフィールドもある。特に、クライアントはそのようなイベントを普通に送信してもらうか、グラブに従って送信してもらうかを指定できる。これらの状況は見た目にも異なる結果となる。例えば、クライアントが通常状態では第一ウィンドウでキーボードイベントを受け取っていて、第二ウィンドウによるキーボードのグラブを要求したとする。イベントを第一ウィンドウに送信するかグラブウィンドウ(第二ウィンドウ)に送信するかはグラブ要求のパラメータに依存する。
クライアントはサーバ全体のグラブを要求することもできる。この場合、グラブクライアントからの要求以外は受け付けなくなる。
サーバとクライアント間の通信は、伝送路上でパケットを交換することでなされる。コネクションはクライアントが確立する(クライアントの起動についてはプロトコル上規定されていない)。クライアントは最初のパケットを送信する。これには、使用するエンディアン、プロトコルのバージョン、クライアントがサーバに期待する認証方式が指定されている。サーバは、コネクションを受け付けるか否かを示した応答パケットを送り返すか、認証のためのパケットを送る。コネクションが受け付けられる場合、その後のやり取りでクライアントが使うべきデータを格納したパケットが送られる。
コネクションが確立すると、クライアントとサーバ間で以下の四種類のパケットが交換される。
要求(Request): クライアントがサーバから情報を要求するか、サーバに何らかの実行を要求する。
応答(Reply): サーバへの要求に対する応答。全ての要求パケットに対して応答パケットが生成されるわけではない。
keycode から keysym へのクライアントでの変換には、サーバが用意した対応表を使う。この表をどこか全クライアントから参照可能なところに置けばよい。典型的なクライアントは、このマッピングを要求し、キーイベントの内容(keycode と修飾状態)から keysym への変換を行う。ただし、クライアントはこのマッピングを自由に変更できる。
修飾キーは、押下されると他のキーの解釈を変化させる。シフトキーは、一般に "a" のような小文字を "A" のような大文字に変化させる。他の修飾キーとしては、「コントロールキー」、「Altキー」、「Metaキー」などがある。
Xサーバは、最大8種類の修飾キーを扱える。ただし、各修飾キーは必ずしも1つの物理キーに対応したものとは限らない。キーボードには、同じ修飾キーが複数個存在する場合があるからである。例えば、多くのキーボードには2つのシフトキーがある(左端と右端)。これらの keycode は異なるが、Xサーバはどちらもシフト修飾キーと認識する。
8個の修飾キーについて、Xサーバはその修飾キーと認識される keycode の一覧を持っている。