Chapter 3 Window Functions

3章 ウィンドウ関数

X Window Systemにおいて、 ウィンドウはスクリーン上の四角の領域であり、グラフィックな出力 を表示する。 クライアントアプリケーションは一つあるいはそれ以上のスクリーン上に オーバーラップして、あるいは重なっているウィンドウを表示する。 このスクリーンは一つまたはそれ以上のマシン上のXサーバにより駆動される。 ウィンドウを作ろうとしているクライアントはまず このプログラムとXサーバとを接続するために XOpenDisplay を呼ばなければならない。 この章ではビジュアルタイプとウィンドウ属性について 述べることから始める。 この章は使用することができる以下の関数に付いて引き続いて述べる。

この章はイベントを起こすウィンドウ動作の確認もする。

色々なウィンドウマネージャとうまく動作するためには、アプリケーションがウィンドウマネージャと通信 する時に約束事に従う事が重要である事に注意する(14.1 節を参照)。 ツールキットは一般的にあなたに対するこれらの約束事に忠実であり、 負担を取り除く。 ツールキットはまた、この章にある関数の多くを独自のバージョンの関数で 置き換えていることも多い。 より詳しい情報については使っているツールキットのドキュメントを 参照する事。

Visual Types

ディスプレイのハードウェアの中には、一つ以上の方法で色のリソースを扱う物もある。 例えば、12bitの深さのスクリーンを色(pseudo-color)にマップされたピクセルで扱ったり、 24bitに深さのスクリーンを赤、緑、青のそれぞれに割り当てられた8bitのピクセルで 扱う事ができる。 スクリーンの視覚の状態を扱うこれらの異なる方法をビジュアルと呼ぶ。 ディスプレイのそれぞれのスクリーンに対して、スクリーンの異なる深さでサポート される有効なビジュアルタイプのリストがある。 デフォルトのウィンドウとビジュアルタイプがそれぞのスクリーンに対して定義されているので、 最も単純なアプリケーションはこのような複雑なものは必要ない。 Xlibはデフォルトのルートウィンドウ、デフォルトのルートウィンドウのデフォルトの深さ、 およびデフォルトのビジュアルタイプを返すマクロおよび関数を与える。 (2.2.1と16.7節を参照)

Xlibはマッピングできる色についての情報を含む不可視な Visual 構造体を使う。 ビジュアルのユーティリティー関数(16.7節を参照)は アプリケーションにこれらの情報を返すために XVisualInfo構造体を使う。 この議論に適切な構造体のメンバーはclass,red_mask,green_mask,blue_mask,bit_per_rgb, colormap_sizeである。 classはスクリーンで可能なビジュアルクラスの一つを指定する。 そして、それは StaticGray ,StaticColor ,TrueColor ,GrayScale ,PseudoColor ,あるいは DirectColor のいずれかである。

以下の概念はビジュアルタイプを明確に説明するものである。 スクリーンはカラーもしくはグレイスケールであり、 書き込み可能もしくは、読みだし専用のカラーマップを持ち、 与えられたスクリーンがグレイスケールでないなら、インデックスが 別々のRGBに分割されたカラーマップを持つ。 これは次のようなダイアグラムで示される。

Color Gray-scale
R/O R/W R/O R/W
Undecomposed Static Pseudo Static Gray
Colormap Color Color Gray Scale
Decomposed True Direct
Colormap Color Color

概念的に、それぞれのピクセルはスクリーン上のビデオメモリーに読み出される時、 カラーマップに関連づけられることにより調べあげられる。 カラーマップはハードウェア、あるいはハードウェアに限定された方法、ハードウェアに よらない方法で扱われる。 ビジュアルタイプはカラーマップやRGB値に以下の のように影響を与える。

red_mask,green_mask,blue_maskは DirectColorTrueColorに対してのみ定義される。 それぞれはまったく交わらない一つの隣接のビットセットを 持つ。 bits_per_rgbは赤、緑、青の明確な色の値(個々に)の基底値2のlogの数を指定する。 実際のRGB値はunsignedの16bitメンバーである。 colormap_sizeメンバーは新しく作られたカラーマップでの利用可能なカラーマップ エントリを定義する。 DirectColorTrueColor の時、これは独立したピクセルのサブフィールドのサイズである。

Visual ,からビジュアルIDを得るには、 XVisualIDFromVisual を使う。

VisualID XVisualIDFromVisual(visual)
Visual *visual;
visual
ビジュアルタイプを指定する。

関数 XVisualIDFromVisualは指定したビジュアルタイプのビジュアルIDを返す。

Window Attributes

全ての InputOutputウィンドウはゼロもしくはそれ以上のピクセルを持つ境界線、背景、 イベントを抑制するマスク(それは子ウィンドウからのイベントの伝搬を抑える) 、そしてプロパティリスト(4.3節を参照)を持つ。 ウィンドウの境界と背景は無地か、あるいはタイルと呼ばれるパターンにできる。 ルートを除くと全てのウィンドウは親を持ち、親によりクリップされる。 もしウィンドウが他のウィンドウトップ上に重ねられたら、入力のため 他のウィンドウを隠す。 もしウィンドウが背景を持つなら(大抵そうなのだが)、出力のために 他のウィンドウを隠す。 入力イベントがまったくなく、隠された領域に出力することのみ(例えば、 ポインタの移動)を試みは隠された領域に対して生成される。

ウィンドウも関連づけされたプロパティリストを持つ(4.3節を参照)。

InputOutputInputOnlyウィンドウとも以下の共通属性を持つ。 それは InputOnlywindow:

もし InputOnlyウィンドウに対して他の属性を指定するなら、 エラー BadMatchが生じる。

InputOnlyウィンドウは InputOutputウィンドウが必要とされない状況下で入力イベントを制御するために 使われる。 InputOnlyウィンドウは不可視である。カーソルや入力イベントの生成、およびgrabbing のような制御に使われ、全てのグラフィックリクエスト で使われる。 InputOnlyウィンドウは下位として InputOutputウィンドウを持てない事に注意する。

ウィンドウは背景の模様やタイルと同様に境界線の幅や模様を プログラムできる。 ピクセル値は無地に対して使われる。 背景と境界線のピクセルへのより明示的な参照が全く行われないなら、 そのピクセルはウィンドウを作った後間接的に破棄させる。 模様は親に相対的か絶対的かのいずれかである。 ParentRelative なら、 親の背景が使われる。

ウィンドウが最初に作られる時、 ウィンドウはスクリーンには見えない(マップされていない)。 スクリーン上に見えないウィンドウおよび、後ろに隠されている ウィンドウへの全ての出力は捨てられる。 アプリケーションはウィンドウがスクリーンにマップされるより前に ウィンドウを作る事を望むかも知れない。 ウィンドウがスクリーンイベントでマップされる時、( XMapWindow を使う) バッキングストアが保持されないなら、Xサーバは Expose イベントをウィンドウに対して送る。

ウィンドウマネージャは、トップレベルウィンドウに対してのサイズ、境界幅、 位置に関するユーザの指定を上書きできる。 プログラムはトップウィンドウの実際のサイズと位置を使うように 作られていなければならない。 人間が行ったサイズ指定コマンドへの直接の応答でない限り、 クライアントアプリケーションが自分自身のサイズを変えることは望ましくない。 その代わり、プログラムは指定されたスペースを使うか、あるいは スペースが小さすぎてきちんと動作できないなら、プログラムはウィンドウを リサイズするかどうかをユーザに尋ねるべきである。 トップレベルウィンドウの境界線はウィンドウマネージャに公平な 勝負であると考えられる。

ウィンドウの属性をセットするために、 XSetWindowAttributes構造体の適切な要素をセットする、そして XCreateWindowXChangeWindowAttributes への呼び出しにおいて、それに相当する値のビットマスクと論理和を取る。 または、適切な属性をセットする他の便利な関数の一つを使う。 ビットマスク値に対するシンボルと XSetWindowAttributes構造体は次のようになる。

/* Window attribute value mask bits */

