Chapter 2 Display Functions

2章 ディスプレイ関数

ディスプレイをプログラムで使う前に、Xサーバと接続を確立しなければならない。 一度、接続を確立すれば、 この章で述べられているXlibのマクロや関数を使って、ディスプレイに関する情報を得ることができる。 この章は以下のような方法について述べる。

Opening the Display

ディスプレイを制御しているXサーバと接続を開く XOpenDisplay .

Display *XOpenDisplay(display_name)
char *display_name;
display_name
ハードウェアのディスプレイ名を指定。これは使用するディスプレイと 通信ドメインを決める。 POSIX準拠のシステムでは、display_nameがNULの場合には DISPLAY環境変数の値が使われる。

ディスプレイ名のエンコードや解釈は実装に依存する。 ホストの可搬用文字エンコーディングでの文字列がサポートされる; 他の文字に関するサポートは実装依存である。 POSIX準拠のシステムにおいて、 ディスプレイ名またはDISPLAY環境変数は次のような形式の文字列である。:

	hostname:number.screen_number
hostname
ディスプレイが物理的に付いているホストマシンの名前を指定する。 次に、一つのコロン(:)または2つのコロン(::)が続く。
number
ホストマシンのディスプレイサーバの番号を指定。 オップションでディスプレイ番号の後にピリオド(.)が続く。 単独のCPUは一つ以上のディスプレイを持てる。 マルチディスプレイはゼロから番号付けされる。
screen_number
はサーバで使われるスクリーンを指定。 マルチスクリーンは一つのXサーバで制御される。 screen_numberは DefaultScreenマクロもしくはC以外の言語をつかうなら、 XDefaultScreen関数を使ってアクセスされる内部変数をセットする(2.2.1 節 参照)。

例えば、''dual-headed''と名付けられたマシン上のディスプレイ0のスクリーン1を指定する単語は次のようになる。

dual-headed:0.1

XOpenDisplay関数は Display 構造体を返す。 この構造体はXサーバへの接続を与え、またXサーバに関する全ての情報を 持っている。 XOpenDisplayTCP、DECnet通信プロトコル、または ローカルのプロセス間通信プロトコルを使って アプリケーションとXサーバを接続する。 hostnameがホストマシンの名で、一つのコロン(:)がホスト名とディスプレイ番号を 区切っている場合、 XOpenDisplayTCPストリームを使って接続を行う。 もしhostnameが指定されていない場合、 Xlibは最も通信が速いと思われるものを使用する。 hostnameがホストのマシン名で、2つのコロン(::)がホスト名と ディスプレイ番号を区切っている場合、 XOpenDisplayはDECnetを使って接続を行う。 単独のXサーバがこれらの転送機構のどれかあるいは全てをは同時にサポート していることがある。 特定のXlibの実装では、これら以外の通信機構をサポートしていることもある。

成功した場合には、 XOpenDisplayDisplay 構造体へのポインタを返す。 この構造体は <X11/Xlib.h .>で定義されている。 失敗した場合には、 XOpenDisplay はNULLを返す。 XOpenDisplay ,の呼び出しに成功した後は、 クライアントはディスプレイの全てのスクリーンを使うことができる。 引き数display_nameで指定されたスクリーンの数は マクロ DefaultScreen(あるいは関数 XDefaultScreen)で返される。 Displayおよび Screen構造体の要素は専用のマクロや関数を使った場合だけアクセスが許される。 Display 構造体の情報を取得するマクロや関数の使用については、 2.2.1 節を参照すること。

Xサーバは様々な種類のアクセス制御機構を実装している。 (9.8 節参照)

Obtaining Information about the Display, Image Formats, or Screens

Xlibは Display構造体からデータを返す多くの便利なマクロやそれに相当する関数を与える。 マクロはCプログラミングで使われ、 これに相当する関数は他の言語とのバインディングのために使われる。 この節は以下のことを述べる:

Display 構造体の全ての他のメンバー(マクロが定義されていないものもある)はXlibにプライベイトなものであり、 これは使われてはならない。 アプリケーションは Display 構造体のプライベイトなメンバーを直接変更したり、参照してはならない。

Note: XDisplayWidth ,XDisplayHeight ,XDisplayCells ,XDisplayPlanes ,XDisplayWidthMM ,と XDisplayHeightMM関数は誤った名前である。 これらの関数はDisplayまたはXDisplayではなく、 ScreenまたはXScreenと名付けられるべきである。 この結果生じる混乱に対して我々は謝罪する。

