Chapter 14 クライアント間通信のための関数

14 章: クライアント間通信のための関数

以下では クライアント間通信規約マニュアル(Inter-Client Communication Conventions Manual) を ICCCM と呼ぶことにする。これは X コンソーシアムが承認した、 クライアント間通信を管理するための規約である。 これらの規約は、セレクション、カットバッファ、共有リソースを使った クライアント同士のピアツーピアの協調動作やクライアントと ウィンドウマネージャやセッションマネージャの協調動作を保証する。 詳しい内容についてはクライアント間通信規約マニュアルを参照すること。

Xlib には ICCM 準拠のたくさんの標準プロパティや プログラミングインタフェースが用意されている。 これらのプロパティのために予め定義されているアトムは <X11/Xatom.h>で定義されている。また、ユーザ定義のシンボルとの衝突を避けるために #defineで定義された名前には XA_ というプレフィックスが付けられている。 アトムとプロパティの詳しい説明については 4.3 節を参照すること。

Xlib のセレクション機構とカットバッファ機構は、ピアクラアイント アプリケーションが他のピアクライアントアプリケーションとお互いに通信す るための主なプログラミングインタフェースを提供する。 この章で説明する関数は、クライアントアプリケーションがウィンドウマネージャ やセッションマネージャと通信するためや、標準カラーマップを共有するため の主なプログラミングインタフェースを提供する。

ウィンドウマネージャやセッションマネージャと通信と特に関連がある 標準プロパティを以下に示す:

名前 フォーマット 説明
WM_CLASS STRING 8 ウィンドウマネージャやセッションマネージャがリソースデータベースからアプリケーションのリソースを取得することを許可するためにアプリケーションプログラムが設定する。
WM_CLIENT_MACHINE TEXT クライアントアプリケーションが動作しているマシンの名前を示す文字列。
WM_COLORMAP_WINDOWS WINDOW 32 ウィンドウ ID のリスト。トップレベルウィンドウと異なるカラーマップを必要とするかもしれないウィンドウを示す。
WM_COMMAND TEXT アプリケーションの起動に使われたコマンドと引き数。要素は NULL で区切る。
WM_HINTS WM_HINTS 32 ウィンドウマネージャに使わせるためにクライアントが設定した追加のヒント。このプロパティの C 言語での型はXWMHintsである。
WM_ICON_NAME TEXT アイコンで使われる名前。
WM_ICON_SIZE WM_ICON_SIZE 32 対応しているアイコンのサイズを指定するために、ウィンドウマネージャはこのプロパティをルートウィンドウに設定することがある。このプロパティの C 言語での型はXIconSizeである。
WM_NAME TEXT アプリケーションの名前。
WM_NORMAL_HINTS WM_SIZE_HINTS 32 通常の状態でのウィンドウのサイズに関するヒント。このプロパティの C 言語での型はXSizeHintsである。
WM_PROTOCOLS ATOM 32 クライアントとウィンドウマネージャの間の通信プロトコルのうち、クライアントが参加できるものを示すアトムのリスト。
WM_STATE WM_STATE 32 ウィンドウマネージャとセッションマネージャの間の通信だけで使うことが想定されている。
WM_TRANSIENT_FOR WINDOW 32 ダイアログボックスのような一時的なトップウィンドウをウィンドウマネージャに示すためにアプリケーションプログラムが設定する。

この章の以降で説明するのは以下の内容である:

クライアントからウィンドウマネージャへの通信

この節では以下のことを行う方法を説明します:

トップレベルウィンドウの操作

Xlib にはトップレベルウィンドウ(つまり、ルートウィンドウの子として作ら れたウィンドウ)の可視性やサイズを変更するための関数が用意されている。 ウィンドウマネージャはユーザが作ったサブウィンドウは無視する点に注意す ること。 したがって、アプリケーションのサブウィンドウを扱うには 3 章で説明され ているウィンドウ関連の基本関数を使わなければならない。

トップレベルウィンドウのアイコン化を要求するには XIconifyWindowを使う。

Status XIconifyWindow(display, w, screen_number)
Display *display;
Window w;
int screen_number;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
screen_number
ホストサーバ上の適切なスクリーン番号を指定する。

関数 XIconifyWindow は最初の要素が IconicState(Inter-Client Communication Conventions Manual の 4.1.4 節に説明 がある)であり、引き数 w のウィンドウが設定された WM_CHANGE_STATE ClientMessage イベントを指定されたスクリーンのルートウィンドウに送る。送る際の フォーマットは 32 であり、イベントマスクには SubstructureNotifyMask |SubstructureRedirectMaskが設定される。 ウィンドウマネージャはこのメッセージを受け取ることを選択でき、もし ウィンドウが通常の状態ならば、このメッセージはウィンドウを通常の状態か らアイコン状態に変化させるリクエストとして扱ってよい。 WM_CHANGE_STATE プロパティを取得できなかった場合、 XIconifyWindowはメッセージを送信せず、ステータスとして 0 を返す。 この関数はクライアントメッセージの送信に成功した時に 0 でないステータ スを返し、失敗した場合にはステータスとして 0 を返す。

トップレベルウィンドウを隠すには XWithdrawWindowを使う。

Status XWithdrawWindow(display, w, screen_number)
Display *display;
Window w;
int screen_number;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
screen_number
ホストサーバ上の適切なスクリーン番号を指定する。

関数 XWithdrawWindow は指定したウィンドウをアンマップし、指定したスクリーンの ルートウィンドウに人工的な UnmapNotify イベントを送る。 ウィンドウマネージャはこのメッセージを受け取ることを選択し、 このメッセージをウィンドウをアンマップ状態に変化させるリクエストとして 扱ってよい。 ウィンドウがアンマップ状態にある時は、通常のウィンドウもアイコンも画面 上には現われない。 UnmapNotify イベントを正常に送信できた場合は、この関数は 0 でないステータスを返し、 そうでない場合はステータスとして 0 を返す。

XWithdrawWindowはエラー BadWindowを起こすことがある。

トップレベルウィンドウの構成を変更するリクエストを出すには XReconfigureWMWindowを使う。

Status XReconfigureWMWindow(display, w, screen_number, value_mask, values)
Display *display;
Window w;
int screen_number;
unsigned int value_mask;
XWindowChanges *values;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
screen_number
ホストサーバ上の適切なスクリーン番号を指定する。
value_mask
構造体の情報を使ってどの値をセットするのかを指定する。 このマスクは有効なウィンドウ設定ビット値のビットごとの論理和である。
values
XWindowChanges 構造体を指定する。

関数 XReconfigureWMWindow は指定したトップレベルウィンドウに ConfigureWindow リクエストを発行する。 スタックのモードが変化してリクエストが BadMatchエラーで失敗した場合には、このエラーは Xlib にトラップされ、同じ設定 パラメータを持つ人工的な ConfigureRequestEvent イベントが指定したウィンドウのルートウィンドウに送られる。 ウィンドウマネージャはこのイベントを受け取ることを選択し、このイベント を指定したウィンドウの構成を変えるリクエストとして扱ってもよい。 リクエストやイベントを正常に送信できた場合、この関数は 0 でない ステータスを返し、そうでなければステータスとして 0 を返す。

XReconfigureWMWindowはエラー BadValue ,BadWindowを起こすことがある。

文字列リストの変換

テキストプロパティの多くでは、様々な型やフォーマットが許される。 これらのプロパティに格納されるデータは NULL で終わる単純な文字列ではな いので、 XTextProperty構造体は値とともにエンコーディング、型、テキストの長さを記述するために 使われる。 XTextProperty構造体の内容は以下の通りである:

typedef struct {
	unsigned char *value;	/* プロパティのデータ */
	Atom encoding;	/* プロパティの型 */
	int format;	/* 8, 16, 32 のいずれか */
	unsigned long nitems;	/* 値に含まれる要素数 */
} XTextProperty;

Xlib には、地域化されたテキストとテキストに関するクライアント間通信規約 に対応しているエンコーディングとの相互変換を行う関数が用意されている。 加えて、キャラクタ文字列を指すポインタのリストと STRING エンコード内のテキストプロパティとの相互変換を行う関数も用意さ れている。

地域化されたテキストのための関数は、エラーステータスを符号付きの整数で 返す。 エラーコードのエンコーディングは、 Successを 0 となり、特定のエラー状態が負の整数となるようにエンコードされる。 また、一部しか変換できなかった場合は変換できなかった文字数がエンコード される。

#define XNoMemory -1
#define XLocaleNotSupported -2
#define XConverterNotFound -3
typedef enum {
	XStringStyle,		/* STRING */
	XCompoundTextStyle,	/* COMPOUND_TEXT */
	XTextStyle,		/* 所有者のエンコーディング(現在のロケール)のテキスト */
	XStdICCTextStyle	/* STRING か、さもなければ COMPOUND_TEXT */
} XICCEncodingStyle;

テキスト文字列のリストを XTextProperty構造体に変換するには XmbTextListToTextPropertyまたは XwcTextListToTextPropertyを使う。

int XmbTextListToTextProperty(display, list, count, style, text_prop_return)
Display *display;
char **list;
int count;
XICCEncodingStyle style;
XTextProperty *text_prop_return;
int XwcTextListToTextProperty(display, list, count, style, text_prop_return)
Display *display;
wchar_t **list;
int count;
XICCEncodingStyle style;
XTextProperty *text_prop_return;
display
X サーバへの接続を指定する。
list
NULL で終わる文字列のリストを指定する。
count
指定した文字列の数を指定する。
style
プロパティをエンコードする方法を指定する。
text_prop_return
XTextProperty構造体が返される。