#define CWBackPixmap (1L<<0)
#define CWBackPixel (1L<<1)
#define CWBorderPixmap (1L<<2)
#define CWBorderPixel (1L<<3)
#define CWBitGravity (1L<<4)
#define CWWinGravity (1L<<5)
#define CWBackingStore (1L<<6)
#define CWBackingPlanes (1L<<7)
#define CWBackingPixel (1L<<8)
#define CWOverrideRedirect (1L<<9)
#define CWSaveUnder (1L<<10)
#define CWEventMask (1L<<11)
#define CWDontPropagate (1L<<12)
#define CWColormap (1L<<13)
#define CWCursor (1L<<14)
/* Values */
typedef struct {
	Pixmap background_pixmap;	/* background, None, or ParentRelative */
	unsigned long background_pixel;	/* background pixel */
	Pixmap border_pixmap;		/* border of the window or CopyFromParent */
	unsigned long border_pixel;	/* border pixel value */
	int bit_gravity;	/* one of bit gravity values */
	int win_gravity;	/* one of the window gravity values */
	int backing_store;	/* NotUseful, WhenMapped, Always */
	unsigned long backing_planes;	/* planes to be preserved if possible */
	unsigned long backing_pixel;	/* value to use in restoring planes */
	Bool save_under;	/* should bits under be saved? (popups) */
	long event_mask;	/* set of events that should be saved */
	long do_not_propagate_mask;	/* set of events that should not propagate */
	Bool override_redirect;	/* boolean value for override_redirect */
	Colormap colormap;	/* color map to be associated with window */
	Cursor cursor;		/* cursor to be displayed (or None) */
} XSetWindowAttributes;

以下のリストはそれぞのウィンドウ属性に対するデフォルトのものである。そして 属性が InputOutputあるいは InputOnlyウィンドウのどちらに適用できるか示すものである。

Attribute Default InputOutput InputOnly
background-pixmap None Yes No
background-pixel Undefined Yes No
border-pixmap CopyFromParent Yes No
border-pixel Undefined Yes No
bit-gravity ForgetGravity Yes No
win-gravity NorthWestGravity Yes Yes
backing-store NotUseful Yes No
backing-planes All ones Yes No
backing-pixel zero Yes No
save-under False Yes No
event-mask empty set Yes Yes
do-not-propagate-mask empty set Yes Yes
override-redirect False Yes Yes
colormap CopyFromParent Yes No
cursor None Yes Yes

Background Attribute

InputOutputウィンドウのみが背景を持てる。 ピクセルまたはピクスマップを使うことにより InputOutputウィンドウの背景をセットすることができる。

ウィンドウのbackground-pixmap属性はウィンドウの背景に使われるピクスマップを 指定する。 このピクスマップはどんなサイズでも良いが、他のより速いサイズがある。 ウィンドウのbackground-pixel属性は単色でウィンドウの背景を塗りつぶすのに使う ピクセル値を指定する。

background-pixmapはピクスマップ、 None (デフォルト)、あるいは ParentRelative にセットできる。 ウィンドウのbackground-pixelはどんなピクセル値(デフォルトはない)にセットできる。 もしbackground-pixelを指定すれば、 標準のbackground-pixmapあるいはbackground-pixmapに指定した 全ての値を上書きする。 background-pixelで満たされた定義されていないサイズのピクスマップは 背景に使われる。 チェックしている範囲は背景ピクセルで行われていない。 単に適切なビット数に切り詰められる。

background-pixmapをセットすれば、 デフォルトは上書きされる。 background-pixmapとウィンドウは同じ深さを持たなければならず、 そうでなければ BadMatchエラーを引き起こす。 background-pixmapに None をセットすれば、 ウィンドウは定義されている背景を持たない。 background-pixmapに ParentRelative を定義すれば

background-pixmapあるいはbackground-pixelをセットすることにより、 新しい背景をセットすることで前の全ての背景が上書きされる。 もしさらに明示的な参照がピクスマップに行われていないなら(Xサーバが必要とされる時 コピーを保持する)、background-pixmapが間接的に解放される。 後で背景に使われているピクスマップに書き込んだ場合、 何が起こるかは定義されていない。なぜなら Xの実装はピクスマップのコピーを行うか同じピクスマップを 使うかのいずれかは自由である。

有効なコンテキストがウィンドウの領域で利用不可能であり、領域が 可視あるいはサーバがバッキングストアーを保持しているなら、 サーバは自動的にウィンドウの背景を持つ領域を塗りつぶす。 ウィンドウが None の背景を持つ場合はその限りではない。 背景が None なら、 ウィンドウと同じ深さを持つ他のウィンドウから前のスクリーンの内容が 単に親ウィンドウもしくは祖先のウィンドウから来る限りその場所に 残される。 そうでない場合は描画領域の初期の内容は定義されていない。 Expose イベントはその時、その領域に生成される。たとえ背景ピクスマップが None である場合もそうである。 (10.9節を参照)

Border Attribute

InputOutputウィンドウのみが境界線を持てる。 ピクセルまたはピクスマップを使うことにより、 InputOutputウィンドウの境界線をセットすることができる。

ウィンドウのborder-pixmap属性はウィンドウの境界線に使われる ピクスマップを指定する。 ウィンドウのborder-pixel属性はウィンドウの境界線に使われるピクセルで塗りつぶされた 定義されていないサイズのピクスマップを指定する。 範囲をチェックすることは背景ピクセルでは行われない。 単に適切なビット数に切り詰められる。 境界線のタイルの原点は常に背景のタイルの原点と同じである。

border-pixmapはどんなサイズのピクスマップ(他のものより速いものもある) あるいは CopyFromParent (デフォルト)にセットできる。 border-pixelとどんなピクセル値(デフォルトなし)にセットできる。

border-pixmapがセットされれば、 デフォルトは上書きされる。 border-pixmapとウィンドウは同じ深さを持たなければならない。 そうでない場合、エラー BadMatchを引き起こす。 border-pixmapを CopyFromParent にセットすれば、 親のウィンドウのborder-pixmapがコピーされる。 親ウィンドウの境界線属性の連続的な変化は子ウィンドウには 影響しない。 しかし、子ウィンドウは親ウィンドウと同じ深さを持たなければならず、 そうでない場合、エラー BadMatchを引き起こす。

さらに明示的な参照がピクスマップに行われていなければ、border-pixmapは 間接的に解放される。 後で境界線に使われているピクスマップに書き込んだ場合、 何が起こるかは定義されていない。なぜなら Xの実装はピクスマップのコピーを行うか、同じピクスマップを使うかは 自由である。 border-pixelを指定すれば、 デフォルトのborder-pixmapあるいはborder-pixmapにセットされている 全ての値のどちらかが上書きされる。 ウィンドウの境界線での全てのピクセルはborder-pixelにセットされる。 border-pixelをセットするか、border-pixmapをセットして、新しい 境界線をセットすれば、前の境界線は上書きされる。

ウィンドウへの出力はウィンドウの内側に常にクリップされる。 それゆえ、グラフィックの操作はウィンドウの境界線に決して影響を与えない。 Gravity属性

Gravity Attributes

InputOutputウィンドウがリサイズされる時、 ウィンドウのビットgravityはウィンドウの領域が保持されているかどうかを定義する、 bit-gravity属性のデフォルトの値は ForgetGravity である。 親ウィンドウがリサイズされた場合、 ウィンドウのウィンドウgravityはどのように InputOutputあるいは InputOnlyウィンドウが再配置されるかを定義する。 win-gravity属性に対するデフォルト値は NorthWestGravity である。

ウィンドウ内の幅あるいは高さが変更されない場合、 あるいはウィンドウが移動される、あるいはその境界線が変更されない場合、 ウィンドウのコンテキストはウィンドウと移動するが失われない。 ウィンドウ内の幅あるいは高さを変更するはそのコンテキストを移動させ、失わせる( ウィンドウのbit-gravityに依存する)そして、子ウィンドウを再設定させる(それらの win-gravityに依存する)。 幅と高さの変化に対して、(x,y)の組が定義されている。

Gravity Direction Coordinates
NorthWestGravity (0, 0)
NorthGravity (Width/2, 0)
NorthEastGravity (Width, 0)
WestGravity (0, Height/2)
CenterGravity (Width/2, Height/2)
EastGravity (Width, Height/2)
SouthWestGravity (0, Height)
SouthGravity (Width/2, Height)
SouthEastGravity (Width, Height)