Display Macros

アプリケーションは DisplayScreen構造体のどんな部分も直接変更すべきではない。 メンバーは読みだし専用と思われるが、 ディスプレイに対するいろいろな操作の結果として変更される。

次のものはC言語マクロと他の言語のバインディングのためにあるそれに相当する関数のリストであり、 両方とも何らかのデータを返す。

AllPlanes

unsigned long XAllPlanes()

両方とも全てのビットを1にした値を返す。これは関数の引き数planeで使える値 になっている。

BlackPixel WhitePixel はモノクロアプリケーションを実装する時に使われる。 これらのピクセル値はデフォルトのカラーマップに永続的に割り当てられた エントリーに対するものである。 実際のRGB(赤、緑、青)の値はいくつかのスクリーンでセットできる。 そして、どんな場合でも、実際に黒または白ではないかもしれない。 名前は予測される色の相対的な強度を伝えられている。

BlackPixel(display, screen_number)

unsigned long XBlackPixel(display, screen_number)
Display *display;
int screen_number;

display
Xサーバへの接続を指定。
screen_number
ホストサーバ上の適切なスクリーン番号を指定。

両方とも指定されたスクリーンの黒のピクセル値を返す。

WhitePixel(display, screen_number)

unsigned long XWhitePixel(display, screen_number)
Display *display;
int screen_number;

display
Xサーバへの接続を指定。
screen_number
ホストサーバ上の適切なスクリーン番号を指定。

両方とも指定されたスクリーンの白のピクセル値を返す。

ConnectionNumber(display)

int XConnectionNumber(display)
Display *display;

display
Xサーバへの接続を指定。

両方とも指定されたディスプレイへの接続数を返す。 POSIX準拠のシステムにおいて、 これは接続のファイルディスクリプタである。

DefaultColormap(display, screen_number)

Colormap XDefaultColormap(display, screen_number)
Display *display;
int screen_number;

display
Xサーバへの接続を指定する。
screen_number
ホストサーバ上の適切なスクリーン番号を指定する。

両方とも指定されたスクリーンのデフォルトカラーマップIDを返す。 多くの色割り当てルーチンはこのカラーマップから作られる。

DefaultDepth(display, screen_number)

int XDefaultDepth(display, screen_number)
Display *display;
int screen_number;

display
Xサーバへの接続を指定。
screen_number
ホストサーバ上の適切なスクリーン番号を指定。

両方とも指定されたスクリーンに対するデフォルトルートウィンドウの深さ (プレーンの数)を返す。 他の深さもこのスクリーン上でサポートされる。( XMatchVisualInfo 参照)

To determine the number of depths that are available on a given screen, use 与えられたスクリーン上で利用できる深さの数を決定するには、 XListDepths を使う。

int *XListDepths(display, screen_number, count_return)
Display *display;
int screen_number;
int *count_return;
display
Xサーバへの接続を指定。
screen_number
ホストサーバ上の適切なスクリーン番号を指定。
count_return
深さの数を返す。

XListDepths関数は指定されたスクリーン上で利用できる深さの配列を返す。 指定したscreen_numberが有効な値であり、配列に十分なメモリが割り当てられているなら、 XListDepthsは利用できる深さの数をcount_returnにセットする。 そうでない場合、count_returnはセットされず、関数はNULLを返す。 深さの配列に割り当てられたメモリを解放するには、 XFree を使用すること。

DefaultGC(display, screen_number)

GC XDefaultGC(display, screen_number)
Display *display;
int screen_number;

display
Xサーバへの接続を指定。
screen_number
ホストサーバ上の適切なスクリーン番号を指定。

両方とも指定されたスクリーン上のルートウィンドウのデフォルトの GCを返す。 このGCは単純なアプリケーションのために作れ、 それぞれ黒と白のピクセルで前景色と 背景色が初期化されたデフォルトGCを持っている。 このGCはXlib関数では使用されないので自由に変えることができる。 このGCは決して解放してはならない。

DefaultRootWindow(display)

Window XDefaultRootWindow(display)
Display *display;

display
Xサーバへの接続を指定。

両方ともデフォルトスクリーンのルートウィンドウを返す。

DefaultScreenOfDisplay(display)

Screen *XDefaultScreenOfDisplay(display)
Display *display;