関数 XmbTextListToTextPropertyおよび XwcTextListToTextPropertyは指定した XTextPropertyの値として NULL 文字で区切られた要素からなる集合を設定する。ここで設定 する集合は、NULL 文字で終わるテキスト文字列の指定したリストを結合した ものである。 終端の NULL 文字は text_prop_return の value フィールドの最後に入って いるが、これは nitems の数には含めない。

これらの関数は text_prop_return の encoding フィールドに、指定した ディスプレイに対する Atomを設定する。この Atomは指定したスタイルから決まるエンコーディングを示す。 これらの関数は次に、指定したテキストリストをこのエンコーディングに変換 して text_prop_return フィールドに入れる。 スタイルとして XStringStyleあるいは XCompoundTextStyleが指示された場合は、このエンコーディングはそれぞれ ``STRING'' か ``COMPOUND_TEXT'' となる。 スタイルに XTextStyleが指定された場合には、エンコーディングは現在のロケールのエンコーディン グとなる。 スタイルに XStdICCTextStyleが指示された場合、テキストが完全に STRING に変換可能であれば エンコーディングは ``STRING'' に、そうでなければ ``COMPOUND_TEXT'' に なる。

新しい文字列(XTextProperty の value フィールド)に割り当てるメモリが十 分にない場合、関数は XNoMemoryを返す。 現在のロケールがサポートされていない場合、関数は XLocaleNotSupportedを返す。 どちらのエラーの場合も、関数は text_prop_return に値を設定しない。

関数が XLocaleNotSupportedを返さないかどうかを確実に知るためには、関数 XSupportsLocaleを利用すること。

与えられたテキストの全てが指定されたエンコーディングに変換可能でない場 合、関数は変換できない文字の数を返す。 変換できない文字はそれぞれ実装定義かつエンコーディング特有のデフォルト 文字列に変換される。 上記以外の場合には、関数は Successを返す。 XStringStyleを除く全てのスタイルに対しては、テキストを完全に変換できることが保証さ れている点に注意すること。

XTextProperty 構造体の value フィールドのメモリを解放するには、 XFreeを使用すること。

XTextProperty 構造体からテキスト文字列のリストを取得するには XmbTextPropertyToTextListまたは XwcTextPropertyToTextListを使う。

int XmbTextPropertyToTextList(display, text_prop, list_return, count_return)
Display *display;
XTextProperty *text_prop;
char ***list_return;
int *count_return;
int XwcTextPropertyToTextList(display, text_prop, list_return, count_return)
Display *display;
XTextProperty *text_prop;
wchar_t ***list_return;
int *count_return;
display
X サーバへの接続を指定する。
text_prop
使用する XTextProperty構造体を指定する。
list_return
NULL 文字で終わる文字列のリストが返される。
count_return
文字列の数が返される。

関数 XmbTextPropertyToTextListおよび XwcTextPropertyToTextListは、与えられた XTextProperty構造体が持つ要素(NULL 文字で区切られている)を表すテキスト文字列の リストを返す。テキスト文字列は現在のロケールとなる。 text_prop 内のデータはフォーマット 8 でなければならない。

プロパティの複数の要素(例えば、ばらばらのテキストセレクション文字列)は NULL バイトで区切られる。 プロパティの内容は NULL で終わる必要はない。 終端の NULL 文字は text_prop.nitems に含まれてはならない。

リストとその要素に割り当てる十分なメモリがない場合、関数 XmbTextPropertyToTextListXwcTextPropertyToTextListXNoMemoryを返す。 現在のロケールがサポートされていない場合、関数は XLocaleNotSupportedを返す。 それ以外の場合、もし text_prop の encoding フィールドを現在のロケール のエンコーディングに変換することができなければ、関数は XConverterNotFoundを返す。 サポートされているロケールに対しては、 XSupportsLocaleが現在のロケールに対して Trueを返すならば、COMPOUND_TEXT, STRING, 現在のロケールのエンコーディング からのコンバータの存在が保証される(ただし、実際のテキストは変換不可能 な文字を含むかもしれない)。 他のエンコーディングとの変換については実装依存である。 以上のいずれのエラーの場合も関数は返り値を設定しない。

それ以外の場合には、 XmbTextPropertyToTextListおよび XwcTextPropertyToTextListは list_return に NULL 文字で終わるテキスト文字列のリストを返し、 count_return にテキスト文字列の数を返す。

もし、text_prop の value フィールドを現在のロケールのエンコーディング に完全には変換できない場合には、関数は変換できない文字の数を返す。 変換できないそれぞれの文字は、現在のロケールに含まれ、かつ 現在のロケールに特有の文字列に変換される。 この文字列の値を得るには XDefaultStringを使用する。 それ以外の場合、 XmbTextPropertyToTextListXwcTextPropertyToTextListSuccessを返す。

XmbTextPropertyToTextListが返したリストとその内容のためのメモリを解放するには XFreeStringListを使う。 XwcTextPropertyToTextListが返したリストとその内容のためのメモリを解放するには XwcFreeStringListを使う。

指定したワイド文字文字列に対応するメモリ内データを解放するには XwcFreeStringListを使う。

void XwcFreeStringList(list)
wchar_t **list;
list
解放する文字列のリストを指定する。

関数 XwcFreeStringListは、 XwcTextPropertyToTextListによって割り当てられたメモリを解放する。

現在のロケールにおけるテキスト変換で使うデフォルト文字列を得るには XDefaultStringを使う。

char *XDefaultString( )

関数 XDefaultStringは Xlib が(例えば、 XmbTextPropertyToTextListで)テキスト変換に用いるデフォルト文字列を返す。 デフォルト文字列は現在のロケールの文字列であり、テキスト変換中に変換で きない文字が現れたときに出力される。 XDefaultStringが返す文字列が空文字列("")である場合、変換されたテキストには何も出力 されない。 XDefaultStringは NULL を返さない。

XDefaultStringが返す文字列は、テキスト描画のデフォルト文字列とは独立である。 XFontSetに対するデフォルト文字列を得たい場合は XCreateFontSetの項を参照すること。

Xlib の全ての関数は、不正な文字コードが与えられたときの動作は未定義で ある。

返される文字列は NULL 文字で終わる。 これは Xlib が所有しているので、クライアントは変更や解放をしてはならない。 これは現在のロケールが変更された後に解放される。 解放されるまでは、Xlib によって変更されることはない。

Status XStringListToTextProperty(list, count, text_prop_return)
char **list;
int count;
XTextProperty *text_prop_return;
list
NULL 文字で終わる文字列のリストを指定する。
count
文字列の数を指定する。
text_prop_return
XTextProperty構造体が返される。

関数 XStringListToTextProperty は、指定された文字列のリストの要素を繋げた値を指定された XTextPropertyに設定する。 設定される値は STRING 型(フォーマット 8)であり、元のそれぞれの文字列は NULL で終わる。 追加の NULL バイト(これは nitems メンバの数には入らない)は、 text_prop_return の value フィールドの最後に格納される。 文字列のエンコーディングは STRING であるものと(検査なしに)想定される。 新しい文字列に割り当てる十分なメモリがなかった場合、 XStringListToTextPropertyXTextProperty構造体のどのフィールドにも値を設定せず、ステータスとして 0 を返す。 そうでない場合、この関数は 0 でないステータスを返す。 value フィールドのメモリを解放するには XFreeを使用すること。

指定された XTextProperty構造体(STRING エンコーディング)から文字列のリストを得るには XTextPropertyToStringListを使う。

Status XTextPropertyToStringList(text_prop, list_return, count_return)
XTextProperty *text_prop;
char ***list_return;
int *count_return;
text_prop
使われる XTextProperty構造体を指定する。
list_return
NULL 文字で終わる文字列のリストが返される。
count_return
文字列の数が返される。

関数 XTextPropertyToStringListは指定した XTextProperty構造体が持つ要素群(NULL で区切られている)の内容を表す文字列のリストを 返す。 text_prop 内のデータは STRING 型かつフォーマット 8 でなければならない。 プロパティに複数個の要素が含まれる場合(例えば、細切れになったテキスト セレクションに含まれている文字列)は NULL (エンコーディング 0)で区切ら れている。 プロパティの内容の終端は NULL ではない。 リストとその要素に割り当てる十分なメモリがなかった場合、 XTextPropertyToStringListは変数に内容を設定せず、ステータスとして 0 を返す。 そうでない場合、この関数は 0 でないステータスを返す。 リストとその内容のメモリを解放するには XFreeStringList

指定された文字列リストに対応するメモリ内のデータを解放するには XFreeStringListを使う。

void XFreeStringList(list)
char **list;
list
解放する文字列のリストを指定する。

関数 XFreeStringListXmbTextPropertyToTextListXTextPropertyToStringListが割り当てたメモリと、 XCreateFontSetが割り当てた欠けている文字集合のリストを解放する。

テキストプロパティの設定と読み込み

Xlib には指定されたウィンドウのテキストプロパティの設定と取得を行うた めの関数が 2 つ用意されている。 これらの関数を使って、TEXT 型 (WM_NAME, WM_ICON_NAME, WM_COMMAND, WM_CLIENT_MACHINE)のプロパティの設定と取得を行える。 さらに、Xlib にはこれらの属性を設定できる別々の簡易関数が用意されている。 これらの簡易関数に関する情報については 14.1.4, 14.1.5, 14.2.1, 14.2.2 を参照すること。

ウィンドウのテキストプロパティの一つを設定するには XSetTextPropertyを使う。

void XSetTextProperty(display, w, text_prop, property)
Display *display;
Window w;
XTextProperty *text_prop;
Atom property;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
text_prop
使われる XTextProperty構造体を指定する。
property
プロパティの名前が返される。