これらのbit-gravity値の一つを持つウィンドウがリサイズされた時、 これに相当する組がウィンドウでのそれぞのピクセル位置の変更を定義する。 これらのwin-gravityの一つを持つウィンドウがリサイズされた親ウィンドウを持つ時、 これに相当する組は親ウィンドウ内のウィンドウの位置の変更を定義する。 ウィンドウがが再配置される時、 GravityNotifyイベントが生成される(10.10.5節を参照)。

bit-gravityが StaticGravity であることはコンテキストあるいは原点がルートウィンドウの原点に相対的に 動かないことを示す。 もしウィンドウのサイズにおける変更が位置(x,y)への変化に結びつけれるなら、 その時、bit-gravityに対して、それぞれのピクセルの位置での変化が(-x,-y)であり、 win-gravityに対して、その親ウィンドウがリサイズされた時の子ウィンドウの位置での変化は (-x,-y)である。 ウィンドウの幅または高さが変更され、ウィンドウが移動しない時 StaticGravityはまだ効果がないことに注意する。

bit-gravityが ForgetGravity であることはたとえバッキングストアあるいはセーブアンダが要求された場合も。 サイズの変更後、ウィンドウのコンテキストが常に捨てられることを示す。 ウィンドウが背景で塗りつぶされ、 ゼロもしくはそれ以上の Expose イベントが生成される。 どんな背景も定義されていないなら、存在しているスクリーンのコンテキストは 変更されない。 Xサーバの中には常に指定されたbit-gravityを無視し、常に Exposeイベントを生成するものもある。

下位のコンテキストや境界線はその親のbit-gravityに影響されない。 サーバは指定されたbit-garvityを無視することを認められていて、代わりに Forgetを使う。

UnmapGravity のwin-gravityは NorthWestGravityと似ている。(ウィンドウが移動されない) ただし、親がリサイズされた時、子ウィンドウが アンマップされるない。 そして UnmapNotify イベントが生成される。

Backing Store Attribute

Xサーバの実装の中には InputOutputウィンドウのコンテキストを保持することを選ぶものもある。 Xサーバがウィンドウの内容を保持するなら、 ピクセルを保存しているオフスクリーン はバッキングストア(backing store)として知られている。 バッキングストアはXウィンドウにウィンドウの内容の処理の仕方を 伝える。 backing-store属性は NotUseful (デフォルト), WhenMapped ,Always にセットできる。

backing-store属性が NotUseful である時、 保持している内容が必要無いことXサーバに伝える。 しかし、Xの実装の中には内容を保持すること選ぶものもあり、それゆえ Exposeイベントを生成しないこともある。 backing-store属性が WhenMapped である時、 ウィンドウがマップされた時に保持している隠された領域の内容は有益で あることをがXサーバに通知する。 この場合、 ウィンドウが作られた時、サーバは Expose イベントを生成するかも知れない。 backing-store属性が Always である時、 ウィンドウがアンマップされた時でさえ、保持している内容が 有益であることをXサーバに伝える。 たとえウィンドウが親ウィンドウより大きいとしても、 これは完全な内容を保持することをXサーバに要求することであり、 親の境界内の領域のことではない。 Xサーバウィンドウの内容を保持している間、 Expose イベントは通常生成されない。 しかしXサーバはどんな時も内容を保持することをやめない。

ウィンドウの隠された領域の内容が保持されている間、 of graphics requests (and source, when the window is the source). 下位でないウィンドウにより隠された領域がグラフィックリクエストの宛先 (つまり、ソース、あるいはウィンドウがソースである時)に含まれている。 しかし、下位のウィンドウに隠された領域は含まれない。

Save Under Flag

サーバの実装の中には他の InputOutputウィンドウの下で InputOutputウィンドウの内容を保持するものがある。 これはウィンドウの内容を保存することと同じではない。 もし一時的なウィンドウ(例えば、ポップアップメニュー)が システムによりそれらのウィンドウ下のスクリーンの内容が保持されることを 要求するならもっと良い視覚効果が得られる。、 so the temporarily obscured applications do not have to repaint. だから、一時的に隠されたアプリケーションは再描画することを要求を してはならない。

save-underフラグは Trueもしくは False (デフォルト)に設定できる。 save-underが True , なら Xサーバはこのウィンドウがマップされる時、隠されたウィンドウの内容を保存することが 有益であることXサーバに伝える。

Backing Planes and Backing Pixel Attributes

InputOutputウィンドウのビットプレーンがセーブアンダの間、バッキングストアに保持されている 動的データを保持していることを示すバッキングプレーン(backing plnnes)を (1にセットされたビットを持つ)セットすることができる。 backing-planes属性に対するデフォルト値は全て1にセットされたビットである。 プレーンに使うビットがバッキングプレーンにカバーされていないこと指定する バッキングピクセルをセットする。 backing-pixel属性に対するデフォルト値は全て0にセットされたビットである。 Xサーバはバッキングストアあるいは、セーブアンダに指定されたビットプレーン しかセーブしないかは自由であり、指定されたピクセル値を持つ保持されている プレーンを再生成するのも自由である。 これらの値に無関係な全てのビット(それは指定されたウィンドウの深さ を越えたビットのこと)は単に無視される。 バッキングストアあるいはセーブアンダを要求するなら、 あなたのウィンドウを保管するのに要求されたオフスクリーンメモリの量を 最小化するためにこれらのメンバーを使うべきである。

Event Mask and Do Not Propagate Mask Attributes

イベントマスクはクライアントが InputOutputあるいは InputOnlyウィンドウ(もしくは、イベントタイプの中には下位のウィンドウも) に対して引き起こすイベントを決定する。 イベントマスクは有効なイベントマスクのゼロもしくはそれ以上のビットとの論理和である。 マスクできるイベントは NoEventMask (デフォルト)にセットする事により全く報告しないように指定できる

do-not-propagate-mask属性は イベントがクライアントがこの InputOutputあるいは InputOnlyウィンドウに選択されたイベントタイプを持たない時、上位のウィンドウに 伝搬しないように決める。 do-not-propagate-maskは次のマスクのゼロもしくはそれ以上のビットとの論理和である。 KeyPress , KeyRelease ,ButtonPress , ButtonRelease ,PointerMotion ,Button1Motion , Button2Motion , Button3Motion ,Button4Motion , Button5Motion , そして ButtonMotion .全てのイベントは NoEventMask (デフォルト)にセットする事により伝搬されるように指定できる。

Override Redirect Flag

ウィンドウの配置および装飾を付けることを制御するには、 ウィンドウマネージャはしばしば全てのマップもしくは設定リクエストを割り込む、 (リダイレクトする)必要がある。 しかし、ポップアップウィンドウがしばしばウィンドウがその方法を追加する事無しに マップされる必要がある。 InputOutputあるいは InputOnlyウィンドウのどちらかがこれらの構造体の制御機能を無視するように するには、 over-redirectフラグを使う。

override-redirectフラグはこのウィンドウにおけるマップと 設定リクエストが親において SubstructureRedirectMask を上書きするどうかを指定する。 override-redirectフラグは Trueあるいは False (デフォルト)にセットできる。 ウィンドウマネージャはポップアップウィンドウに干渉する事を避けるために この情報を使う。

Colormap Attribute

カラーマップ属性はカラーマップが InputOutputウィンドウのtrue colorに最もよく反映されるように指定する。 カラーマップはウィンドウと同じビジュアルタイプを持たなければならず、 そうでないなら、エラー BadMatch を引き起こす。 複数のハードウェアカラーマップをサポートできるXサーバ はこの情報を使う事ができる、 そして、ウィンドウマネージャは XInstallColormap を呼ぶ事でこの情報を使う事ができる。 colormap属性はカラーマップもしくは CopyFromParent(デフォルト)にセットできる。

colormap属性を CopyFromParent にセットすれば、 親ウィンドウのカラーマップがコピーされ、子ウィンドウにより使われる。 しかし、子ウィンドウが親ウィンドウと同じビジュアルタイプを持たなければならず、 そうでないなら、エラー BadMatch を引き起こす。 親ウィンドウが None のcolormapを持ってはならず、そうでないなら、エラー BadMatch を引き起こす。 colormap属性が子と親ウィンドウの間でカラーマップオブジェクトを共有する事により コピーされるが、カラーマップのコンテキストの完全なコピーではない。 親ウィンドウのcolormap属性の連続的な変化は 子ウィンドウに影響を与えない。