display
Xサーバへの接続を指定。

両方ともデフォルトスクリーンへのポインタを返す。

ScreenOfDisplay(display, screen_number)

Screen *XScreenOfDisplay(display, screen_number)
Display *display;
int screen_number;

display
Xサーバへの接続を指定。
screen_number
ホストサーバ上の適切なスクリーン番号を指定。

両方とも指示されたスクリーンへのポインタを返す。

DefaultScreen(display)

int XDefaultScreen(display)
Display *display;

display
Xサーバへの接続を指定する。

両方とも XOpenDisplay関数で参照されるデフォルトスクリーン番号を返す。 このマクロまたは関数は単一スクリーンのみを使うアプリケーションでスクリーン番号 を取り出すために使われる。

DefaultVisual(display, screen_number)

Visual *XDefaultVisual(display, screen_number)
Display *display;
int screen_number;

display
Xサーバへの接続を指定。
screen_number
ホストサーバ上の適切なスクリーン番号を指定。

両方とも指定されたスクリーンに対するデフォルトのビジュアルタイプを返す。 ビジュアルタイプについてのより多くの情報は、 3.1節を参照すること。

DisplayCells(display, screen_number)

int XDisplayCells(display, screen_number)
Display *display;
int screen_number;

display
Xサーバへの接続を指定。
screen_number
ホストサーバ上の適切なスクリーン番号を指定。

両方ともデフォルトカラーマップ内のエントリー数を返す。

DisplayPlanes(display, screen_number)

int XDisplayPlanes(display, screen_number)
Display *display;
int screen_number;

display
Xサーバへの接続を指定する。
screen_number
ホストサーバ上の適切なスクリーン番号を指定する。

両方とも指定されたスクリーンのルートウィンドウの深さを返す。 深さの説明に関しては、 用語集を参照すること。

DisplayString(display)

char *XDisplayString(display)
Display *display;

display
Xサーバへの接続を指定する。

両方とも現在のディスプレイが開かれた時に XOpenDisplayに渡された文字列を返す。 POSIX準拠のシステムにおいて、 if the passed string was NULL, these return the value of もし渡された文字列がNULLなら、ディスプレイが開かれた時の DISPLAY環境変数の値が返される。 これらは forkシステムコールを呼び出し、エラーメッセージを表示するのと同様に子プロセスから同じディスプレイ に新しい接続を開くようなアプリケーションで便利である。

long XExtendedMaxRequestSize(display) Display *display;
display
Xサーバへの接続を指定する。

指定されたディスプレイがリクエスト長拡張 プロトコルエンコーディング(extended-length protocol encoding)をサポートしていない場合には、 XExtendedMaxRequestSize関数はゼロを返す。そうでない場合は、 リクエスト長拡張プロトコルエンコーディングを使うサーバが サポートしている最大のリクエストサイズ(4バイト単位)を返す。 Xlibの関数 XDrawLines ,XDrawArcs ,XFillPolygon ,XChangeProperty ,XSetClipRectangles ,および XSetRegionは、リクエスト長拡張プロトコルエンコーディングをサポートしていれば、 必要に応じてこのエンコーディングを使う。 Xlibの他の関数(例えば、 XDrawPoints ,XDrawRectangles ,XDrawSegments ,XFillArcs ,XFillRectangles ,XPutImage )におけるこのエンコーディングの使用は 認められているが必須ではない。Xlibの実装では、 このエンコーディングを使う代わりにデータを小さい複数リクエストに 分割することもある。

long XMaxRequestSize(display) Display *display;
display
Xサーバへの接続を指定する。

XMaxRequestSize関数は、サーバがサポートしているリクエストの最大サイズ(4バイト単位)を返す。 この最大サイズは、リクエスト長拡張プロトコルエンコーディング を使っていないサーバに対する値である。 サーバがリクエスト長拡張プロトコルエンコーディングをサポートしていなければ、 このサイズを越える単一のプロトコルリクエストをサーバに対して送ってはならない。 Xプロトコルはこのサイズが4096ユニット(16384バイト)より 小さくならないことを保証している。 以下の関数については Xlibは必要に応じてデータを複数のプロトコルリクエストに分割する。: XDrawPoints ,XDrawRectangles ,XDrawSegments ,XFillArcs ,XFillRectangles ,および XPutImage .

LastKnownRequestProcessed(display)