関数 XSetTextPropertyは指定されたウィンドウに対して現在指定されているプロパティのデータ、型、 フォーマット、アイテム数を、指定した XTextProperty構造体の value フィールド、encoding フィールド、format フィールド、 nitems フィールドでそれぞれ置き換える。 以前にプロパティが指定されていなければ、 XSetTextPropertyはプロパティを指定したウィンドウに設定する。

XSetTextPropertyはエラー BadAlloc ,BadAtom ,BadValue ,BadWindowを起こすことがある。

ウィンドウのテキストプロパティの一つを取得するには XGetTextPropertyを使う。

Status XGetTextProperty(display, w, text_prop_return, property)
Display *display;
Window w;
XTextProperty *text_prop_return;
Atom property;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
text_prop_return
XTextProperty構造体が返される。
property
プロパティ名を指定する。

関数 XGetTextProperty は指定されたプロパティをウィンドウから取得し、そのデータを XTextProperty構造体に格納して返す。 この関数はデータを value フィールドに、データの型を encoding フィール ドに、データのフォーマットを format フィールドに、データのアイテム数を nitems フィールドに格納する。 値が NULL である追加のバイトデータ(これは nitems メンバの数には含まれない)が、 text_prop_return の value フィールドの最後に格納される。 プロパティのエンコーディングの解釈やデータをテキストと解釈することは、 関数を呼び出したアプリケーションの裁量に任される。 指定されたプロパティをウィンドウが持っていない場合、 XGetTextPropertyは value フィールドに NULL, encoding フィールドに None ,format フィールドに 0, nitems フィールドに 0 を設定する。

XTextProperty構造体のデータの取得や格納ができない場合、 XGetTextPropertyは 0 でないステータスを返す。 それ以外の場合はステータスとして 0 が返される。

XGetTextPropertyはエラー BadAtom ,BadWindowを返すことがある。

WM_NAME プロパティの設定と取得

Xlib には、指定されたウィンドウに対して WM_NAME プロパティの設定と取得 を行うための簡易関数が用意されている。

既存の簡易関数で WM_NAME プロパティに設定するには XSetWMNameを使う。

void XSetWMName(display, w, text_prop)
Display *display;
Window w;
XTextProperty *text_prop;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
text_prop
使われる XTextProperty構造体を指定する。

簡易関数 XSetWMNameは、 XSetTextPropertyを呼び出して WM_NAME プロパティを設定する。

既存の簡易関数で WM_NAME プロパティに取得するには XGetWMNameを使う。

Status XGetWMName(display, w, text_prop_return)
Display *display;
Window w;
XTextProperty *text_prop_return;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
text_prop_return
XTextProperty構造体が返される。

簡易関数 XGetWMNameは、 XGetTextPropertyを呼び出して WM_NAME プロパティを取得する。 この関数は成功時には 0 でないステータスを返し、そうでない場合には ステータスとして 0 を返す。

以下の 2 つの関数は既に XSetWMNameXGetWMNameによって置き換えられている。 STRING プロパティでエンコードされているウィンドウ名に対しては これらの簡易関数を代わりに使ってもよい。

名前をウィンドウに割り付けるには XStoreNameを使う。

XStoreName(display, w, window_name)
Display *display;
Window w;
char *window_name;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
window_name
ウィンドウ名を指定する。これは NULL で終わる文字列でなければならない。

関数 XStoreNameは window_name に渡された名前を指定されたウィンドウに割り付ける。 ウィンドウマネージャはウィンドウ名をウィンドウの目立つ場所(例えばタイ トルバー)に表示し、ユーザがウィンドウを容易に識別できるようにすることができる。 アプリケーションからアイコン名が与えられた場合、ウィンドウのアイコンに はアイコン名を使うことが推奨されているが、ウィンドウマネージャによっては ウィンドウ名をアイコンに表示するかもしれない。 文字列のエンコーディングがホストポータブル文字エンコーディングでない場 合には、実行結果は実装依存である。

XStoreNameはエラー BadAllocおよび BadWindowを起こすことがある。

ウィンドウの名前を取得するには XFetchNameを使う。

Status XFetchName(display, w, window_name_return)
Display *display;
Window w;
char **window_name_return;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
window_name_return
ウィンドウの名前が返される。これは NULL で終わる文字列である。

関数 XFetchNameは指定したウィンドウの名前を返す。 成功時にはこの関数は 0 でないステータスを返す。 そうでない場合、ウィンドウに名前が設定されたことがあれば、この関数は 0 を返す。 このウィンドウに対して WM_NAME プロパティが1度も設定されたことがなけ れば、 XFetchNameは window_name_return に NULL を設定する。 サーバが返す文字列のエンコーディングが Latin ポータブル文字エンコーディ ングであれば、返される文字列のエンコーディングは ホストポータブル文字エンコーディングである。 ウィンドウ名の文字列を使い終った後には、クライアントは XFreeを使ってこれを解放しなければならない。

XFetchNameはエラー BadWindowを起こすことがある。

WM_ICON_NAME プロパティの設定と取得

Xlib には指定されたウィンドウに対して WM_ICON_NAME の設定と取得を行う ための簡易関数が用意されている。

WM_ICON_NAME を設定するには XSetWMIconNameを使う。

void XSetWMIconName(display, w, text_prop)
Display *display;
Window w;
XTextProperty *text_prop;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
text_prop
使われる XTextProperty構造体を指定する。

簡易関数 XSetWMIconNameは、 XSetTextPropertyを呼び出して WM_ICON_NAME プロパティを設定する。

ウィンドウの WM_ICON_NAME プロパティを設定するには XGetWMIconNameを使う。

Status XGetWMIconName(display, w, text_prop_return)
Display *display;
Window w;
XTextProperty *text_prop_return;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
text_prop_return
XTextProperty構造体が返される。

The 簡易関数 XGetWMIconNameは、 XGetTextProperty を呼び出して WM_ICON_NAME プロパティを取得する。 この関数は成功時に 0 でないステーテスを返し、そうでない場合には ステータスとして 0 を返す。

次の 2 つの関数は既に XSetWMIconNameによって XGetWMIconName置き換えられている。 STRING プロパティでエンコードされているウィンドウ名に対しては これらの簡易関数を代わりに使ってもよい。

ウィンドウのアイコン内に表示される名前を設定するには XSetIconNameを使う。

XSetIconName(display, w, icon_name)
Display *display;
Window w;
char *icon_name;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
icon_name
アイコン名を指定する。 これは NULL で終わる文字列でなければならない。

文字列のエンコーディングがホストポータブル文字エンコーディングでなけれ ば、結果は実装依存となる。 XSetIconNameはエラー BadAlloc ,BadWindowを起こすことがある。

ウィンドウがアイコン内に表示するための文字列を取得するには XGetIconNameを使う。

Status XGetIconName(display, w, icon_name_return)
Display *display;
Window w;
char **icon_name_return;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
icon_name_return
ウィンドウのアイコン名が返される。 これは NULL で終わる文字列である。

関数 XGetIconNameは指定したウィンドウのアイコンに表示すべき名前を返す。 この関数は成功の場合には 0 でないステータスを返す。 そうでない場合は、ウィンドウに対するアイコン名が設定されていなければ 0 を返す。 今までウィンドウに名前が一度も付けられていなければ、 XGetIconNameは icon_name_return に NULL を設定する。 サーバが返すデータが Latin ポータブル文字エンコーディングの場合には、 返される文字列のエンコーディングはホストポータブル文字エンコーディング である。 そうでない場合の結果は実装依存である。 アイコン名の文字列を使い終った後には、クライアントはこの文字列を XFreeを使って解放しなければならない。

XGetIconNameはエラー BadWindowを起こすことがある。

WM_HINTS プロパティの設定と取得

Xlib には指定されたウィンドウに対して WM_HINTS プロパティの読み書きを 行うための関数が用意されている。 これらの関数は、ヘッダファイル <X11/Xutil.h>で定義されているフラグと XWMHints 構造体を使う。

XWMHints構造体を割り当てるには XAllocWMHintsを使う。

XWMHints *XAllocWMHints( )

関数 XAllocWMHintsXWMHints構造体を割り当てて、この構造体へのポインタを返す。 XWMHints構造体の全てのフィールドは 0 で初期化される点に注意すること。 十分なメモリが確保できない場合、 XAllocWMHintsは NULL を返す。 この構造体に割り当てられたメモリを解放する時には XFreeを使用すること。

XWMHints構造体の内容は以下である。

/* ウィンドウマネージャへのヒントのマスクビット */

#define InputHint (1L << 0)
#define StateHint (1L << 1)
#define IconPixmapHint (1L << 2)
#define IconWindowHint (1L << 3)
#define IconPositionHint (1L << 4)
#define IconMaskHint (1L << 5)
#define WindowGroupHint (1L << 6)
#define UrgencyHint (1L << 8)
#define AllHints (InputHint|StateHint|IconPixmapHint|
IconWindowHint|IconPositionHint|
IconMaskHint|WindowGroupHint)
/* Values */
typedef struct {
	long flags;	/* 構造体のどのフィールドが設定されているかを示すマーク */
	Bool input;	/* このアプリケーションはウィンドウマネージャ経由でキーボード入力を取得するかどうか /*
	int initial_state;	/* 後述 */
	Pixmap icon_pixmap;	/* アイコンとして使用されるピックスマップ */
	Window icon_window;	/* アイコンとして使用されるウィンドウ */
	int icon_x, icon_y;	/* アイコンの初期位置 */
	Pixmap icon_mask;	/* icon_pixmap のマスクとして使われるピックスマップ */
	XID window_group;	/* 関連するウィンドウグループの ID */
	/* この構造体は将来拡張されるかもしれない */
} XWMHints;