Cursor Attribute

cursor属性はポインタが InputOutputあるいは InputOnlyウィンドウ内にある時、カーソルがどのように使われるかを指定する。 cursorはカーソルまたは None(デフォルト)にセットできる。

corsorを None にセットすれば、 ポインタが InputOutputあるいは InputOnlyウィンドウ内にある時、親のカーソルが使われ、親ウィンドウのカーソルの 変化は全て間接的に 表示されるカーソルの変化を引き起こす。 XFreeCursor を呼ぶ事により、 カーソルはより明示的な参照がカーソルに行われていなければ、 間接的に解放される。

Creating Windows

Xlibはウィンドウを作るための基本的な方法を与え、 ツールキットはしばしばトップレベルウィンドウを作り、置き換えるために 指定された高いレベルの関数を提供する。 そして、その関数は適切なツールキットドキュメントで述べられている。 しかし、ツールキットを使わないなら、 Xlibのクライアント間通信関数を使う事によりウィンドウマネージャに対する 標準的な情報あるいはヒントを与えなければならない。

自分自身の所有するトップレベルウィンドウ(ルートウィンドウの 直接的な子ウィンドウ)を作るためにXlibを使うなら、 全てのウィンドウアプリケーションが異なるスタイルのウィンドウマネージャ 間でお互いに影響しあうように以下のルールを守らなければならない。

より多くの情報に関しては、14章およびクライアント間通信規約マニュアルを 参照する事。

ウィンドウを作る時、 XCreateWindowは特定のウィンドウ属性をセットする事ができるより一般的な関数である。 XCreateSimpleWindow は親ウィンドウから属性を受け継ぐウィンドウを作る。

Xサーバはあたかも InputOnly ウィンドウがグラフィックリクエストやexposureの処理や VisibilityNotify イベントの目的のためには存在しないかのように振舞う。 InputOnly ウィンドウは描画できるものとして使われることはない。 (それはグラフィックリクエストに対するソースもしくは宛先としてのことである。) InputOnlyそして InputOutput ウィンドウが他の点に関して同様に振舞う(プロパティ、 グラブ、入力制御、その他) 拡張パッケージはウィンドウの他のクラスを定義できる。

アンマップされないウィンドウを作り、そのウィンドウの属性をセットするには、 XCreateWindow を使う。

Window XCreateWindow(display, parent, x, y, width, height, border_width, depth,
class, visual, valuemask, attributes)
Display *display;
Window parent;
int x, y;
unsigned int width, height;
unsigned int border_width;
int depth;
unsigned int class;
Visual *visual;
unsigned long valuemask;
XSetWindowAttributes *attributes;
display
X サーバへの接続を指定。
parent
親ウィンドウを指定。
x

y
x, y 座標を指定。これはウィンドウの境界の左上外側の隅であり、 親ウィンドウの境界の内側からの相対座標で与えられる。
width

height
高さと幅を指定。これは生成されるウィンドウの内側のディメンジョンであり、 境界は含まない。 このディメンジョンはゼロでない値でなければならず、 そうでなければ、 BadValueエラーが生じる。
border_width
生成されるウィンドウの境界の幅をピクセル単位で指定。
depth
ウィンドウの深さを指定。 深さを CopyFromParentとした場合、深さは親と同じになる。
class
生成されるウィンドウのクラスを指定。 これには InputOutput , InputOnly , CopyFromParent のいずれかを指定する。 CopyFromParentクラスの時は、親と同じクラスになる。
visual
ビジュアルのタイプを指定。 ビジュアルに CopyFromParent を指定した場合は親と同じビジュアルのタイプになる。
valuemask
引き数 attributes で定義されるウィンドウ属性を指定。 のマスクは、複数の有効な属性マスクに対して、ビットごとの論理和を取ったものである。 マスク値がゼロならば引き数 attributes は無視され、参照されない。
attributes
値を取り出す構造体(マスク値として指定)を指定。 構造体でどの属性がセットされているかを示すため、 マスク値には適切なビットがセットされていなければならない。

関数 XCreateWindowは指定した親ウィンドウに対して、マップされていなサブウィンドウを生成し、 生成したウィンドウのウィンドウIDを返す。 また、X サーバに CreateNotifyイベントを生成させる。 生成されたウィンドウは兄弟ウィンドウに対してスタックの 一番上に配置される。

座標系はX軸が水平方向、Y軸が垂直方向であり、 左上隅が原点[0, 0]である。 座標は整数で、ピクセルが基準であり、 ピクセルの中心と一致する。 各ウィンドウとピックスマップは自分自身の座標系を持つ。 ウィンドウについては、原点は左上隅の境界の内側である。

InputOnlyのウィンドウの場合は border_width はゼロでなければならない。 そうでない場合、エラー BadMatchとなる。 InputOutput ,クラスの場合、スクリーンに対してビジュアルのタイプと 深さの組み合わせがサポートされていなければならない。 そうでない場合には、エラー BadMatchとなる。 深さは親ウィンドウと同じである必要は無い but the parent must not be a window of class が、親ウィンドウのクラスは InputOnly ,であってはならない。 そうでない場合、エラー BadMatchとなる。 InputOnlyのウィンドウは深さがゼロでなければならず、 スクリーンがサポートしているビジュアルでなければならいない。 いずれかの条件が満たされない場合、エラー BadMatchとなる。 しかし、親ウィンドウは任意の深さとクラスを持つことが考えられる。 ウィンドウに対して不正なウィンドウ属性を指定した場合、エラー BadMatchとなる。

生成されたウィンドウは、その時点ではディスプレイに表示(マップ)されない。 ウィンドウを表示するには、 XMapWindow を呼び出す。 新しいウィンドウは初期状態では親ウィンドウと 同じカーソルを使用する。 新しいウィンドウに新しいカーソルを定義する時は、 XDefineCursor を使う。 生成されたウィンドウは全ての祖先ウィンドウがマップされ、自身が 祖先ウィンドウの陰に隠されないようになるまではスクリーンに表示されない。

XCreateWindowはエラー BadAlloc ,BadColor ,BadCursor ,BadMatch ,BadPixmap ,BadValue ,BadWindow を起こすことがある。

与えられた親ウィンドウの表示されない サブウィンドウを作るには、 を使う。

Window XCreateSimpleWindow(display, parent, x, y, width, height, border_width,
border, background)
Display *display;
Window parent;
int x, y;
unsigned int width, height;
unsigned int border_width;
unsigned long border;
unsigned long background;
display
X サーバへの接続を指定。
parent
親ウィンドウを指定。
x

y
x, y 座標を指定。これはウィンドウの境界の左上外側の隅であり、 親ウィンドウの境界の内側からの相対座標で与えられる。
width

height
高さと幅を指定。これは生成されるウィンドウの内側のディメンジョンであり、 境界は含まない。 このディメンジョンはゼロでない値でなければならず、 そうでなければ、 BadValueエラーを引き起こす。
border_width
生成されるウィンドウの境界の幅をピクセル単位で指定。
border
ウィンドウの境界のピクセル値を指定。
background
ウィンドウの背景のピクセル値を指定。

関数 XCreateSimpleWindowは指定した親ウィンドウに対して、マップされていない InputOutputのサブウィンドウを作り、そのウィンドウIDを返す。 また、X サーバに CreateNotifyイベントを生成させる。 生成されたウィンドウは兄弟ウィンドウに対してスタックの最も上に 配置される。 親ウィンドウの外にはみ出る部分は全てクリップされる。 InputOnlyのウィンドウの場合は border_width はゼロでなければならない。 そうでない場合、エラー BadMatchとなる。 XCreateSimpleWindow親ウィンドウより深さ、クラス、ビジュアルを継承する。 これ以外のウィンドウ属性は、背景色を除いて 全てデフォルト値になる。

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

Destroying Windows

Xlibはウィンドウもしくはそのウィンドウのサブウィンドウを破棄するのに使う 関数を与える。

ウィンドウ、およびそのウィンドウのサブウィンドウを破棄するには、 XDestroyWindow を使う。

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