unsigned long XLastKnownRequestProcessed(display)
Display *display;

display
Xサーバへの接続を指定。

両方ともXサーバによって処理されたことをXlibが認識している 最後のリクエストの完全なシリアル番号を取り出す。 Xlibは応答、イベント、エラーを受け取った時に自動的にこの番号をセットする。

NextRequest(display)

unsigned long XNextRequest(display)
Display *display;

display
Xサーバへの接続を指定。

両方とも次のリクエストに使われる完全なシリアル番号を抜き出す。 シリアル番号はそれぞれのディスプレイの接続において個別に保持される。

ProtocolVersion(display)

int XProtocolVersion(display)
Display *display;

display
Xサーバへの接続を指定。

両方とも接続先のディスプレイに対応するXプロトコルのメジャーバージョン番号(11) を返す。

ProtocolRevision(display)

int XProtocolRevision(display)
Display *display;

display
Xサーバへの接続を指定。

両方ともXサーバのマイナーリビジョン番号を返す。

QLength(display)

int XQLength(display)
Display *display;

display
Xサーバへの接続を指定。

両方とも接続先のディスプレイに対するイベント待ち行列の長さを返す。 まだ待ち行列に読み込まれていないイベントが存在している可能がある点に注意すること( XEventsQueued 参照)。

RootWindow(display, screen_number)

Window XRootWindow(display, screen_number)
Display *display;
int screen_number;

display
Xサーバへの接続を指定。
screen_number
ホストサーバ上の適切なスクリーン番号を指定。

両方ともルートウィンドウを返す。 これらは特定のスクリーンに描画したり、トップレベルウィンドウ を作るときなどに便利である。

ScreenCount(display)

int XScreenCount(display)
Display *display;

display
Xサーバへの接続を指定。

両方とも利用可能なスクリーンの数を返す。

ServerVendor(display)

char *XServerVendor(display)
Display *display;

display
Xサーバ上の接続を指定。

両方ともXサーバ実装者を確認するようなNULL終端された文字列を返す。 サーバにより返されたデータがLatin可搬用文字エンコーディングなら、 文字列はホストの可搬用文字エンコーディング内である。 そうでない場合は、文字列の内容は実装に依存する。

VendorRelease(display)

int XVendorRelease(display)
Display *display;

display
Xサーバへの接続を指定。

両方ともXサーバのベンダーリリースに関連する番号を返す。

Image Format Functions and Macros

アプリケーションはサーバが要求するフォーマットで Xサーバにデータを提示する必要がある。 アプリケーションを単純にするのに役立つように、データをコンバートするのに 要求される仕事の大部分がXlibにより提供される。 (セクション 8.7と16.8 参照)

XPixmapFormatValues構造体はピックスマップのフォーマットの情報へのインターフェイスを提供する。 この情報は接続セットアップ時に返される。

typedef struct {
	int depth;
	int bits_per_pixel;
	int scanline_pad;
} XPixmapFormatValues;

与えられたディスプレイに対するピックスマップフォーマット情報を得るには、 XListPixmapFormats を使う。

XPixmapFormatValues *XListPixmapFormats(display, count_return)
Display *display;
int *count_return;
display
Xサーバへの接続を指定。
count_return
ディスプレイによりサポートされるピックスマップのフォーマットの数を返す。

XListPixmapFormats関数は特定のディスプレイでサポートされるZフォーマットのイメージを記述する XPixmapFormatValues構造体の配列を返す。 If insufficient memory is available, メモリが不足している場合、 XListPixmapFormatsはNULLを返す。 XPixmapFormatValues構造体に割り当てられたメモリを解放するには、 XFree を使う。

以下はC言語マクロと他の言語のバインディングのためにあるそれに相当する関数のリストである。 そして、これらは指定されたサーバおよびスクリーンに対して何らかのデータを返す。 これらは単純なアプリケーションと共にツールキットによって使われる。

ImageByteOrder(display)

int XImageByteOrder(display)
Display *display;

display
Xサーバへの接続を指定。

両方ともイメージのXYフォーマット(ビットマップ)の各スキャンラインか、 Zフォーマットの各ピクセル値について必要なバイトオーダーを指定する。 このマクロまたは関数は LSBFirst または MSBFirst のいずれかを返す。

BitmapUnit(display)

int XBitmapUnit(display)
Display *display;

display
Xサーバへの接続を指定。