input メンバは、アプリケーションが使う入力フォーカスモデルを ウィンドウマネージャに伝えるために用いられる。 リアルエステートドリブンフォーカス(real-estate driven focus)を使う X バージョン 10 スタイルのアプリケーションのように、入力を期待するが明示 的にサブウィンドウにフォーカスを設定しない(つまり、フォーカス管理の プッシュモデルを使っている)アプリケーションでは、このメンバを Trueに設定すべきである。 同様に、ウィンドウマネージャによってトップレベルウィンドウにフォーカス が与えられた時だけ入力フォーカスがサブウィンドウに設定される アプリケーションでも、このメンバを Trueに設定すべきである。 キーボードの入力が必要なときには明示的にフォーカスをサブウィンドウに設 定することによって自分自身で入力を管理するような(つまり、フォーカス管 理のプルモデルを使っている)アプリケーションでは、このメンバを Falseに設定すべきである。 キーボードの入力を全く使わないアプリケーションでも、このメンバを Falseに設定すべきである。

プルモデルのウィンドウマネージャは、input メンバが Trueであるアプリケーションのトップレベルウィンドウに入力フォーカスを設定 することによって、プッシュモデルのアプリケーションが入力を取得できるよ うにしなければならない。 プッシュモデルのウィンドウマネージャは、しかるべきタイミング(例えば、 input メンバが Falseであるアプリケーションが入力フォーカスをサブウィンドウに設定したとき) に入力フォーカスを PointerRoot にリセットすることによって、プルモデルのアプリケーションがウィンドウマ ネージャを破壊してしまわないように注意しなければならない。

initial_state フラグの定義を以下に示す。

#define WithdrawnState 0
#define NormalState 1 /* ほとんどのアプリケーションはこれで起動する */
#define IconicState 3 /* アプリケーションをアイコンとして起動させたい */
icon_mask は icon_pixmap のどのピクセルがアイコンとして使用されるかを 指定する。 これを使えば非矩形のアイコンを利用できる。 icon_pixmap と icon_mask はいずれもビットマップでなければならない。 icon_window は、与えたウィンドウをアイコンとして使うことができるウィン ドウマネージャのために、アプリケーションにウィンドウを提供させる。 window_group は、このウィンドウが他のウィンドウのグループに属している ことを示す。 例えばある単独のアプリケーションが複数のトップレベルウィンドウを操作す る場合に window_group を使えば、ウィンドウマネージャが 1 つのウィンドウ だけでなく全てのウィンドウを同時にアイコン化させるために十分な情報を与 えることができる。

UrgencyHintフラグが flags フィールドに設定されていれば、クライアントはウィンド ウの内容が緊急事項であり、ユーザの適時な応答を必要とすることを示す。 ウィンドウマネージャはこのフラグが設定されている間、ユーザの注意を引 くために何らかの動作をする。 クライアントは、ユーザがこの urgency フラグをクリアするための何らかの 手段(ウィンドウの urgent フラグの条件を緩和するか、単にアラームを止め る)か、ウィンドウを消すための手段を用意しなければならない。

ウィンドウの WM_HINTS プロパティを設定するには XSetWMHintsを使う。

XSetWMHints(display, w, wmhints)
Display *display;
Window w;
XWMHints *wmhints;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
wmhints
使用する XWMHints構造体を指定する。

関数 XSetWMHintsはウィンドウマネージャへのヒントを設定する。 このヒントにはアイコンの情報や位置やウィンドウの初期状態、アプリケーション はウィンドウマネージャ経由でキーボード入力を取得するかどうかなどの情 報が含まれる。

XSetWMHintsはエラー BadAlloc ,BadWindowを起こすことがある。

ウィンドウの WM_HINTS プロパティを取得するには XGetWMHintsを指定する。

XWMHints *XGetWMHints(display, w)
Display *display;
Window w;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。

関数 XGetWMHintsはウィンドウマネージャへのヒントを読み、ウィンドウに WM_HINTS プロパティ が設定されていなければ NULL を返し、成功すれば XWMHints 構造体へのポインタを返す。 データを使い終った後は XFreeを呼んでメモリを解放すること。

XGetWMHintsはエラー BadWindowを起こすことがある。

WM_NORMAL_HINTS プロパティの設定と取得

Xlib には、与えられたウィンドウの WM_NORMAL_HINTS プロパティの設定と 取得を行うための関数が用意されている。 この関数は、ヘッダファイル <X11/Xutil.h>で定義されているフラグと構造体を使う。

新しい ICCCM 機能に対応するために新しい要素が加わることにより、 XSizeHints構造体のサイズは将来のリリースで大きくなるかもしれない。 静的に割り当てられたこの構造体のインスタンスを Xlib に渡すと、 将来のリリースのライブラリと組み合わせて実行した時にメモリの破壊が起こ るかもしれない。 したがって、この構造体のインスタンスは動的に割り当てるだけにすることが 望ましい。

XSizeHints構造体を割り当てるには XAllocSizeHintsを使う。

XSizeHints *XAllocSizeHints( )

関数 XAllocSizeHintsXSizeHints構造体を割り当て、その構造体を指すポインタを返す。 構造体の全てのフィールドは 0 で初期化される点に注意すること。 十分なメモリが確保できない場合、 XAllocSizeHintsは NULL を返す。 この構造体に割り当てられたメモリを解放するには XFreeを使うこと。

The XSizeHints構造体の内容を示す。

/* サイズヒントのマスクビット値 */

#define USPosition (1L << 0) /* ユーザが指定した x, y */
#define USSize (1L << 1) /* ユーザが指定した幅と高さ */
#define PPosition (1L << 2) /* プログラムが指定した位置 */
#define PSize (1L << 3) /* プログラムが指定したサイズ */
#define PMinSize (1L << 4) /* プログラムが指定した最小サイズ */
#define PMaxSize (1L << 5) /* プログラムが指定した最大サイズ */
#define PResizeInc (1L << 6) /* プログラムが指定したサイズ変更の増分 */
#define PAspect (1L << 7) /* プログラムが指定したアスペクト比の最小値と最大値 */
#define PBaseSize (1L << 8)
#define PWinGravity (1L << 9)
#define PAllHints (PPosition|PSize|
PMinSize|PMaxSize|
PResizeInc|PAspect)
/* 値 */
typedef struct {
 	long flags;	/* この構造体のどのフィールドが定義されているか示す */
 	int x, y;	/* 現在は使われない */
 	int width, height;	/* 現在は使われない */
	int min_width, min_height;
	int max_width, max_height;
	int width_inc, height_inc;
	struct {
 	       int x;	/* 分子 */
 	       int y;	/* 分母 */
	} min_aspect, max_aspect;
	int base_width, base_height;
	int win_gravity;
 	/* この構造体は将来拡張されるかもしれない */
} XSizeHints;

x, y, width, height メンバは現在は使われなくなっており、単に互換性のため に残されているだけである。 min_width, min_height メンバはアプリケーションが使いものになる最小限の ウィンドウのサイズを指定する。 max_width, max_height メンバはウィンドウの最大サイズを指定する。 width_inc, height_inc メンバは、そのウィンドウにとって望ましいサイズに 変更する場合の、サイズの増分(最小値から最大値)を定義する。 min_aspect, max_aspect メンバは x, y の比として表され、望ましいアスペ クト比の範囲を指定することができる。 base_width, base_height はウィンドウの望ましいサイズを定義する。 ウィンドウマネージャはウィンドウの位置と境界幅を判断し、win_gravity メ ンバで指定されたウィンドウ全体の外側の長方形の位置にウィンドウを配置する。 ウィンドウの外側の長方形には、境界とウィンドウマネージャが付けた修飾部 分も含められる。 つまり、ウィンドウマネージャがクライアントが要求した位置にそのウィンドウ を配置すると決めたならば、win_gravity で指定される親ウィンドウの境界上 における位置は、ウィンドウマネージャがなければ本来クライアントの ウィンドウとなっていた場所になる。

マクロ PAllHintsの利用は極めて好ましくない点に注意すること。

ウィンドウの WM_NORMAL_HINTS プロパティを設定するには XSetWMNormalHintsを使う。

void XSetWMNormalHints(display, w, hints)
Display *display;
Window w;
XSizeHints *hints;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
hints
通常の状態でのウィンドウのサイズヒントを指定する。

関数 XSetWMNormalHints は指定したウィンドウの WM_NORMAL_HINTS プロパティのサイズヒントを置き 換える。 このプロパティがまだ存在しない場合、 XSetWMNormalHintsは指定したウィンドウの WM_NORMAL_HINTS プロパティにサイズヒントを設定 する。 このプロパティは タイプ WM_SIZE_HINTS, フォーマット 32 で格納される。

はエラー BadAlloc ,BadWindowを起こすことがある。

ウィンドウの WM_NORMAL_HINTS プロパティを取得するには XGetWMNormalHints を使う。

Status XGetWMNormalHints(display, w, hints_return, supplied_return)
Display *display;
Window w;
XSizeHints *hints_return;
long *supplied_return;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
hints_return
通常の状態でのウィンドウのサイズヒントが返される。
supplied_return
ユーザが与えたヒントが返される。

関数 XGetWMNormalHintsは、指定したウィンドウの WM_NORMAL_HINTS プロパティに格納されている サイズヒントを返す。 このプロパティが WM_SIZE_HINTS 型、フォーマット 32 であり、新旧いず れのサイズヒント構造体(古いものは ICCCM 以前の形式)でも格納できる十分 な長さを持つ場合、 XGetWMNormalHintsXSizeHintsの各フィールドを設定し、ユーザが与えたフィールドのリストを(既に定義 されている値を含んでいるかどうかに関わらず)引き数 supplied_return に 設定し、0 でないステータスを返す。 この条件を満たさない場合は、この関数はステータスとして 0 を返す。