関数 XDestroyWindowは指定したウィンドウとその全てのサブウィンドウを破棄する。 これにより、X サーバは各ウィンドウに対して DestroyNotifyイベントを生成する。 このウィンドウは二度と参照してはならない。 引き数 w で指定したウィンドウがマップされている場合、 このウィンドウは自動的にアンマップされる。 DestroyNotifyイベントの順序は、与えられた任意のウィンドウを破棄できるようなものであり、 DestroyNotifyは自分自身のウィンドウの前に下位ウィンドウに対して生成される。 それ以外の兄弟ウィンドウやサブヒエラルキーの間の順序には制約はない。 指定したウィンドウがルートウィンドウの場合には、(下位ウィンドウも含めて) 破棄されるウィンドウはない。 ウィンドウがマップされている場合、破棄される前に隠していた他のウィンドウで Expose イベントが起きる。

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

指定されたウィンドウのサブウィンドウを破棄するには、 XDestroySubwindows を使う。

XDestroySubwindows(display, w)
Display *display;
Window w;
display
Specifies the connection to the X server.
w
Specifies the window.

関数 XDestroySubwindowsは、指定したウィンドウの下位ウィンドウ全てをスタックの底から 上に向かう順で破棄する。 。 これにより、X サーバは各ウィンドウに対して DestroyNotifyイベントを生成する。 マップされているサブウィンドウが実際に破棄された場合、 XDestroySubwindowsは指定したウィンドウ上での Expose イベントを X サーバに生成させる。 これは、多くのウィンドウを1つずつ消すよりもずっと効率的である。 処理の多くは各ウィンドウに対して行わなくても、ウィンドウ全てに対して 1 度だけ行えばよいからである。 サブウィンドウは、二度と参照してはならない。

XDestroySubwindowsBadWindow エラーを起こすことがある。 ウィンドウのマップ

Mapping Windows

ウィンドウは XMapWindowの呼び出しが行われた場合に、マップされると考えられる。 以下の理由のためにスクリーン上には見えないだろう。

ウィンドウの一部もしくは全部がスクリーン上に見えるようになった時 ウィンドウに Expose イベントが生成される。 クライアントが Expose イベントに答える場合にのみ、ウィンドウは そのイベントを受け取る。 ウィンドウは案マップされた時、そのスタック順で位置を保持する。

ウィンドウマネージャはサブウィンドウの場所を制御したがる。 SubstructureRedirectMask が親ウィンドウで(通常ルートウィンドウ)ウィンドウマネージャ により選択されている場合、 子ウィンドウ上の他のクライアントにより初期化されているマップリクエストは 行われず、 ウィンドウマネージャは MapRequest イベントを送る。 しかし、子ウィンドウ上のoverride_redirectフラグが Trueにセットされているなら、(通常、ポップアップメニューのみである) マップリクエストが行われる。

タイルウィンドウマネージャは他のクライアントウィンドウを再配置したり、リサイズ したりするのを決定する。そして、その時に、最終的な位置にウィンドウをマップするのを 決定する。 飾り付けを与えたいウィンドウマネージャは最初フレームに子ウィンドウ 再描画する。 詳しくは3.2.8および10.10節を参照の事。 単一のクライアントの時、 SubstructureRedirectMask を選択できる。

同様に、単一クライアントは親ウィンドウに ResizeRedirectMask を選択できる。 その時、他のクライアントによるウィンドウをリサイズする全ての試みは抑制され、そして クライアントは ResizeRequest イベントを受け取る。

与えられたウィンドウをマップするには、 XMapWindow を使う。

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

関数 XMapWindowは指定したウィンドウをマップする。 同時に、そのウィンドウのサブウィンドウで 既にマップリクエストを受けているものも全てマップする。 アンマップされている祖先を持つウィンドウをマップしても表示されない。 しかし、その祖先がマップされた時に表示される資格を持つものと 印がつけられる。 このようなウィンドウを表示不可能(unviewable)であると言う。 全ての祖先がマップされている時、そのウィンドウは表示可能になり、 他のウィンドウに隠されていなければスクリーン上で見えるようになる。 ウィンドウが既にマップされている場合、この関数は何もしない。

指定したウィンドウの override-redirect 属性が False False で、かつその親ウィンドウで他のクライアントが SubstructureRedirectMaskを選択している場合には、X サーバは MapRequest関数 XMapWindowはウィンドウをマップしない。 それ以外の場合には、ウィンドウはマップされ、X サーバは MapNotifyイベントを生成する。

そのウィンドウが表示可能になり、以前の表示内容が記憶されていない場合には、 X サーバはその部分を背景色で塗りつぶす。 ウィンドウの背景色が定義されていない場合、 スクリーンに表示されている内容は変化せず、 X サーバは0個以上の Exposeイベントを生成する。 ウィンドウがアンマップされている間もバッキングストアが保持されていれば、 Exposeイベントは生成されない。 れ以降バッキングストアが保持されるならば、 ウィンドウ全体の露出イベントは必ず生成される。 そうでない場合には、可視領域だけが通知される。 同様の塗りつぶしと露出は新しく表示可能になった下位ウィンドウの全てについて行われる。

ウィンドウが InputOutput のウィンドウであれば、 XMapWindowは表示される InputOutputウィウドウのそれぞれに対して Exposeイベントを発生させる。 ライアントがマップ動作とウィンドウの描画を行い、 イベントの処理も始めると、 ウィンドウは2度描画される。 これを避けるためには、 最初に Expose イベントの問い合わせをしてからウィンドウをマップすればよい。 そうすればクライアントは入力イベントを普通に処理する。 ベントリストはスクリーンにあらわれた各ウィンドウに対する Expose を持つ。 クラアントは Expose イベントを受け取った場合、通常はウィンドウの再描画を行うべきである。 通常はこうすることでプログラムが簡単になり、 ウィンドウマネージャとも適切なやりとりができる。

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

ウィンドウをマップし、レイズするには、 XMapRaised を使う。

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

関数 XMapRaisedは、指定したウィンドウと全てのサブウィンドウ (既にマップリクエストを受け取っているもの)をマップする点において XMapWindowと本質的に同じである。 ただし、この関数は指定したウィンドウをウィンドウスタックの先頭に上昇させる。 追加の情報は XMapWindow を参照

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

指定されたウィンドウの全てのサブウィンドウをマップするには、 XMapSubwindows を使う。

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

関数 XMapSubwindowsは、指定したウィンドウのサブウィンドウ全部を上から下のスタック順に マップする。 X サーバは新しく表示されたウィンドウのそれぞれに Exposeイベントを発生させる。 これは多くのウィンドウを1つずつマップするよりもずっと効率的である。 なぜなら X サーバは、全てのウィンドウを相手に処理を一度だけ行うだけで済み、 各々のウィンドウひとつひとつに対応しなくてよいからである。

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

Unmapping Windows

Xlibはウィンドウもしくはそのサブウィンドウをアンマップするのに使う 関数を与える。

ウィンドウをアンマップするには、 XUnmapWindow を使う。

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

関数 XUnmapWindowは、指定したウィンドウをアンマップし、X サーバに UnmapNotifyイベントを生成させる。 指定したウィンドウが既にアンマップされている場合、 XUnmapWindow は何もしない。 アンマップ以前にこのウィンドウに隠されていたウィンドウの露出(exposure) の処理は普通に行われる。 親ウィンドウに対するマップが改めて行われない限り、全ての子ウィンドウは 不可視になる。 つまり、サブウィンドウは依然マップされたままであるが、 親がマップされるまでは不可視になる。 ウィンドウのアンマップは、アンマップする前にこのウィンドウに隠されていた ウィンドウに Expose イベントを生成させる。

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

指定されたウィンドウのサブウィンドウを全てアンマップするには、 XUnmapSubwindows を使う。

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

関数 XUnmapSubwindowsは、指定したウィンドウの全てのサブウィンドウを、 スタックの底から先頭の順にアンマップする。 X サーバは各サブウィンドウ上で UnmapNotifyイベントを生成し、それまでそのウィンドウに 隠されていたウィンドウ上で Expose イベントを生成する。 の関数は複数のウィンドウを1つずつアンマップするよりもずっと効率的である。 なぜなら X サーバは、全てのウィンドウを相手に処理を一度だけ行えばよく、 各々のウィンドウひとつひとつに対応しなくてよいからである。

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

Configuring Windows