両方ともビットマップのスキャンラインユニットのサイズをビット数で返す。 スキャンラインはこの値の倍数で計算される。

BitmapBitOrder(display)

int XBitmapBitOrder(display)
Display *display;

Specifies the connection to the X server. Xサーバへの接続を指定。

ビットマップがスクリーンに表示されるとき、各ビットの最も左のビットが 最上位(LSBFirst)であるか最下位(MSBFirst)であるかを示す。 このマクロまたは関数は LSBFirstまたは MSBFirst .のいずれかを返す。

BitmapPad(display)

int XBitmapPad(display)
Display *display;

display
Xサーバへの接続を返す。

各スキャンラインはこのマクロまたは関数により返される ビットの倍数に詰め込まれなければならない。

DisplayHeight(display, screen_number)

int XDisplayHeight(display, screen_number)
Display *display;
int screen_number;

display
Xサーバへの接続を指定。
screen_number
ホストサーバ上の適切なスクリーン番号を指定。

両方ともスクリーンの高さをピクセル値で返す。

DisplayHeightMM(display, screen_number)

int XDisplayHeightMM(display, screen_number)
Display *display;
int screen_number;

display
Xサーバへの接続を指定。
screen_number
ホストサーバ上の適切なスクリーン番号を指定。

両方とも指定されたスクリーンの高さをミリメートル単位で返す。

DisplayWidth(display, screen_number)

int XDisplayWidth(display, screen_number)
Display *display;
int screen_number;

display
Xサーバへの接続を指定。
screen_number
ホストサーバ上への適切なスクリーン番号を指定。

両方ともクリーンの幅をピクセル値で返す。

DisplayWidthMM(display, screen_number)

int XDisplayWidthMM(display, screen_number)
Display *display;
int screen_number;

display
Xサーバへの接続を指定。
screen_number
ホストサーバ上の適切なスクリーン番号を指定。

両方とも指定されたスクリーンの幅をミリメートル単位で返す。

Screen Information Macros

以下のものはC言語マクロまたは他の言語の バイディングのためにあるそれに相当する関数のリストであり、 これらは何らかのデータを返す。 これらのマクロや関数は適切なScreen構造体へのポインタを取る。

BlackPixelOfScreen(screen)

unsigned long XBlackPixelOfScreen(screen)
Screen *screen;

screen
適切な Screen構造体を指定。

両方とも指定したスクリーンの黒のピクセルを返す。

WhitePixelOfScreen(screen)

unsigned long XWhitePixelOfScreen(screen)
Screen *screen;

screen
適切なスクリーン Screen構造体を指定。

両方とも指定したスクリーンの白のピクセルを返す。

CellsOfScreen(screen)

int XCellsOfScreen(screen)
Screen *screen;

screen
適切な Screen構造体を指定。

両方とも指定したスクリーンのデフォルトカラーマップ内の カラーマップセルの数を返す。

DefaultColormapOfScreen(screen)

Colormap XDefaultColormapOfScreen(screen)
Screen *screen;

screen
適切な Screen構造体を指定。

両方とも指定したスクリーンのデフォルトカラーマップを返す。

DefaultDepthOfScreen(screen)

int XDefaultDepthOfScreen(screen)
Screen *screen;

screen
適切な Screen構造体を指定。

両方ともルートウィンドウのデフォルトの深さを返す。

DefaultGCOfScreen(screen)

GC XDefaultGCOfScreen(screen)
Screen *screen;

screen
適切な Screenスクリーン構造体を指定。

両方とも指定したスクリーンのデフォルトのGCを返す。 これはそのスクリーンのルートウィンドウと同じ深さを持つ。 このGCは決して解放されてはならない。

DefaultVisualOfScreen(screen)

Visual *XDefaultVisualOfScreen(screen)
Screen *screen;

screen
適切な Screen構造体を指定。

両方とも指定したスクリーンのデフォルトのビジュアルを返す。 ビジュアルタイプに対する情報は3.1節参照。

DoesBackingStore(screen)

int XDoesBackingStore(screen)
Screen *screen;

screen
適切な Screen構造体を指定。

両方ともスクリーンがバッキングストア機能をサポートするどうかを示す値を 返す。 返される値は WhenMapped ,NotUseful ,または Always のうちのどれかである。 (3.2.4節 参照)

DoesSaveUnders(screen)

Bool XDoesSaveUnders(screen)
Screen *screen;