XGetWMNormalHintsが成功した時に ICCCM 形式の古いサイズヒントプロパティが取得された場合、 引き数 supplied_return には次のビットが含まれる。

(USPosition|USSize|PPosition|PSize|PMinSize|
 PMaxSize|PResizeInc|PAspect)

プロパティが十分大きく、プロパティがベースサイズとウィンドウの gravity 値も持つことができた場合、引き数 supplied_return には次のビットが含ま れる。

PBaseSize|PWinGravity

XGetWMNormalHintsはエラー BadWindowを起こすことがある。

ウィンドウの WM_SIZE_HINTS プロパティを設定するには XSetWMSizeHintsを使う。

void XSetWMSizeHints(display, w, hints, property)
Display *display;
Window w;
XSizeHints *hints;
Atom property;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
hints
使用する XSizeHints構造体を指定する。
property
プロパティ名を指定する。

関数 XSetWMSizeHints は指定したウィンドウの指定したプロパティのサイズヒントを置き換える。 そのプロパティがまだ存在しない場合、 XSetWMSizeHintsは指定したウィンドウのプロパティにサイズヒントを設定する。 このプロパティは WM_SIZE_HINTS 型、フォーマット 32 で格納される。 ウィンドウの通常のサイズヒントを設定するには、関数 XSetWMNormalHintsを使うことができる。

XSetWMSizeHintsはエラー BadAlloc ,BadAtom ,BadWindowを起こすことがある。

ウィンドウの WM_SIZE_HINTS プロパティを取得するには XGetWMSizeHintsを使う。

Status XGetWMSizeHints(display, w, hints_return, supplied_return, property)
Display *display;
Window w;
XSizeHints *hints_return;
long *supplied_return;
Atom property;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
hints_return
XSizeHints構造体が返される。
supplied_return
ユーザが指定したヒントが返される。
property
プロパティ名を指定する。

関数 XGetWMSizeHintsは、指定したウィンドウの指定したプロパティに格納されているサイズヒント を返す。 このプロパティが WM_SIZE_HINTS 型、フォーマット 32 であり、新旧いず れのサイズヒント構造体(古いものは ICCCM 以前の形式)も格納できる十分な 長さを持つ場合、 XGetWMSizeHintsXSizeHintsの各フィールドを設定し、ユーザが与えたフィールドのリストを(既に定義 されている値を含んでいるかどうかに関わらず)引き数 supplied_return に 設定し、0 でないステータスを返す。 この条件を満たさない場合は、この関数はステータスとして 0 を返す。 ウィンドウの通常のサイズヒントを取得するためには、関数 XGetWMNormalHints が利用できる。

If XGetWMSizeHintsが成功し、ICCCM の古いサイズヒントプロパティが取得された場合、引き数 supplied_return は次のビットを含む。

(USPosition|USSize|PPosition|PSize|PMinSize|
 PMaxSize|PResizeInc|PAspect)

プロパティが十分大きく、プロパティがベースサイズとウィンドウの gravity 値も持つことができた場合、引き数 supplied_return には次のビットが含まれ る。

PBaseSize|PWinGravity

XGetWMSizeHintsはエラー BadAtom ,BadWindowを起こすことがある。

WM_CLASS プロパティの設定と取得

Xlib には、指定されたウィンドウの WM_CLASS プロパティの設定と取得を行 うための関数が用意されている。 これらの関数は XClassHint 構造体を使う。この構造体はヘッダファイル <X11/Xutil.h>で定義されている。

XClassHint構造体を割り当てるには XAllocClassHintを使う。

XClassHint *XAllocClassHint( )

関数 XAllocClassHintXClassHint構造体を割り当て、この構造体へのポインタを返す。 XClassHint構造体の pointer フィールドは NULL で初期化される点に注意すること。 十分なメモリが確保できない場合、 XAllocClassHintは NULL を返す。 この構造体に対して割り当てられたメモリを解放するには、 XFreeを使用すること。

XClassHint構造体の内容を示す。

typedef struct {
	char *res_name;
	char *res_class;
} XClassHint;

res_name メンバはアプリケーションの名前であり、 res_class はアプリケーションのクラスである。 このプロパティに設定されている名前は、WM_NAME として設定されている 名前とは異なる場合がある点に注意すること。 つまり、WM_NAME はタイトルバーに表示すべきものであり、したがって一時 的な情報を持つことがある(例えばエディタのバッファの現在のファイル名)。 一方、WM_CLASS の一部として指定される名前は、リソースデータベースから アプリケーションのリソースを取り出す時に使われるアプリケーションの正 式な名前である。

ウィンドウの WM_CLASS プロパティを設定するには XSetClassHintを使う。

XSetClassHint(display, w, class_hints)
Display *display;
Window w;
XClassHint *class_hints;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
class_hints
使用される XClassHint構造体を指定する。

関数 XSetClassHintは指定したウィンドウのクラスヒントを設定する。 文字列のエンコーディングがホストポータブル文字エンコーディングでない場 合、結果は実装依存である。

XSetClassHintはエラー BadAlloc ,BadWindowを起こすことがある。

ウィンドウの WM_CLASS プロパティを取得するには XGetClassHintを使う。

Status XGetClassHint(display, w, class_hints_return)
Display *display;
Window w;
XClassHint *class_hints_return;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
class_hints_return
XClassHint構造体が返される。

関数 XGetClassHintは、指定したウィンドウのクラスヒントを、与えられた構造体のメンバに返す。 サーバが返すデータのエンコーディングが Latin ポータブル文字エンコーディ ングならば、関数が返す文字列のエンコーディングはホストポータブル文字エ ンコーディングである。 そうでない場合の結果は実装依存である。 この関数は成功した場合には 0 でないステータスを返し、失敗した場合には ステータスとして 0 を返す。 文字列 res_name と res_class を使い終った後に解放するには、それぞれに 対して XFreeを行なうこと。

XGetClassHintはエラー BadWindowを起こすことがある。

WM_TRANSIENT_FOR プロパティの設定と取得

Xlib には、指定されたウィンドウの WM_TRANSIENT_FOR プロパティの設定と 取得のための関数が用意されている。

WM_TRANSIENT_FOR プロパティを設定するには XSetTransientForHintを使う。

XSetTransientForHint(display, w, prop_window)
Display *display;
Window w;
Window prop_window;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
prop_window
WM_TRANSIENT_FOR プロパティが設定されるウィンドウを指定。

XSetTransientForHintはエラー BadAlloc ,BadWindow を起こすことがある。

ウィンドウの WM_TRANSIENT_FOR プロパティを取得するには XGetTransientForHintを使う。

Status XGetTransientForHint(display, w, prop_window_return)
Display *display;
Window w;
Window *prop_window_return;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
prop_window_return
指定したウィンドウの WM_TRANSIENT_FOR プロパティが返される。

関数 XGetTransientForHintは指定したウィンドウの WM_TRANSIENT_FOR プロパティを返す。 この関数は成功時には 0 でないステータスを返し、そうでない場合は ステータスとして 0 を返す。

XGetTransientForHintはエラー BadWindow を起こすことがある。

WM_PROTOCOLS プロパティの設定と取得

Xlib には、指定されたウィンドウの WM_PROTOCOLS プロパティの設定と取得 のための関数が用意されている。

WM_PROTOCOLS プロパティを設定するには XSetWMProtocolsを使う。

Status XSetWMProtocols(display, w, protocols, count)
Display *display;
Window w;
Atom *protocols;
int count;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
protocols
プロトコルのリストを指定する。
count
リスト中のプロトコルの数を返す。

関数 XSetWMProtocolsは、指定したウィンドウの WM_PROTOCOLS プロパティを、引き数 protocols で 指定したアトムのリストで置き換える。 このプロパティが以前に指定されていなければ、 XSetWMProtocolsは引き数 protocols で指定されたアトムのリストを指定されたウィンドウの WM_PROTOCOLS プロパティに設定する。 プロパティは ATOM 型、フォーマット 32 で保持される。 WM_PROTOCOLS アトムを確保できなければ、 XSetWMProtocolsはステータスとして 0 を返す。 そうでなければ、この関数は 0 でないステータスを返す。

XSetWMProtocolsはエラー BadAlloc ,BadWindowを起こすことがある。

WM_PROTOCOLS プロパティを取得するには XGetWMProtocolsを使う。

Status XGetWMProtocols(display, w, protocols_return, count_return)
Display *display;
Window w;
Atom **protocols_return;
int *count_return;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
protocols_return
プロトコルのリストが返される。
count_return
リスト中のプロトコルの数が返される。

関数 XGetWMProtocolsは、指定したウィンドウの WM_PROTOCOLS プロパティに保持されているアトムの リストを返す。 これらのアトムには、ウィンドウマネージャのプロトコルの中で このウィンドウの所有者が使用できるものを記述する。 もしプロパティが存在し、ATOM 型、フォーマット 32 であり、アトム WM_PROTOCOLS が確保できるならば、 XGetWMProtocolsは引き数 protocols_return にアトムのリストを設定し、引き数 count_return にリストの要素数を設定して、0 でないステータスを返す。 そうでない場合は、いずれの引き数もセットされず、0 がステータスとして 返される。 アトムのリストを解放するには、 XFreeを使用すること。

XGetWMProtocolsはエラー BadWindowを起こすことがある。

WM_COLORMAP_WINDOWS プロパティの設定と取得

Xlib には、指定されたウィンドウについて WM_COLORMAP_WINDOWS プロパティの設定と取得を行うための関数が用意されている。