Xlibはウィンドウを移動したり、リサイズしたり、ウィンドウの境界線の 幅を変更したりするのに使う関数を与える。 これらのパラメータの変更のために、 XWindowChanges構造体の適切なメンバーをセットし、それに続く XConfigureWindow への呼び出しにおいて有効なマスク値との論理和を取る。 The symbols for the value mask bits and the ビットマスクに対するシンボルと XWindowChanges構造体は以下のようになる。

/* Configure window value mask bits */

#define CWX (1<<0)
#define CWY (1<<1)
#define CWWidth (1<<2)
#define CWHeight (1<<3)
#define CWBorderWidth (1<<4)
#define CWSibling (1<<5)
#define CWStackMode (1<<6)
/* Values */
typedef struct {
	int x, y;
	int width, height;
	int border_width;
	Window sibling;
	int stack_mode;
} XWindowChanges;

x,yはウィンドウのx,y座標をセットするのに使われる。 その座標は親ウィンドウの原点からの座標であり、 ウィンドウの左上隅の位置を示す。 width,heightはウィンドウの内側のサイズをセットするのに使われる。 not including the border, and must be nonzero, or a そのサイズは境界線を含まず、ゼロでない値でなければならず、 そうでなければ、エラー BadValueを引き起こす。 ルートウィンドウを設定しようとしても何も起こらない。

boder_widthはピクセル値での境界線の幅をセットするのに使われる。 境界線の幅をセットするのはウィンドウの左上隅をそのままの位置にしておくが ウィンドウの原点の絶対位置が移動する事に注意する。 InputOnlyウィンドウのboder-width属性をセットする時は ゼロでない値でなければならず、 そうでないなら、エラー BadMatchを引き起こす。

siblingはスタックを操作するための兄弟ウィンドウをセットするために使われる。 stack_modeはどのようにウィンドウが再びスタックされるかをセットするために 使われる。 そして、それは Above , Below , TopIf , BottomIf ,Opposite のいずれかをセットする。

ウィンドウのoverride-redirectフラグが False で他のクライアントの親ウィンドウにおいて SubstructureRedirectMaskが選択されているなら、Xサーバは ConfigureRequestを生成する。しかしそれ以上の処理は行わない。 そうでなければ、 クライアントのウィンドウにおいて、 ResizeRedirectMask on the window and the inside が選択されているなら、 ウィンドウの内側の幅や高さが変化させられる。 ResizeRequestイベントが生成され、現在の内側の幅や高さが変わりに使われる。 ウィンドウのoverride-redirectフラグは ResizeRedirectMask では何もしない事、 そして親ウィンドウにおける SubstructureRedirectMaskがウィンドウにおける ResizeRedirectMask に渡って優先権を持つ事に注意する。

ウィンドウの位置が指定されたように変更された時、 ウィンドウは兄弟間で再びスタックされる。そしてウィンドウの 状態が実際に変更されると ConfigureNotify イベントが生成される。 GravityNotifyイベントは ConfigureNotify イベントの後に生成される。 ウィンドウの内側の幅や高さが実際に変更されると、 そのウィンドウの子ウィンドウは指定されたように変更される。

ウィンドウのサイズが実際に変更されると、 そのウィンドウのサブウィンドウはウィンドウの重みにそって移動する。 ウィンドウのビット重みに依存して、 ウィンドウの内容もまた移動される(3.2.3節を参照)

ウィンドウの領域が隠されていたが、今隠される事がなくなったとすると、 描画処理がこれらの前に隠されていたウィンドウ(ウィンドウ自体やその ウィンドウの祖先のウィンドウを含む)で行われる。 幅や高さを増加させる結果として、 描画処理がウィンドウの全ての新しい領域で行われる。 そしてウィンドウのコンテキストの全ての領域が失われる。

スタックのチェック(特に、 BottomIf ,TopIf ,Opposite に対する評価) が(リクエストの他の配置により制御されるように)、ウィンドウの初期の位置ではなく、 ウィンドウの最後のサイズと位置に対して行われる。 If a sibling is specified without a stack_mode, 兄弟ウィンドウがstack_modeと指定されないと、 エラー BadMatchを引き起こす。

兄弟ウィンドウとstack_modeが指定されると、 ウィンドウは次のようにスタックされる。

Above ウィンドウは兄弟ウィンドウのちょうど上に置かれる。
Below ウィンドウは兄弟ウィンドウのちょうど下に置かれる。
TopIf 兄弟ウィンドウがウィンドウに塞がれると、ウィンドウはスタックの頂上に置かれる。
BottomIf ウィンドウが兄弟ウィンドウに塞がれると、ウィンドウはスタックの底に置かれる。
Opposite 兄弟ウィンドウがウィンドウに塞がれると、ウィンドウはスタックの頂上に置かれる。ウィンドウが兄弟ウィンドウに塞がれると、ウィンドウはスタックの底に置かれる。

stack_modeが指定されていて、兄弟ウィンドウが指定されていない時、 ウィンドウは次のようにスタックされる。

Above ウィンドウはスタックの頂上に置かれる。
Below ウィンドウはスタックの底に置かれる。
TopIf 全ての兄弟ウィンドウがウィンドウに塞がれると、ウィンドウはスタックの頂上に置かれる。
BottomIf ウィンドウが全ての兄弟ウィンドウに塞がれると、ウィンドウはスタックの底に置かれる。
Opposite 全ての兄弟ウィンドウがウィンドウに塞がれると、ウィンドウはスタックの頂上に置かれる。ウィンドウが全ての兄弟ウィンドウに塞がれると、ウィンドウはスタックの底に置かれる。

Attempts to configure a root window have no effect. ルートウィンドウを設定しようとしても、何も起こらない。

To configure a window's size, location, stacking, or border, use ウィンドウのサイズ、位置、スタック、境界線を設定するには、 XConfigureWindow を使う。

XConfigureWindow(display, w, value_mask, values)
Display *display;
Window w;
unsigned int value_mask;
XWindowChanges *values;
display
Specifies the connection to the X server. Xサーバへの接続を指定。
w
再設定するウィンドウを指定。
value_mask
構造体の値を使ってセットする対象の値を指定。 このマスクは有効なウィンドウ設定値ビットの論理和である。
values
XWindowChanges 構造体を指定。

関数 XConfigureWindowXWindowChanges構造体で指定された値を用いて、ウィンドウの大きさ、位置、境界、スタック順を再設定する。 指定されていない値は、そのウィンドウの現在の現在のジオメトリから求める。

stack_mode 無しで siblng が指定されているか、そのウィンドウが 実際には兄弟ウィンドウでない場合には、 エラー BadMatchとなる。 BottomIf ,TopIf ,Opposite計算は、ウィンドウの最初のジオメトリではなく、( XConfigureWindow に渡された他の引き数に制御された)最終的なジオメトリに関して実行される。 ウィンドウ、下位ウィンドウ、新しく可視状態になったウィンドウのバッキングストアの 内容やは破棄されるか、スクリーンの最新の内容を反映するように変更される(これは実装による)。

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

サイズを変える事なしにウィンドウを移動するには、 XMoveWindow を使う。

XMoveWindow(display, w, x, y)
Display *display;
Window w;
int x, y;
display
Xサーバへの接続を指定。
w
移動されるウィンドウを指定。
x

y
x, y 座標を指定。これはウィンドウの境界の左上の新しい位置を定義するが、境界を 持たないウィンドウの場合はウィンドウ自身の左上の位置を示す。新しい値 は親ウィンドウに対する相対座標で表される。

関数 XMoveWindowは指定したウィンドウを指定した x, y 座標へ移動させる。 だし、ウィンドウの大きさやマッピングの状態を変更したり、 ウィンドウを前面に移動させたりはしない。 マップされたウィンドウを動かすと、ウィンドウが子でないウィンドウに 隠されているかどうか、バッキングストアが存在するかどうかによってウ ィンドウの表示内容が失われることがある。 ウィンドウの表示内容が失われた場合、 X サーバは Expose イベントを生成する。 マップされているウィンドウを動かすと、 それまでそのウィンドウに隠されていたウィンドウで Expose イベントが生じる。

ウィンドウの override-redirect フラグが False であり、親ウィンドウで SubstructureRedirectMask を選択している他のウィンドウがある場合、X サーバは ConfigureRequest を生成し、それ以上の処理は行わない。 それ以外の場合は、ウィンドウの移動が起こる。

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

