LECTURE 2 X の基礎用語

○ はじめに

LECTURE 1 では Xlib を使ったプログラミングの手始めとしてウィンドウを画面に表示するプログラムについて説明しました。ここでは、LECTURE 1 を含めて以降の LECTURE において前堤として使う以下の用語について説明します。

○ ディスプレイ/スクリーン

xwin.c において、ディスプレイという言葉が出てきました。ディスプレイというと直感的にはディスプレイそのもの(モニタ)を表していると感じてしまいます(僕はそうでした。。。)が、X ウィンドウシステムにおけるディスプレイとは、X サーバのことであると思ってください。正確には X サーバおよび X サーバが制御するデバイス群(キーボードやマウスなども含む)のことを指すようです(何でディスプレイと名前が付けられたのでしょうかね? )。

X サーバが制御するデバイス群のうち、モニタのことをスクリーンと呼びます。1つの X サーバが複数のモニタを制御している場合には、スクリーンを番号で区別します。

○ ピクセル値、深さ、カラーマップ、ビジュアル

xwin.c では、ウィンドウ生成時にウィンドウのバックグラウンドカラーとボーダカラーにそれぞれ白のピクセル値と黒のピクセル値を設定しています(ピクセル値はディスプレイマクロにより取得しています)。このピクセル値とは、画面を構成する各ピクセルに設定される値であり、表示する色を決定するインデックスの役割を果たしています。

通常のカラーディスプレイは、画面のピクセル数分のビットで構成されるプレーン(仮想画面とでも考えて下さい)と呼ばれるものを複数枚持っています。このプレーンを重ねて、画面のピクセルに対応する各プレーンのビットに設定される値を並べてビット列としたものがピクセル値です。また、ディスプレイが持つプレーンの枚数を、そのディスプレイの深さと呼びます。ウィンドウの深さといった場合は、同様にウィンドウの使用するプレーンの枚数を指すことになります。持っているプレーンの枚数によってピクセル値を表すのに使用されるビット数が決まる - 表示可能な色数が決まる - ということになります。

実際にピクセル値を用いて画面に色を表示するに際しては、あるピクセル値を何色で表示するかを示した対応表を用いて、ピクセル値から表示色を取得して画面に表示しています。この対応表をカラーマップと呼びます。またカラーマップにおいて、ある 1 つのピクセル値に対応する RGB 値を格納している場所をカラーセルと呼びます。カラーセルには、一度色を設定した後は読み出し専用になるものと、何回でも読み書きが可能なものがあり、それは使用しているビジュアルによって決定されます。

ビジュアルは、実際のディスプレイ装置に対応したカラーマップを持つ構造体です。つまり、ピクセル値をスクリーンに表示する色に変換する方法を表しています。下表で表される 6 種類のビジュアルがあります。

カラーマップの型式 読み書き両用 読みだし専用
モノクロ/グレースケール GrayScale StaticGray
RGB一体型 PseudoColor StaticColor
RGB3分割型 DirectColor TrueColor

○ リソースとリソースID

X サーバが管理する X ウィンドウシステム上のいろいろな資源のことをリソースと呼びます。ここで言うリソースは、~/.Xdefaults などで指定するアプリケーション用の設定を表すリソースとは異なります。X サーバが管理するリソースには次のようなものがあります。

リソース名 概要
ウィンドウ 幅 0 以上のボーダを持つスクリーン上の長方形領域
ピクスマップ オフスクリーン上の長方形領域(ボーダの幅は 0)
フォント 文字を描画するために必要なフォント情報
マウスカーソル 画面上のマウスカーソルの形状
グラフィックコンテキスト 描画のための様々な描画属性を格納している
カラーマップ ピクセル値とRGB値の対応表

リソースが必要な場合には、リソースIDと呼ばれる整数値を使って参照できます。リソースをIDで管理することにより、クライアントとサーバ間の通信負荷が軽減されます。つまり、一度 X サーバにリソースを設定すれば、以降はリソースデータそのものをネットワーク上に流す必要が無くなるというわけです。

リソースについて注意しなければならない点は、必要の無くなったリソースは解放しなくてはならないということです。リソースは有限であり、必要無くなったリソースを解放しないでいるとXサーバの処理速度が遅くなったり、リソースが取得できなくなったりすることがあるので注意してください。

リソースIDには、ウィンドウを管理するための Window 型、ピクスマップを管理するための Pixmap、マウスカーソルを管理するための Cursor など色々ありますが、これらの実体は全て unsigned long であり、 <X11/X.h> で typedef されています。