ウィンドウの WM_COLORMAP_WINDOWS プロパティを設定するには XSetWMColormapWindowsを使う。

Status XSetWMColormapWindows(display, w, colormap_windows, count)
Display *display;
Window w;
Window *colormap_windows;
int count;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
colormap_windows
ウィンドウのリストを指定する。
count
ウィンドウのリストの数を指定する。

関数 XSetWMColormapWindowsは、指定したウィンドウの WM_COLORMAP_WINDOWS プロパティを、引き数 colormap_windows で指定したウィンドウのリストに置き換える。 このプロパティが以前に指定されていなければ、 XSetWMColormapWindowsは、指定したウィンドウの WM_COLORMAP_WINDOWS を、colormap_windows で指 定したウィンドウのリストに設定する。 プロパティは WINDOW 型、フォーマット 32 で保持される。 WM_COLORMAP_WINDOWS アトムを確保できない場合には、 XSetWMColormapWindowsはステータスとして 0 を返す。 そうでない場合には 0 でないステータスを返す。

XSetWMColormapWindowsはエラー BadAlloc ,BadWindowを起こす場合がある。

ウィンドウの WM_COLORMAP_WINDOWS プロパティを取得するには XGetWMColormapWindowsを使う。

Status XGetWMColormapWindows(display, w, colormap_windows_return, count_return)
Display *display;
Window w;
Window **colormap_windows_return;
int *count_return;
display
X サーバへの接続を指定する。
w
colormap_windows_return
ウィンドウのリストが返される。
count_return
リスト中のウィンドウの数が返される。

関数 XGetWMColormapWindowsは、指定したウィンドウの WM_COLORMAP_WINDOWS プロパティに保持されてい るウィンドウ ID のリストを返す。 これらの ID は、ウィンドウマネージャがこのウィンドウをインストールすると きに必要となるカラーマップを示す。 プロパティが存在し、WINDOW 型かつフォーマット 32 であり、アトム WM_COLORMAP_WINDOWS を確保できる場合には、 XGetWMColormapWindowsは引き数 windows_return にウィンドウ ID のリストを設定し、引き数 count_return にリストの要素数を設定し、0 でないステータスを返す。 そうでない場合には、関数はいずれの引き数も設定せず、ステータスとして 0 を返す。 ウィンドウ ID のリストを解放するには、 XFreeを使用すること。

XGetWMColormapWindowsはエラー BadWindowを起こすことがある。

WM_ICON_SIZE プロパティの設定と取得

Xlib には、指定されたウィンドウに対して WM_ICON_SIZE プロパティの設定 と取得を行うための関数が用意されている。 これらの関数は XIconSize 構造体を使う。この構造体はヘッダファイル <X11/Xutil.h>で定義されている。

XIconSize構造体を割り当てるには XAllocIconSizeを使う。

XIconSize *XAllocIconSize( )

関数 XAllocIconSizeXIconSize構造体を割り当て、この構造体を指すポインタを返す。 XIconSizeの全てのフィールドは 0 で初期化される。 十分なメモリが確保できない場合、 XAllocIconSizeは NULL を返す。 この構造体に割り当てられたメモリを解放するには、 XFreeを使用すること。

XIconSize構造体の内容を示す。

typedef struct {
	int min_width, min_height;
	int max_width, max_height;
	int width_inc, height_inc;
} XIconSize;

width_inc と height_inc メンバは、サポートされているアイコンのサイズを 表す、サイズの増分(最小値から最大値まで)を定義する。

ウィンドウの WM_ICON_SIZE プロパティを設定するには XSetIconSizesを使う。

XSetIconSizes(display, w, size_list, count)
Display *display;
Window w;
XIconSize *size_list;
int count;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
size_list
サイズのリストを指定する。
count
サイズのリスト中の要素数を指定する。

関数 XSetIconSizesはウィンドウマネージャだけが使う関数で、サポートしているアイコンの サイズを設定する。

XSetIconSizesはエラー BadAlloc ,BadWindowを起こすことがある。

ウィンドウの WM_ICON_SIZE プロパティを取得するには XGetIconSizesを使う。

Status XGetIconSizes(display, w, size_list_return, count_return)
Display *display;
Window w;
XIconSize **size_list_return;
int *count_return;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
size_list_return
サイズのリストが返される。
count_return
サイズのリスト中の要素数が返される。

関数 XGetIconSizesは、ウィンドウマネージャがアイコンのサイズをまだ設定していなければ 0 を返し、すでに設定していれば 0 でない値を返す。 XGetIconSize をアプリケーションが呼び出すべきなのは、 自分の上位にあるウィンドウマネージャにとって最も適切なアイコンサイズを 調べたい場合である。 その後、そのアプリケーションはサポートされているサイズの中から ピクスマップやウィンドウを選び、XSetWMHints を用いてこれらを ウィンドウマネージャに渡すべきである。 size_list_return に対して割り当てられたデータを解放するには、 XFreeを使用すること。

XGetIconSizesはエラー BadWindowを起こすことがある。

関数 XmbSetWMPropertiesはウィンドウマネージャのプロパティの標準の集合を格納する。 この際には、テキストプロパティは国際化テキスト通信が可能な標準 エンコーディングとなる。 あるウィンドウについて、標準のウィンドウマネージャプロパティは WM_NAME, WM_ICON_NAME, WM_HINTS, WM_NORMAL_HINTS, WM_CLASS, WM_COMMAND, WM_CLIENT_MACHINE, WM_LOCALE_NAME である。

void XmbSetWMProperties(display, w, window_name, icon_name, argv, argc,
normal_hints, wm_hints, class_hints)
Display *display;
Window w;
char *window_name;
char *icon_name;
char *argv[];
int argc;
XSizeHints *normal_hints;
XWMHints *wm_hints;
XClassHint *class_hints;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
window_name
ウィンドウ名を指定する。 これは NULL で終わる文字列でなければならない。
icon_name
アイコン名を指定する。 これは NULL で終わる文字列でなければならない。
argv
アプリケーションの引き数リストを指定する。
argc
引き数の数を指定する。
hints
ウィンドウの通常の状態でのサイズヒントを指定する。
wm_hints
使用する XWMHints構造体を指定する。
class_hints
使用する XClassHint構造体を指定する。

簡易関数 XmbSetWMPropertiesは他のクライアント(特にウィンドウマネージャとセッションマネージャ)との 通信に用いられる重要なウィンドウプロパティを設定するための、単一の プログラミングインタフェースを提供する。

もし引き数 window_name が NULL でなければ、 XmbSetWMPropertiesは WM_NAME プロパティを設定する。 もし引き数 icon_name が NULL でなければ、 XmbSetWMPropertiesは WM_ICON_NAME プロパティを設定する。 window_name と icon_name の各引き数は、現在のロケールのエンコーディング であり、かつ NULL で終わる文字列である。 もし引き数が完全に STRING エンコーディングに変換できる場合、プロパティは ``STRING'' 型で生成される。 そうでない場合、引き数はコンパウンドテキスト(compound text)に変換され、 プロパティは ``COMPOUND_TEXT'' 型で生成される。

引き数 normal_hints が NULL でない場合、 XmbSetWMPropertiesXSetWMNormalHintsを呼び出して WM_NORMAL_HINTS プロパティを設定する(14.1.7 節を参照)。 引き数 wm_hints が NULL でない場合、 XmbSetWMPropertiesXSetWMHintsを呼び出して WM_HINTS プロパティを設定する(14.1.6 節参照)。

引き数 argv が NULL でない場合、 XmbSetWMPropertiesは argv と argc の値を使って WM_COMMAND プロパティを設定する。 argc が 0 の場合は、コマンドの長さが 0 であるという意味になる。

マシンのホスト名は XSetWMClientMachine を使って格納される(14.2.2 節を参照)。

引き数 class_hints が NULL でない場合、 XmbSetWMPropertiesは WM_CLASS プロパティを設定する。 XClassHint構造体の res_name メンバに NULL ポインタが設定されていて、かつ環境変数 RESOURCE_NAME が設定されている場合、環境変数の値が res_name に代入され る。 res_name メンバが NULL で、環境変数の値も設定されておらず、argv と argv[0] が設定されている場合には、argv[0]の値からディレクトリの プレフィックスを取り除いたものが res_name に代入される。

与えられる class_hints.res_name, argv, 環境変数 RESOURCE_NAME, マシン のホスト名のエンコーディングは、LC_CTYPE カテゴリに対してアナウンスさ れたロケールのエンコーディングであるものと仮定される(POSIX 準拠のシス テムでは環境変数 LC_CTYPE、そうでなければ 環境変数 LANG)。 対応する WM_CLASS, WM_COMMAND, WM_CLIENT_MACHINE プロパティはローカル ホストのロケールアナウンサに従って型付けされる。 プロパティへの格納の前にはエンコーディングの変換は行われない。

ロケールに従ってプロパティテキストを扱う必要があるクライアントのために、 XmbSetWMPropertiesは WM_LOCALE_NAME プロパティに現在のロケールの名前を設定する。 この名前はエンコーディングがホストポータブル文字エンコーディングであり、 STRING に変換されてプロパティに格納されるものと仮定される。

XmbSetWMPropertiesはエラー BadAlloc ,BadWindowを起こすことがある。

ウィンドウの標準ウィンドウマネージャプロパティにクライアントが指定した エンコーディングの文字列を設定するには、 XSetWMPropertiesを使う。 ウィンドウに対する標準のウィンドウマネージャプロパティは、 WM_NAME, WM_ICON_NAME, WM_HINTS, WM_NORMAL_HINTS, WM_CLASS, WM_COMMAND,WM_CLIENT_MACHINE である。