ウィンドウの左上隅の座標を変える事なしにウィンドウのサイズを変えるには、 XResizeWindow を使う。

XResizeWindow(display, w, width, height)
Display *display;
Window w;
unsigned int width, height;
display
Xサーバへの接続を指定。
w
ウィンドウを指定。
width

height
ウィンドウの幅と高さを指定。これはウィンドウの内側のディメンジョンである。

関数 XResizeWindowは指定したウィンドウの、境界を含まない内部のディメンジョンを変更する。 この関数は、ウィンドウの左上の座標や原点を変更しないし、 ウィンドウの再スタックも行わない。 マップされているウィンドウのサイズを変えると表示内容が失われて Expose イベントが生成されることがある。 マップされているウィンドウのサイズを小さくすると、 それ以前にこのウィンドウに隠されていた他のウィンドウで Expose ベントが生成される。

ウィンドウの override-redirect ウィンドウが False であり、親ウィンドウ上で SubstructureRedirectMask を選択している他のクライアントがある場合、 X サーバは ConfigureRequest を生成し、それ以上の処理は行わない。 幅と高さのいずれかがゼロの場合、 エラー BadValueとなる。

XResizeWindowはエラー BadValueBadWindow を起こすことがある。

ウィンドウのサイズと位置を変えるためには、 XMoveResizeWindow を使う。

XMoveResizeWindow(display, w, x, y, width, height)
Display *display;
Window w;
int x, y;
unsigned int width, height;
display
Xサーバへの接続を指定。
w
再設定するウィンドウを指定。
x

y
x, y 座標を指定。これはウィンドウの境界の左上の新しい位置を定義する。 新しい値は親ウィンドウに対する相対座標で表される。
width

height
ウィンドウの幅と高さを指定。これはウィンドウの内側のディメンジョンである。

関数 XMoveResizeWindowは指定したウィンドウの大きさと位置を変える。 ウィンドウの前面への移動は行わない。 マップされているウィンドウの移動やサイズ変更を行った場合、 そのウィンドウで Expose イベントが起こることがある。 ウィンドウの移動の際のサイズと位置のパラメータによっては、 そのウィンドウに隠されていたウィンドウで Expose が起こることがある。

ウィンドウの override-redirect ウィンドウが False であり、親ウィンドウ上で SubstructureRedirectMask を選択している他のクライアントがある場合、X サーバは ConfigureRequest を生成し、それ以上の処理は行わない。 そうでない場合、ウィンドウのサイズや位置は変化しない。

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

与えられたウィンドウの幅の太さを変えるには、 XSetWindowBorderWidth を使う。

XSetWindowBorderWidth(display, w, width)
Display *display;
Window w;
unsigned int width;
display
Xサーバへの接続を指定。
w
ウィンドウを指定。
width
ウィンドウの境界線の幅を指定。

関数 XSetWindowBorderWidthは指定したウィンドウの境界の幅を指定したサイズにする。

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

Changing Window Stacking Order

Xlibはウィンドウを持ち上げたり、下げたり、循環させたり、再スタックする 関数を与える。

兄弟ウィンドウに隠されないようにウィンドウを持ち上げるには、 XRaiseWindow を使う。

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

関数 XRaiseWindowは指定したウィンドウが兄弟ウィンドウに隠されないように、 スタックの最上位に持ち上げる。 ウィンドウを机の上で重なりあっている紙として考えると、 ウィンドウを持ち上げることは、その紙をスタックの一番上に 移動させることに例えられるが、机の上での x, y 座標は変わらない。 マップされているウィンドウを持ち上げた場合、 それまで隠されていたそのウィンドウとマップされているサブウィンドウでは Exposeイベントが発生する。

ウィンドウの override-redirect 属性が False であり、親ウィンドウの SubstructureRedirectMask 選択しているウィンドウが他にある場合、X サーバは ConfigureRequest イベントを生成し、処理を行わない。 そうでなければ、ウィンドウは持ち上げられる。

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

他の兄弟ウィンドウを隠さないようにウィンドウを持ち下げるには、 XLowerWindow を使う。

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

関数 XLowerWindowは他の兄弟ウィンドウを隠さないように、 指定したウィンドウをスタックの最下位に下げる。 ウィンドウを机の上で重なりあっている紙として考えると、ウィンドウを下げることは、 その紙をスタックの一番下に移動させることに例えられるが、 机の上での x, y 座標は変わらない。 マップされているウィンドウを下げた時、 それまで陰になっていた全てのウィンドウで Expose イベントが起こる。

ウィンドウの override-redirect 属性が False であり、親ウィンドウの SubstructureRedirectMask 選択しているウィンドウが他にある場合、X サーバは ConfigureRequest イベントを生成し、処理を行わない。 そうでない場合には、ウィンドウはスタックの最下位に下げられる。

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

サブウィンドウを上もしくは下に循環させるには、 XCirculateSubwindows を使う。

XCirculateSubwindows(display, w, direction)
Display *display;
Window w;
int direction;
display
Xサーバへの接続を指定。
w
ウィンドウを指定。
direction
ウィンドウを移動させる方向(上か下)を指定。 RaiseLowestLowerHighest を指定する。

関数 XCirculateSubwindowsは指定したウィンドウの子ウィンドウを指定した向きに循環させる。 RaiseLowest を指定した場合は、 XCirculateSubwindowsは他の子ウィンドウに隠されている、 最も下にある子ウィンドウ(もしあれば) を持ち上げる。 LowerHighest を指定した場合は、 XCirculateSubwindowsは他の子ウィンドウを隠している、最も上にある子ウィンドウ(もしあれば)を下げる。 その後、それまで他のウィンドウの陰になっていたウィンドウに対して 露出の処理が行われる。 親ウィンドウの SubstructureRedirectMask を選択しているウィンドウが他にある場合、X サーバは CirculateRequest イベントを生成し、それ以上の処理を行わない。 子ウィンドウが実際に再スタックされた場合、 X サーバは CirculateNotifyを生成する。

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

ウィンドウの最下位のマップされている子ウィンドウで、一部あるいは全体が他の子ウィンドウに 隠されているものを持ち上げるには、 XCirculateSubwindowsUp を使う。

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

関数 XCirculateSubwindowsUpは指定したウィンドウの最下位のマップされている子ウィンドウで、 一部あるいは全体が他の子ウィンドウに隠されているものを持ち上げる。 全く隠されていない子ウィンドウは影響を受けない。 これは、 RaiseLowestを指定した XCirculateSubwindowsと等価な簡易関数である。

XCirculateSubwindowsUpBadWindow を起こすことがある。

ウィンドウの最上位のマップされている子ウィンドウで、 他の子ウィンドウ一部あるいは全体を隠しているものを下位に移動させるには、 XCirculateSubwindowsDown を使う。

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

関数 XCirculateSubwindowsDownは指定したウィンドウの最上位のマップされている子ウィンドウで、 他の子ウィンドウ一部あるいは全体を隠しているものを下位に移動させる。 完全に隠れているウィンドウは影響を受けない。 これは LowerHighest指定した XCirculateSubwindowsと等価な簡易関数である。

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

上位から下位の指定した順でウィンドウを再スタックするには、 XRestackWindows を使う。

XRestackWindows(display, windows, nwindows);
Display *display;
Window windows[];
int nwindows;
display
Xサーバへの接続を指定。
windows
再スタックされるウィンドウの配列を指定。
nwindows
再スタックされるウィンドウの数を指定。

関数 XRestackWindowsは上位から下位の指定した順でウィンドウを再スタックする。 ウィンドウの配列の最初のウィンドウのスタック順は通常通りであるが、 配列中の他のウィンドウは最初のウィンドウの下にスタックされる。 他のウィンドウのスタック順は通常通りである。 配列中に指定したウィンドウの子ウィンドウでないものがある場合、 それぞれに対して BadMatchエラーが起こる。

ウィンドウの override-redirect 属性が False であり、親ウィンドウの SubstructureRedirectMask を選択しているウィンドウが他にある場合、 X サーバは override-redirect フラグがセットされていない ウィンドウ全てに対して ConfigureRequest イベントを生成し、それ以上の処理を行わない。 そうでない場合には、ウィンドウは上位から下位の順で再スタックされる。

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

Changing Window Attributes