screen
適切な Screen構造体を指定。

両方ともスクリーンがセーブアンダー機能をサポートするかどうかを 示す真偽値を返す。 返り値が True なら、スクリーンはセーブアンダー機能をサポートする。 False なら、スクリーンはセーブアンダー機能をサポートしない。(3.2.5節 参照)

DisplayOfScreen(screen)

Display *XDisplayOfScreen(screen)
Screen *screen;

screen
適切な Screen構造体を指定。

両方とも指定したスクリーンのデフォルトのディスプレイを返す。

int XScreenNumberOfScreen(screen)
Screen *screen;
screen
適切な Screen構造体を指定。

XScreenNumberOfScreen関数は指定したスクリーンのスクリーンのインデックス番号を返す。

EventMaskOfScreen(screen)

long XEventMaskOfScreen(screen)
Screen *screen;

screen
適切な Screen構造体を指定。

両方とも指定したスクリーンに対する接続のセットアップ時のルートウィンドウのルート イベントマスクを返す。

WidthOfScreen(screen)

int XWidthOfScreen(screen)
Screen *screen;

screen
適切な Screen構造体を指定。

両方とも指定したスクリーンの幅をピクセル値で返す。

HeightOfScreen(screen)

int XHeightOfScreen(screen)
Screen *screen;

screen
適切な Screen構造体を指定。

両方とも指定したスクリーンの高さをピクセル値で返す。

WidthMMOfScreen(screen)

int XWidthMMOfScreen(screen)
Screen *screen;

screen
適切な Screen構造体を指定。

両方とも指定したスクリーンの幅をミリメートル単位で返す。

HeightMMOfScreen(screen)

int XHeightMMOfScreen(screen)
Screen *screen;

screen
適切な Screen構造体を指定。

両方とも指定したスクリーンの高さをミリメートル単位で返す。

MaxCmapsOfScreen(screen)

int XMaxCmapsOfScreen(screen)
Screen *screen;

screen
適切な Screen構造体を指定。

指定したスクリーンがサポートする、インストールできる カラーマップの最大数を返す。(9.3節 参照)

MinCmapsOfScreen(screen)

int XMinCmapsOfScreen(screen)
Screen *screen;

screen
適切な Screen構造体を指定。

両方とも指定したスクリーンがサポートする、 インストールできるカラーマップの最小数を返す。

PlanesOfScreen(screen)

int XPlanesOfScreen(screen)
Screen *screen;

screen
適切な Screen構造体を指定。

両方とも指定したスクリーンのルートウィンドウが持つプレーン数 を返す。

RootWindowOfScreen(screen)

Window XRootWindowOfScreen(screen)
Screen *screen;

screen
適切な Screen構造体を指定。

両方とも指定したスクリーンのルートウィンドウを返す。

Generating a NoOperation Protocol Request

NoOperation プロトコルリクエストを実行するには、 XNoOp を使う。

XNoOp(display)
Display *display;
display
Xサーバへの接続を指定。

The XNoOp関数はXサーバに NoOperation プロトコルリクエストを送り、 これによって、接続を試すことができる。

Freeing Client-Created Data

Xlib関数により作られたメモリ内のデータを解放するには、 XFree を使う。

XFree(data)
void *data;
data
解放されるデータを指定。

XFree関数は指定したデータを解放する汎用のXlibの関数である。 この関数はXlibが割り当てたオブジェクトは必ずこれを使って解放しなければならない。 ただし、そのオブジェクトに対して別の関数が明示的に指定されている場合、この限りではない。 この関数にNULLポインタを渡してはならない。

Closing the Display

ディスプレイを閉じるもしくはXサーバと接続を切るには、 XCloseDisplay .を使う。

XCloseDisplay(display)
Display *display;
display
Xサーバへの接続を指定。

The XCloseDisplay関数は Display構造体で指定したディスプレイのXサーバへの接続を閉じ、全てのウィンドウ、リソースID (Window ,Font ,Pixmap ,Colormap ,Cursor ,そして GContext ),クライアントがこのディスプレイ上に作成した他のリソースを破棄する。 ただし、リソースの終了モードが変更されている場合、リソースは破棄されない。 ( XSetCloseDownMode .を参照) したがって、これらのウィンドウ、リソースID、その他のリソースはふたたび参照 してはならない。参照した場合にはエラーとなる。 プログラムを終了する前には、 XCloseDisplayを明示的に呼ぶべきである。これは、 XCloseDisplayが最後の XSync操作を行うことにより、ペンディングされているエラー が全て通知されるからである。