void XSetWMProperties(display, w, window_name, icon_name, argv, argc, normal_hints, wm_hints, class_hints)
Display *display;
Window w;
XTextProperty *window_name;
XTextProperty *icon_name;
char **argv;
int argc;
XSizeHints *normal_hints;
XWMHints *wm_hints;
XClassHint *class_hints;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
window_name
ウィンドウ名を指定する。 これは NULL で終わる文字列でなければならない。
icon_name
アイコン名を指定する。 これは NULL で終わる文字列でなければならない。
argv
アプリケーションの引き数リストを指定する。
argc
引き数の数を指定する。
normal_hints
ウィンドウの通常の状態でのサイズヒントを指定する。
wm_hints
使用する XWMHints構造体を指定する。
class_hints
使用する XClassHint構造体を指定する。

簡易関数 XSetWMPropertiesは、他のクライアント(特にウィンドウマネージャやセッションマネージャ)との通 信に使われる重要なウィンドウプロパティを設定するための単一のプログラミ ングインタフェースを提供する。

引き数 window_name が NULL でなければ、 XSetWMPropertiesXSetWMNameを呼び出して WM_NAME プロパティを設定する(14.1.4 節を参照)。 引き数 icon_name が NULL でなければ、 XSetWMPropertiesXSetWMIconNameを呼び出して WM_ICON_NAME プロパティを設定する(14.1.5 節を参照)。 引き数 argv が NULL でなければ、 XSetWMPropertiesXSetCommandを呼び出して WM_COMMAND プロパティを設定する(14.2.1節を参照)。 argc を 0 にして長さが 0 のコマンドを指示してもよい点に注意すること。 また、このマシンのホスト名は XSetWMClientMachineを使って保存されている点にも注意すること(14.2.2 節を参照)。

引き数 normal_hints が NULL でなければ、 XSetWMPropertiesは .ZN XSetWMNormalHints を呼び出し、この関数が WM_NORMAL_HINTS を設定する(14.1.7 節を参照)。 引き数 wm_hints が NULL でなければ、 XSetWMPropertiesXSetWMHintsを呼び出して WM_HINTS プロパティを設定する(14.1.6 節を参照)。

引き数 class_hints が NULL でなければ、 XSetWMPropertiesXSetClassHintを呼び出して WM_CLASS プロパティを設定する(14.1.8 節を参照)。 構造体の res_name メンバに NULL ポインタが設定されており、かつ RESOURCE_NAME 環境変数が設定されていれば、環境変数の値が res_name に 代入される。 もし res_name メンバが NULL であり、環境変数が設定されておらず、argv と argv[0] が設定されている場合には argv[0] の値からディレクトリのプレフィックスを取り除いたものが res_name に代入される。

XSetWMPropertiesはエラー BadAlloc ,BadWindowを起こすことがある。

クライアントからセッションマネージャへの通信

この節では以下のことを行う方法を説明する:

WM_COMMAND プロパティの設定と取得

Xlib には、指定されたウィンドウに対して WM_COMMAND プロパティの設定と 取得を行うための関数が用意されている。

ウィンドウの WM_COMMAND プロパティを設定するには XSetCommandを使う。

XSetCommand(display, w, argv, argc)
Display *display;
Window w;
char **argv;
int argc;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
argv
アプリケーションの引き数リストを指定する。
argc
引き数の数を指定する。

関数 XSetCommandはアプリケーションの起動に使われたコマンドと引き数を設定する。 (通常は、argv はアプリケーションのメインプログラムの argv 配列である。) 文字列のエンコーディングがホストポータブル文字エンコーディングでない場 合、実行結果は実装依存である。

XSetCommandはエラー BadAlloc ,BadWindow を起こすことがある。

ウィンドウの WM_COMMAND プロパティを取得するには XGetCommand を使う。

Status XGetCommand(display, w, argv_return, argc_return)
Display *display;
Window w;
char ***argv_return;
int *argc_return;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
argv_return
アプリケーションの引き数リストが返される。
argc_return
返される引き数の数が返される。

関数 XGetCommandは指定したウィンドウの WM_COMMAND プロパティを取得し、文字列のリストを 返す。 WM_COMMAND プロパティが存在するならば、これは STRING 型、フォーマット 8 である。 文字列のリストを格納するのに十分なメモリが割り当てられれば、 XGetCommandは引き数 argv_return と argc_return を設定し、0 でないステータスを返す。 そうでなければステータスとして 0 を返す。 サーバが返すデータのエンコーディングが Latin ポータブル文字エンコーディ ングならば、関数が返す文字列のエンコーディングはホストポータブル文字エ ンコーディングである。 そうでない場合の結果は実装依存である。 文字列リストに対して割り当てたメモリを解放するには XFreeStringListを使用すること。

WM_CLIENT_MACHINE プロパティの設定と取得

Xlib には、指定された関数に対して WM_CLIENT_MACHINE プロパティの設定と 取得を行うための関数が用意されている。

ウィンドウの WM_CLIENT_MACHINE プロパティを設定するには XSetWMClientMachineを使う。

void XSetWMClientMachine(display, w, text_prop)
Display *display;
Window w;
XTextProperty *text_prop;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
text_prop
使用する XTextProperty構造体を指定する。

簡易関数 XSetWMClientMachineは、 XSetTextPropertyを呼び出して WM_CLIENT_MACHINE プロパティを設定する。

ウィンドウの WM_CLIENT_MACHINE プロパティを取得するには XGetWMClientMachineを使う。

Status XGetWMClientMachine(display, w, text_prop_return)
Display *display;
Window w;
XTextProperty *text_prop_return;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
text_prop_return
XTextProperty構造体が返される。

簡易関数 XGetWMClientMachineは、WM_CLIENT_MACHINE プロパティに対して XGetTextPropertyを実行する。 この関数は成功時に 0 でないステーテスを返し、そうでない場合には ステータスとして 0 を返す。

標準カラーマップ

カラーパレット、スムースシェーディングされた描画、デジタイズされた画像 を扱うアプリケーションは大量の色を必要とする。 さらに、このようなアプリケーションは、適切な色で表示を行うために RGB 値からピクセル値への効率的なマッピングを必要とすることも多い。

例えば、滑らかにシェーディングされた球を描画する 3 次元表示プログラム を考えることにする。 球の画像の各ピクセルにおいて、プログラムはビューアに反映される光の強度 と色を計算する。 この計算の結果は、0.0 から 1.0 の範囲を持つ赤、緑、青(RGB)の係数である。 球を描画するために、プログラムは広い範囲の一様に分布した色を与える カラーマップを必要とする。 カラーマップは、プログラムが RGB 値を非常に高速にピクセル値に変換でき るようなものでなければならない。なぜなら、球全体を描画するにはこのよう な変換を大量に行う必要があるからである。

現在のワークステーションの多くでは、ディスプレイは 256 色以下しか表示 できない。 このような場合には、アプリケーションは色を注意深く割り当てる必要がある。 これは必要な範囲全体を確実にカバーするためだけでなく、できるだけ多くの 色を使えるようにするためである。 X の普通の画面では多くのアプリケーションが同時に動作する。 多くのワークステーションはハードウェア的な色参照テーブルを一つしか持っ ていないので、同時には一つのアプリケーションにしかカラーマップを インストールできない。 この時、インストールされたカラーマップを使っているアプリケーションは正 しく表示され、他のアプリケーションは間違った変な色で表示される。

別の例として、地形データを表示するための画像処理プログラムの動作を考え る。 画像処理プログラムでは、赤に 8 ビット、緑に 8 ビット、青に 4 ビットの 合計 256 色が設定されたカラーマップを必要とする。 一部の色は既にデフォルトのカラーマップで使われているので、 画像処理プログラムは新しいカラーマップを割り当ててインストールする。

ユーザはカラーパレットプログラムを呼び出して色の選択や混合を行うことに より、画像内のいくつかの色を変えることができる。 カラーパレットプログラムも画像処理プログラムと全く同じように赤 8 ビット、 緑 8 ビット、青 4 ビットを持ったカラーマップを必要とするので、新しい カラーマップの割り当てとインストールを行う必要がある。

同時にインストールできるカラーマップは一つだけなので、 画像処理プログラムがアクティブになると必ずカラーパレットの表示色はおか しくなる。 その逆に、カラーパレットプログラムがアクティブになると必ず 画像処理プログラムの表示色はおかしくなる。 したがって、ユーザはパレットと画像の色合わせや比較を行うことは不可能で ある。 同じような色を必要とするアプリケーションがカラーマップを共有すれば、 カラーマップリソースの取り合いを減らすことができる。

カラーマップの設定方法に関する規約があれば、画像処理プログラムと カラーパレットプログラムで同じカラーマップを共有できたかもしれない。 そうであれば、どちらのプログラムがアクティブであっても両方のプログラム は共に正しく表示される。

標準カラーマッププロパティは、一般的に使われるカラーマップの集合を定義 する。 これらのカラーマップと規約を共有するアプリケーションは、正しい色を表示 できる機会も増え、ユーザにより良いインタフェースを提供できる。

標準カラーマップを使うと、一般的に使われる色資源をアプリケーション間で 共有できる。 これにより、個別のアプリケーションが色を全て定義したカラーマップを必要 としていても、多くのアプリケーションを同時に正しい色で表示できる。

いくつかの標準カラーマップをこの節で説明する。 普通はこのようなカラーマップはウィンドウマネージャが作る。 アプリケーションは標準のカラーマップが既に存在していれば、これを使うべ きである。

XStandardColormap構造体を割り当てるには XAllocStandardColormapを使う。

XStandardColormap *XAllocStandardColormap( )