Xlibはウィンドウ属性をセットするために使う関数を与える。 XChangeWindowAttributesはひとつまたはそれ以上の属性を XSetWindowAttributes構造体に与える事により属性をセットできるより一般的な関数である。 この節で示されている他の関数はウィンドウの背景のような 特定の一つの属性をセットできる。

与えられたウィンドウの一つもしくはそれ以上の属性を変更するには、 XChangeWindowAttributes を使う。

XChangeWindowAttributes(display, w, valuemask, attributes)
Display *display;
Window w;
unsigned long valuemask;
XSetWindowAttributes *attributes;
display
Xサーバへの接続を指定。
w
ウィンドウを指定。
valuemask
引き数 attribute のどのウィンドウ属性が定義されているかを指定。 スクは正しいマスクビット値のビットごとの論理和を取ったものである。 valuemask がゼロならば属性は無視され、参照されない。 その値と制限は XCreateWindow に関するものと同じである。 .IP
attributes
XSetWindowAttributes 構造体を指定。valuemasuk の指定に従って、この構造体から値が取り出される。 マスク値は、構造体にセットされているどの値を取り出すかを示す 適切なビットを持っていなければならない。(3.2節を参照)

関数 XChangeWindowAttributesは、引き数valuemaskに従って XSetWindowAttributes構造体のウィンドウ属性を使って、指定したウィンドウの属性を変更する。 背景色を変更しても、ウィンドウの表示内容は変更されない。 ウィンドウとその背景を再描画するには XClearWindow を使用すること。 。 境界のタイリングの原点が変わるような境界の設定や背景色の設定をすると、 境界は再描画される。 ルートウィンドウの背景を NoneParentRelativeに設定すると、背景はデフォルトの背景ピックスマップに戻る。 ルートウィンドウの境界を CopyFromParentに変更すると、境界はデフォルトの境界ピックスマップに戻る。 win-gravity 値の変更は、ウィンドウの現在位置には影響を与えない。 他のウィンドウに隠されているウィンドウの backing-store 値の WhenMappedAlways への変更や、マップされているウィンドウの backing-planes 値、 backing-pixel 値, save-under 値の変更の影響はすぐには現れない。 ウィンドウのカラーマップの変更(つまり新しいカラーマップの定義であり、 既に存在するカラーマップの内容の変更ではない)は ColormapNotifyイベントを起こす。 可視のウィンドウのカラーマップの変更の効果はすぐには現れない。 これは、カラーマップがインストールされていないからである ( XInstallColormap を参照)。 ルートウィンドウのカーソルを None に設定した場合、カーソルはデフォルトのものに戻る。 クライアントは可能な限りカラーマップを共有することが望ましい。

複数のクライアントが、同じウィンドウで入力を選択することができる。 この場合のイベントマスクは別個に管理される。 あるイベントが生成されたとき、 これはそのイベントに関係する全てのクライアントに送られる。 しかし、 SubstructureRedirectMask , ResizeRedirectMask , ButtonPressMask は同時に1つのクライアントだけしか選択できない。 あるクライアントがこれらのイベントマスクを選択しようとしたときに、 他のクライアントがすでにこれを選択していた場合は、 エラー BadAccessとなる。 1つのウィンドウに対して、伝播させないイベントを指定するマスクが1つだけ存在する。 これはクライアントごとに1つではない。

XChangeWindowAttributesはエラー BadAccess ,BadColor ,BadCursor ,BadMatch ,BadPixmap ,BadValue ,BadWindow を起こすことがある。

与えられたピクセルにウィンドウの背景をセットするには、 XSetWindowBackground を使う。

XSetWindowBackground(display, w, background_pixel)
Display *display;
Window w;
unsigned long background_pixel;
display
Xサーバへの接続を指定。
w
ウィンドウを指定。
background_pixel
背景に使われるピクセルを指定。

関数 XSetWindowBackgroundは、指定したピクセル値をウィンドウの背景にセットする。 背景の変更によりウィンドウの内容が変化することはない。 XSetWindowBackgroundは指定したピクセル値で塗りつぶされた未定義サイズのピックスマップを使用する。 InputOnlyのウィンドウの背景を変更しようとした場合は、 エラー BadMatchとなる。

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

ウィンドウに背景に与えられたピクスマップをセットするには、 XSetWindowBackgroundPixmap を使う。

XSetWindowBackgroundPixmap(display, w, background_pixmap)
Display *display;
Window w;
Pixmap background_pixmap;
display
Xサーバへの接続を指定。
w
ウィンドウを指定。
background_pixmap
背景のピクスマップ、 ParentRelative ,None のいずれかを指定。

関数 XSetWindowBackgroundPixmapはウィンドウの背景ピックスマップに、指定したピックスマップをセットする。 背景ピックスマップは、明示的な参照がそれ以上なされないことがわかった時点で、 すぐに解放してよい。 ParentRelativeが指定された場合、 親ウィンドウの背景ピックスマップか使われる。 ルートウィンドウの場合には、背景ピックスマップはデフォルトのものに戻る。 InputOnlyのウィンドウの背景を変更しようとした場合は、 エラー BadMatchとなる。 背景に None がセットされている場合、 ウィンドウの背景は定義されていない。

XSetWindowBackgroundPixmapはエラー BadMatch ,BadPixmap ,BadWindow を起こすことがある。

Note: XSetWindowBackgroundXSetWindowBackgroundPixmapウィンドウの現在の内容を変更しない。

ウィンドウの境界線を与えられたピクセルに変更、再描画するには、 XSetWindowBorder を使う。

XSetWindowBorder(display, w, border_pixel)
Display *display;
Window w;
unsigned long border_pixel;
display
Xサーバへの接続を指定。
w
ウィンドウを指定。
border_pixel
カラーマップ内のエントリーを指定。

関数 XSetWindowBorderは、ウィンドウの境界に指定したピクセル値をセットする。 InputOnlyのウィンドウに対してこの操作を行った場合は、 エラー BadMatchとなる。

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

与えられたウィンドウの境界のタイルを変更、再描画するには、 XSetWindowBorderPixmap を使う。

XSetWindowBorderPixmap(display, w, border_pixmap)
Display *display;
Window w;
Pixmap border_pixmap;
display
Xサーバへの接続を指定。
w
ウィンドウを指定。
border_pixmap
境界のピックスマップか CopyFromParent を指定。

関数 XSetWindowBorderPixmapはウィンドウの境界ピックスマップに指定したピックスマップをセットする。 境界ピックスマップへの明示的な参照がなくなれば、 すぐにこのピックスマップを解放することができる。 CopyFromParent を指定した場合、 親ウィンドウの境界ピックスマップのコピーが使われる。 この操作を InputOnlyに対して行った場合はエラー BadMatchとなる。

XSetWindowBorderPixmapはエラー BadMatch ,BadPixmap ,BadWindow を返すことがある。

与えられたウィンドウのカラーマップをセットするには、 XSetWindowColormap を使う。

XSetWindowColormap(display, w, colormap)
Display *display;
Window w;
Colormap colormap;
display
Xサーバへの接続を指定。
w
ウィンドウの指定。
colormap
カラーマップを指定。

関数 XSetWindowColormapは指定したウィンドウに指定したカラーマップをセットする。 カラーマップはウィンドウと同じビジュアルタイプでなければならない。 そうでない場合には、 エラー BadMatchとなる。

XSetWindowColormapはエラー BadColor ,BadMatch ,and BadWindow を起こすことがある。

ウィンドウに使おうとするカーソルを定義するには、 XDefineCursor を使う。

XDefineCursor(display, w, cursor)
Display *display;
Window w;
Cursor cursor;
display
Specifies the connection to the X server. Xサーバへの接続を指定。
w
ウィンドウを指定。
cursor
表示するカーソルか None を指定。

カーソルがセットされた場合、このカーソルはそのウィンドウ内でポインタとして使われる。 引き数 cursor に None を指定した場合は XUndefineCursor と等価である。

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

与えれたウィンドウのカーソルを未定義にするには、 XUndefineCursor を使う。

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

関数 XUndefineCursorは、このウィンドウに対する以前の XDefineCursorの効果を取り消す。 ポインタがウィンドウ内にある場合、 親ウィンドウのカーソルが使用される。 ルートウィンドウの場合には、 デフォルトのカーソルが復元される。

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


目次に戻る