XCloseDisplayはエラー BadGCを起こすことがある。

Xlibにはクライアントの接続が閉じられた後、生き残っているクライアントにより リソースが所有される事を認める関数がある。 クライアントの終了モードを変えるために、 XSetCloseDownMode を使う。

XSetCloseDownMode(display, close_mode)
Display *display;
int close_mode;
display
Xサーバへの接続を指定。
close_mode
クライアントの終了モードを指定。 DestroyAll , RetainPermanent , また RetainTemporary . を渡す。

XSetCloseDownModeは接続を閉じた時にクライアントのリソースどうなるかを定義する。 接続開始時には DestroyAllモードである。 引き数close_modeが RetainPermanentあるいは RetainTemporary ,の場合に、クライアントのリソースどのようになるのかについては、 2.6 節を参照すること。

XSetCloseDownModeはエラー BadValue を起こすことがある。

Using X Server Connection Close Operations

クライアントへのXサーバの接続が明示的に XCloseDisplayを呼び出すか、プロセスの終了によって閉じられる時、 Xサーバは次の操作を自動的に行う。

終了モードが DestroyAll ,である時、Xサーバは以下のように全てのクライアントのリソースを破壊する。

Xサーバへの最後の接続が閉じられる時、追加的処理を起こす。 Xサーバは接続をおこなう、行わないというサイクルを通り抜ける。 Xサーバへの最後の接続が DestroyAll の終了モードで閉じられる時、 Xサーバは以下のような事を行う。

しかしながら、終了モードを RetainPermanentあるいは RetainTemporary .にセットして接続を切るなら、Xサーバはリセットしない。

Using Xlib with Threads

スレッドを持つシステムにおいては、マルチスレッドで同時にXlibを使う ことを認めている。

コンカレントスレッドのサポートを初期化するには、 XInitThreads を使う。

Status XInitThreads( );

関数 XInitThreadsfunction initializes Xlib support for concurrent threads. はコンカレントスレッドのXlibサポートを初期化する。 この関数はマルチスレッドプログラミングの最初のXlib関数で なければならず、他のXlib関数が呼ばれる前に動作終了していなければならない。 この関数は初期化が成功すれば、ゼロでない値を返し、そうでない場合は、 ゼロを返す。 スレッドをサポートしないシステムの場合、この関数は必ずゼロを返す。

もしマルチスレッドでXlibの関数を平行して使う場合には、この関数を呼び出す だけでよい。 Xlibの関数の呼び出し全ては他のアクセス機構によって保護され(例えば、ツールキットで使われる 共通の排他ロックやクライアントプログラムでの明示的な処理)、 Xlibスレッドの初期化は必要ない。 単独スレッドのプログラムでは、この関数は呼ばない方がよい。

Xlib呼び出しからディスプレイを締め出すには、 XLockDisplay を使う。

void XLockDisplay(display)
Display *display;
display
Xサーバへの接続を指定。

関数 XLockDisplayは指定したディスプレイの使用に関して、他の全てのスレッドを締め出す。 このスレッドによってディスプレイのロックが解除されるまで、 他のスレッドはロックされる。 XLockDisplayを重ね呼び出しても正しく動作する。この場合、 XUnlockDisplayと同じ回数だけ XLockDisplay .を呼び出すまでディスプレイのロックは解除されない。 XInitThreads を用いてスレッドの初期化に成功していなければこの関数は無効である。

ディスプレイの締め出しを解除するには、 XUnlockDisplay を使う。

void XUnlockDisplay(display)
Display *display;
display
Xサーバへの接続を指定。

関数 XUnlockDisplayは指定したディスプレイを他のスレッドでも使えるようにする。 そのディスプレイでブロックされていた全てのスレッドは動作の続きを行うことができる。 多重ロッキングも正しく動作する。あるスレッドが複数回 XLockDisplayを呼び出した場合、実際にディスプレイのロックを解除するためには同じ回数だけ XUnlockDisplayを呼び出す必要がある。 XInitThreads を使ったXlibのスレッドの初期化に成功していなければ、この関数は無効である。

Using Internal Connections