関数 XAllocStandardColormapXStandardColormap構造体を割り当て、この構造体を指すポインタを返す。 XStandardColormap構造体の全てのフィールドは 0 で初期化される点に注意すること。 十分なメモリが利用できない場合、 XAllocStandardColormapは NULL を返す。 この構造体に割り当てられたメモリを解放するには XFreeを使用すること。

XStandardColormap 構造体の内容を以下に示す。

/* ヒント */

#define ReleaseByFreeingColormap ( (XID) 1L)
/* 値 */
typedef struct {
	Colormap colormap;
	unsigned long red_max;
	unsigned long red_mult;
	unsigned long green_max;
	unsigned long green_mult;
	unsigned long blue_max;
	unsigned long blue_mult;
	unsigned long base_pixel;
	VisualID visualid;
	XID killid;
} XStandardColormap;

colormap メンバは、関数 XCreateColormapで作られるカラーマップである。 red_max, green_max, blue_max メンバは RGB の各値の最大値を与える。 それぞれの色係数の範囲は 0 以上、最大値以下である。 例えば、標準的なカラーマップの配置は 3/3/2である(赤に3プレーン、緑に3 プレーン、青に2プレーン)。 このカラーマップは red_max = 7, green_max = 7, blue_max = 3 となる。 216 色しか使わない別の配置としては、red_max = 5, green_max = 5, blue_max = 5 などが考えられる。

red_mult, green_mult, blue_mult メンバは完全なピクセル値を作るための倍 率を与える。 (詳しい情報については base_pixels メンバの説明を参照すること。) 3/3/2 の配置の場合には red_mult は 32, green_mult は 4, blue_mult は 1 となる。 6/6/6 の配置の場合には、red_mult は 36, green_mult は 6, blue_mult は 1 となる。

base_pixel メンバは、完全なピクセル値を作るために使われるベースピクセ ル値を与える。 通常、この base_pixel は関数 XAllocColorPlanesを呼び出して得る。 正しい範囲の RGB の各係数を与えると、対応するピクセル値は次の式で計算 できる。

(r * red_mult + g * green_mult + b * blue_mult + base_pixel) & 0xFFFFFFFF

GrayScaleカラーマップについては、colormap, red_max, red_mult, base_pixel メンバ だけが定義される。 他のメンバは無視される。 GrayScaleのピクセル値の計算には次の式を使用する。

(gray * red_mult + base_pixel) & 0xFFFFFFFF

負の乗数を表すには、その乗数の 2 の補数表現を unsigned long に変換し、 その結果を適切な _mult フィールドに保存すれば良い。 0xFFFFFFFF のマスクを掛ける段階で、得られた正の乗数を負の乗数に効 率的に変換することができる。 多くの計算機アーキテクチャでは、マスキングの処理は計算に使用される 整数のサイズに依存して自動的に行われる。

visualid メンバは、カラーマップを生成したビジュアルの ID 番号を与える。 killid メンバは、リソースIDを与える。 このリソースIDは、この標準カラーマップが保持しているセルをカラーマップ ID の解放によって解放するのか、指定されたリソースについての XKillClientの呼び出しによって行うのかを示す。 (この方法は、現在は存在しないカラーマップを割り当てる場合に必要である。)

XStandardColormapの情報を含むプロパティの型は RGB_COLOR_MAP である。

この節の残りでは、標準カラーマップ関連のプロパティとアトム、それから 標準カラーマップの操作方法を説明する。

標準カラーマップ関連のプロパティとアトム

標準カラーマップは複数個利用できる。 それぞれの標準カラーマップはプロパティによって定義され、 このようなプロパティはアトムによって識別される。 以下のリストはアトムを示し、それぞれのアトムに対応するカラーマップを 説明する。 ヘッダファイル <X11/Xatom.h>には以下の各アトムの定義が書かれている。アトムには XA_ という プレフィックスが付く。

RGB_DEFAULT_MAP
このアトムはプロパティを示す。 このプロパティの値は XStandardColormap構造体の配列である。 配列中の各エントリは、visual_id で指定されるビジュアルに対する デフォルトカラーマップの RGB 値のサブセットを表す。 .IP アプリケーションによっては一部の RGB 色しか必要とせず、これらの色を システムのデフォルトのカラーマップから割り当てることができる場合がある。 これは理想的な状況である。なぜなら、システム上でアクティブになっている カラーマップが少なければ少ないほど、同時に正しい色で表示できる アプリケーションは増えるからである。 .IP 8 ビットプレーンのディスプレイでは、RGB_DEFAULT_MAP に対しては 赤に 6 ビット、緑に 6 ビット、青に 6 ビットが割り当てられるのが普通で ある。 この場合には、一様に分散した 216 色(6 段階の強度と 36 の異なる色相)を 表現した上でも、カラーマップにはまだ 256 要素のうち 40 要素が残ってい る。この残った分はテキスト、境界などの特殊な目的の色に利用できる。
RGB_BEST_MAP

このアトムはプロパティを示す。 このプロパティの値は XStandardColormapである。 .IP このプロパティは現在のディスプレイ上で利用できる最善の RGB カラーマップを定義する。 (もちろん、最善の判断は主観的なものである。) 多くの画像処理プログラムや 3 次元アプリケーションは利用できる全ての カラーマップセルを使う必要があり、知覚的に区別できるできるだけ多くの色 をこのセル上に分布させる必要がある。 これは緑の値は赤よりも多くなるかもしれず、緑と赤の値は青よりも多くなる かもしれないということである。 .IP 8 ビットプレーンの PseudoColor ビジュアルでは RGB_BEST_MAP は 3/3/2 の割り当てになることが多い。 24 ビットプレーンの DirectColor ビジュアルでは RGB_BEST_MAP は普通は 8/8/8 の割り当てになることが多い。
RGB_RED_MAP

RGB_GREEN_MAP

RGB_BLUE_MAP
これらのアトムはプロパティを示す。 これらのプロパティの値は XStandardColormap である。 .IP これらのプロパティはそれぞれ、全てが赤、全てが緑、全てが青の カラーマップを定義する。 このようなカラーマップを使うのは、色分解した画像を作るアプリケーション である。 例えばユーザが 8 ビットプレーンのディスプレイでフルカラーの画像を生成 するには、レンダリングを 3 回(高い色解像度で赤、緑、青を 1 回ずつ )行い、かつ 1 つのカメラのフレームに複数回露出させる方法がある。
RGB_GRAY_MAP
このアトムはプロパティを指す。 このプロパティの値は XStandardColormapである。 .IP このプロパティはスクリーン上で利用できる最善の GrayScale カラーマップを記述する。 前に説明したように、 GrayScale カラーマップでは XStandardColormap 構造体のメンバの中で使われるものは colormap, red_max, red_mult, base_pixel だけである。

標準カラーマップの設定と取得

Xlib には XStandardColormap構造体の設定と取得を行うための関数が用意されている。

XStandardColormap構造体を設定するには XSetRGBColormaps を使う。

void XSetRGBColormaps(display, w, std_colormap, count, property)
Display *display;
Window w;
XStandardColormap *std_colormap;
int count;
Atom property;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
std_colormap
使用する XStandardColormap構造体を指定する。
count
カラーマップの数を指定する。
property
プロパティ名を指定する。

関数 XSetRGBColormaps は指定したウィンドウの指定したプロパティの RGB カラーマップの定義を置 き換える。 そのプロパティがまだ存在しない場合、 XSetRGBColormapsは指定したウィンドウの指定したプロパティの RGB カラーマップの定義を 設定する。 プロパティは RGB_COLOR_MAP 型、フォーマット 32 で格納される。 RGB_DEFAULT_MAP のみが複数の定義を持つという ICCCM の規定は、関数を呼 び出す側で守る義務があることに注意せよ。

関数 XSetRGBColormapsを使うのは、通常はウィンドウかセッションマネージャだけである。 標準カラーマップは以下の手続きで作成する。

1.
現在のサーバへの新しい接続をオープンする。
2.
サーバをグラブする。
3.
スクリーンのルートウィンドウのプロパティリストにこのプロパティがあるか どうか確認する。
4.
必要なプロパティがなければ次の処理を行う。 .RS

XSetRGBColormapsはエラー BadAlloc ,BadAtom ,BadWindowを起こすことがある。

指定されたプロパティに対応する XStandardColormap 構造体を取得するには XGetRGBColormapsを使う。

Status XGetRGBColormaps(display, w, std_colormap_return, count_return, property)
Display *display;
Window w;
XStandardColormap **std_colormap_return;
int *count_return;
Atom property;
display
X サーバへの接続を指定する。
w
ウィンドウを指定する。
std_colormap_return
XStandardColormap構造体が返される。
count_return
カラーマップの数を返す。
property
プロパティ名を指定する。

XGetRGBColormapsは、指定したウィンドウの指定したプロパティ内の RGB カラーマップ定義を 返す。 プロパティが存在し、その型が RGB_COLOR_MAP、フォーマットが 32 であり、かつカラーマップ定義を含むのに十分な長さを持っていれば、 XGetRGBColormapsは返すカラーマップを割り当ててそのメモリ領域を埋め、0 でない ステータスを返す。 ビジュアル ID がない場合、 XGetRGBColormaps はウィンドウが配置されるスクリーンのデフォルトのビジュアルを仮定する。 kill ID が存在しない場合には None が仮定される。 これは、このリソースは解放できないことを示す。 これ以外の場合には、いずれのフィールドも設定されず、 XGetRGBColormapsはステータスとして 0 を返す。 RGB_DEFAULT_MAP だけが1つ以上の定義を含む ICCCM の制限を引き受けるのは 関数を呼び出す側の責任であることに注意せよ。

XGetRGBColormapsはエラー BadAtomBadWindowを起こすことがある。


目次に戻る