Xサーバへの接続に加えて、Xlibの実装は 他の種類のサーバへの接続を必要とする(例えば、 13章に示されているインプットメソッドサーバへの接続)。 複数のディスプレイを使っている、あるいは他の入力との組み合わせでディスプレイ を使うツールキットとクライアントはこれらの追加的な接続を得る必要がある。 これは入力が利用可能であり、その入力が利用可能な時、入力を処理する必要 があるまで正確にブロックするためである。 単一ディスプレイを使い、Xlibのイベント関数での入力 に対してブロックを使う単純なクライアントはこれらの機能を使う必要がない。

ディスプレイに対する内部接続を追跡するには、 XAddConnectionWatch を使う。

typedef void (*XConnectionWatchProc)(display, client_data, fd, opening, watch_data)
Display *display;
XPointer client_data;
int fd;
Bool opening;
XPointer *watch_data;

Status XAddConnectionWatch(display, procedure, client_data)
Display *display;
XWatchProc procedure;
XPointer client_data;

display
Xサーバへの接続を指定。
procedure
呼び出される手続きを指定。
client_data
付加的なクライアントデータを指定。

関数 XAddConnectionWatchは指定したディスプレイに対して、Xlibの内部接続をオープンあるいはクローズするとき 毎回呼び出される手続きを登録する。この手続きにはディスプレイ、指定されたclient_data 、接続のディスクリプタ、 接続のオープン/クローズを示す真偽値、 pointer to a location for private watch data. If opening is プライベイトな監視データにへのポインタが渡される。引き数openingが True なら この手続きはプライベートなデータへのポインタをwatch_dataが指す場所に格納する ことができる。 その後、同じ接続に対してこの手続くが呼ばれ、openingが False である時、watch_dataが指す場所には同じプライベートなデータへのポインタが格納されている

この関数はディスプレイをオープンした後はいつでも呼ぶことができる。 内部接続が既に存在する場合、登録された手続きは それぞれの接続に対して即座に呼び出される。 XAddConnectionWatchから処理が戻ってくる前に行われる。 XAddConnectionWatchは手続きの登録に成功すればゼロでない値を返し、 そうでない場合には、ゼロを返す。

登録する手続きからはXlibの関数を呼び出してはならない。 手続きが直接的、間接的に内部接続の状態を変えたり、 監視の手続きを変えたりした場合の結果は未定義である。 Xlibがスレッドを使うように初期化されている場合、この手続きは 呼び出される時にロックされたディスプレイを与えるが、ディスプレイをロックするような Xlib function that locks the display is not defined unless the executing Xlib関数を呼び出すとその結果は未定義となる。ただし、動作している スレッドが XLockDisplay .を使って外部からディスプレイをロックしている場合はこの限りではない。

ディスプレイに対する内部接続の監視を止めるには、 XRemoveConnectionWatch を使う。

Status XRemoveConnectionWatch(display, procedure, client_data)
Display *display;
XWatchProc procedure;
XPointer client_data;
display
Xサーバへの接続を指定。
procedure
呼び出される手続きを指定。
client_data
付加的なクライアントデータを指定。

XRemoveConnectionWatch関数は以前登録した接続監視手続きを削除する。 client_dataは、この手続きが最初に登録されたときに用いられたclient_dataと一致 していなければならない。

内部接続において入力を処理するには、 XProcessInternalConnection を使う。

void XProcessInternalConnection(display, fd)
Display *display;
int fd;
display
Xサーバへの接続を指定。
fd
ファイルディスクリプタを指定する。

関数 XProcessInternalConnectionは内部接続で利用な入力を処理する。 この関数はOSの入力監視機能(例えば、 selectpoll )によって入力が可能であることが示されるまでは、 内部接続に対して呼び出すべきではない。そうでない場合の影響は 未定義である。

ディスプレイに対する現在の内部接続を得るには XInternalConnectionNumbers を使う。

Status XInternalConnectionNumbers(display, fd_return, count_return)
Display *display;
int **fd_return;
int *count_return;
display
Xサーバへの接続を指定。
fd_return
ファイルディスクリプタを返す。
count_return
ファイルディスクリプタの数を返す。

関数 XInternalConnectionNumbersは指定したディスプレイに対して現在オープンされている内部接続 のファイルディスクリプタのリストを返す。 割り当てられたリストが不要になった場合、 XFree を使ってこれを解放すること。 この関数はリストの割り当てに成功した場合にゼロでない値を返し、 そうでない場合にはゼロを返す。


目次に戻る