入り口に戻る

原文はこちら。

翻訳にあたって、オープンソースグループ・ジャパンの MIT ライセンスの訳、aznote のSHAPE拡張に関する記事、及び一瀬亮の非矩形のウィンドウに関する記事を参考にした。

# X Nonrectangular Window Shape Extension Protocol(日本語訳)

## X.Org Standard

### Keith Packard

MIT X Consortium
Intel Corporation

### Hideki Hiura

SunSoft, Inc.

X Version 11, Release 7.7

Version 1.1

Copyright © 1989, 2004 The Open Group

Copyright © 2006 Keith Packard

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Except as contained in this notice, the name of the copyright holders shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from the copyright holders.

(訳)

(本ソフトウェアおよび関連する文書のファイル（以下「ソフトウェア」）の複製を取得した全ての人物に対し、以下の条件に従うことを前提に、ソフトウェアを無制限に扱うことを無償で許可する。これには、ソフトウェアの複製を使用、複製、改変、結合、公開、頒布、再許諾、および/または販売する権利、およびソフトウェアを提供する人物に同様の行為を許可する権利が含まれるが、これらに限定されない。)

(上記の著作権表示および本許諾表示を、ソフトウェアの全ての複製または実質的な部分に記載するものとする。)

(ソフトウェアは「現状有姿」で提供され、明示的であるか黙示的であるかを問わず、いかなる種類の保証も行われない。ここでいう保証には、商品性、特定目的への適合性、および権利の非侵害性に関する保証も含まれるが、これらに限定されるものではない。著作権者は、契約、不法行為、またはその他の行為であるかを問わず、ソフトウェアまたはソフトウェアの使用もしくはその他に取り扱いに起因または関連して生じるいかなる請求、損害賠償、その他の責任について、一切の責任を負わない。)

(著作権者の名称は、この表示に記載されている場合を除き、著作権者の事前の書面による承認を得ずに、宣伝であろうとその他の形であろうと、ソフトウェアの販売を促進するもの、またはソフトウェアの使用その他の扱いを奨励するものに使用してはならない。)

## 第１章　概要

この拡張は、X11 プロトコルの枠内で任意の形状のウィンドウやボーダ(枠)を実現する機能を提供するものである。

X プロトコルにおける「矩形のウィンドウ」という決まりは、さまざまな様式のユーザ・インターフェイスを実装するにあたっての重大な制約である。例えば、多くの一時的な(transient)ウィンドウは、３次元の錯覚を作り出すために「drop shadow」を表示したいと考えるであろう。また別の例を挙げると、ユーザ・インターフェイスの様式(style guide)の中には、角の丸いボタンを必要とするものもある。特にイベントの配送やカーソルの形状が絡む場面で、四角くない形状を完全に実現することは、核となる X プロトコルのみでは不可能である。最後の例は丸い時計と四角くないアイコンであり、これはデスクトップの視覚的付加物として欠かせないものである。

この拡張は次の機構を提供する。即ち、ウィンドウの視覚的な形状と入出力領域の形状の両方を任意の、場合によっては繋がっていない、非矩形の形に変更する機構を提供する。この拡張の狙いは既存の機能(semantics)を補うことであって、これを置き換えることではない。とりわけ、この拡張を認識しないクライアントであっても形状変更されたウィンドウに適切に対処できるのが望ましい。例えば、ウィンドウ・マネージャは、矩形の要素を単位としてスクリーン上の実際の配置を交渉できるべきである。この目的を達成するために、あるウィンドウに与えられた形状は、X プロトコルのウィンドウ・ジオメトリによって定まる矩形であって且つ同ウィンドウの境界を構成するものによって、(周囲を)切り取られる。クライアント・プログラムはウィンドウ・マネージャが用意した領域の範囲まで自身の形状を広げられる、という規約を定めるのが望ましい。

## 第２章　詳説

各ウィンドウは(形状が設定されてない時でも)次の３つの領域で構成される。bounding region (境界領域)、clip region (クリップ領域)、そして input region (入力領域)である。あるウィンドウの境界領域は、親ウィンドウの領域の中、同ウィンドウ(ボーダも含む)が占める部分である。あるウィンドウのクリップ領域は、同ウィンドウの境界領域の部分(subset)であり、子ウィンドウのため、あるいはグラフィクス表示のために利用可能な領域である。境界領域とクリップ領域との間の領域がそのウィンドウのボーダ(枠)を構成する。入力領域は境界領域の部分(subset)であり、ポインタを含む("contain")ことができる領域である。(訳註：ポインタの「contain」については、X Window System Protocol の「Containment」のところに記述がある。)

形状が設定されていないウィンドウの境界領域は、同ウィンドウの範囲全体に広がる矩形であり、この矩形には同ウィンドウのボーダも含まれる。同ウィンドウのクリップ領域は、内部の範囲(ボーダは含まない)を満たす矩形である。同ウィンドウの入力領域は、境界領域と一致する。本文書においては、これらの領域を「デフォルト境界領域」(default bounding region)、「デフォルト・クリップ領域」(default clip region)、「デフォルト入力領域」(default input region)と呼ぶ。ウィンドウの内部のサイズが width ✕ height であり、ボーダの幅が bwidth である場合、デフォルトの境界領域・クリップ領域・入力領域は以下の矩形になる(座標はウィンドウの座標系の原点からのもの)。

    bounding.x = -bwidth
    bounding.y = -bwidth
    bounding.width = width + 2 * bwidth
    bounding.height = height + 2 * bwidth

    clip.x = 0
    clip.y = 0
    clip.width = width
    clip.height = height

    input.x = -bwidth
    input.y = -bwidth
    input.width = width + 2 * bwidth
    input.height = height + 2 * bwidth

この拡張においては、クライアントは、デフォルト領域と掛け合わせて使用する新たな領域を指定することで、境界領域、クリップ領域、入力領域を変更することができる(３つとも変更しても良いし、変更しないものがあっても良い。)。これによって生じる新たな領域を「クライアント境界領域」(client bounding region)、「クライアント・クリップ領域」(client clip region)、「クライアント入力領域」(client input region)と呼ぶ。これらは、ウィンドウの原点からの相対座標で設定され、常にオフセット(offset)の分だけウィンドウの原点から移動した状態で構成される(つまり、ウィンドウが移動しても領域の調整は必要ない)。領域を設定するための手段は３つある。１つは矩形のリスト(訳註：基本的には配列)、１つはビットマップ、もう１つはウィンドウの既存の境界領域やクリップ領域である。これは X プロトコルのグラフィクス・コンテクストの領域に関する規定を元にしたものであり、この手法のおかげでこの拡張がさまざまな用途に使えるようになる。

ウィンドウの既存の形状を演算対象(オペランド)として用いて新たな形状を設定する場合、クライアント領域を使用する。但し、未だクライアント領域が設定されてない場合は例外で、この場合には代わりにデフォルト領域を使用する。

ウィンドウの「有効境界領域」(effective bounding region)は、クライアント境界領域とデフォルト境界領域の共通部分(共通集合)によって構成する。クライアント境界領域の一部であってデフォルト境界領域に含まれない部分は全て、スクリーン上の有効境界領域には含まれない。これは次のことを意味する。即ち、矩形のクライアント・ウィンドウを扱ってきたウィンドウ・マネージャ(あるいは他のジオメトリ・マネージャ)は、今後もクライアントをスクリーンの矩形領域に押し込めることができることを意味する。(訳註：デフォルト境界領域は定義上、常に矩形であるため。)

有効境界領域の構築は動的に行われる。クライアント境界領域そのものが変化して有効境界領域になるわけではない。クライアント境界領域が現在のデフォルト境界領域の範囲をからはみ出すように設定されている場合、後ほどウィンドウが拡大されると、有効境界領域は拡大されてクライアント境界領域をより多く含むようになる。

ウィンドウの「有効クリップ領域」(effective clip region)は、クライアント・クリップ領域とデフォルト・クリップ領域とクライアント境界領域の３つの共通部分で構成される。クライアント・クリップ領域の一部であって、デフォルト・クリップ領域とクライアント境界領域の両方に含まれていない部分は全て、スクリーン上の有効クリップ領域には含まれない。

有効クリップ領域の構築は動的に行われる。クライアント・クリップ領域そのものが変化して有効クリップ領域になるわけではない。クライアント・クリップ領域が現在のデフォルト・クリップ領域の範囲からはみ出すように設定されている場合、後ほどウィンドウやその境界領域が拡大すると、有効クリップ領域は拡大されてクライアント・クリップ領域(有効境界領域に含まれる部分に限る)をより多く含むようになる。

ウィンドウのボーダ(枠)は、有効境界領域と有効クリップ領域の差で構成される。この領域が存在しなければ、ボーダは一切表示されない。この領域が存在する場合、ボーダは、X プロトコルの規定通りにウィンドウの border-tile もしくは border-pixel を用いて塗りつぶされる。ゼロではない幅のボーダを持つウィンドウであっても、ウィンドウのデフォルト・クリップ領域の範囲外に描画することはできないことに注意。また、ボーダの幅がゼロであってもウィンドウはボーダを持つことができることにも注意。この場合でもクリップ形状を境界形状より小さく作ることは可能であるため。

ウィンドウと、全ての下位ウィンドウの可視領域とへ向かう出力は全て、有効クリップ領域の範囲に(周囲を)切り取られる。X サーバは、ウィンドウの内容の中の有効境界領域からはみ出した部分を控えの記憶領域(backing store)に保持してはならない。ウィンドウの原点(の位置)(グラフィクスの操作、背景のタイル描画、及び下位ウィンドウの配置にあたっての原点)は、境界領域やクリップ領域の存在によっては変化しない。

ウィンドウの「有効入力領域」(effective input region)は、クライアント入力領域とデフォルト入力領域とクライアント境界領域の３つの共通部分で構成される。クライアント入力領域の一部であって、デフォルト入力領域とクライアント境界領域の両方に含まれていない領域は全て、スクリーン上の有効入力領域には含まれない。

有効入力領域の構築は動的に行われる。クライアント入力領域そのものが変化して有効入力領域になるわけではない。クライアント入力領域が現在のデフォルト入力領域からはみ出すように設定されている場合、後ほどウィンドウやその境界領域が拡大すると、有効入力領域は拡大されてクライアント入力領域(有効境界領域に含まれる部分に限る)をより多く含むようになる。

デフォルト境界領域の内部であるが有効境界領域の外部である領域は、ウィンドウの一部にはならない。スクリーンのこうした領域は、他のウィンドウが埋めることになる。入力イベントが起きたのがウィンドウのデフォルト境界領域の内部であり且つ有効境界領域の外部であった場合、同イベントは、あたかもそのウィンドウがイベント発生の位置を覆っていなかったかのような仕方で配送される。ウィンドウの矩形でないボーダの中で発生したイベントは、通常の矩形のボーダの中で発生したイベントと同じように、同ウィンドウに配送される。

`InputOnly` のウィンドウには境界領域と入力領域を設定することができる。けれども、`InputOnly` のウィンドウにクリップ領域の設定を試みたり、この拡張のリクエストの「source」として同ウィンドウのクリップ領域を指定しようと試みたりすると、`Match` エラーとなる。

X サーバは、ルート・ウィンドウのクリップ領域と入力領域に起きた変更を受け入れなければならないが、ルート・ウィンドウの境界領域の変更(requested changesリクエストされた変更)は無視することができる。X サーバが境界領域の変更を受け入れる場合、境界領域の外側のスクリーンの内容は実装依存である。

## 第３章　型(Types)

以下の章では、リクエストとイベントの定義を述べるにあたって、下記の型(type)を使用する。

SHAPE_KIND: { `Bounding`, `Clip`, `Input` }

SHAPE_OP: { `Set`, `Union`, `Intersect`, `Subtract`, `Invert` }

「`Set`」は、リクエスト中の source で具体的に指定された領域がそのまま destination (の指すウィンドウ)の新たな「クライアント領域」となることを意味する。「`Union`」は、source の領域と destination (のウィンドウ)の領域とを合併させた領域(和集合)が destination (のウィンドウ)の新たな「クライアント領域」となることを意味する。「`Intersect`」は、source の領域と destination (のウィンドウ)の領域とが重なり合う領域(共通集合)によって、destination (のウィンドウ)の新たな「クライアント領域」が生成されることを意味する。「`Subtract`」は、destination (のウィンドウ)の領域から source の領域を引いたもの(差集合)が destination (のウィンドウ)の新たな領域となることを意味する。「`Invert`」は、source の領域から destination (のウィンドウ)の領域を引いたものが destination (のウィンドウ)の新たな領域となることを意味する。

## 第４章　リクエスト

`ShapeQueryVersion`

=>

majorVersion: CARD16

minorVersion: CARD16

このリクエストを使って、X サーバの SHAPE 拡張の版がクライアントの使用できるものであるか否かを確認することができる。本文書では、上位の版番号が壱(1)、下位の版番号が壱(1)である。

`ShapeRectangles`

dest: WINDOW
destKind: SHAPE_KIND
op: SHAPE_OP
xOff, yOff: INT16
rectangles: LISTofRECTANGLES
ordering: { `UnSorted`, `YSorted`, `YXSorted`, `YXBanded` }
Errors: `Window`, `Length`, `Match`, `Value`

このリクエストでは、領域１つを構成するための矩形の配列を指定する。この矩形の座標は、ウィンドウの原点からのものであり、指定されたオフセット(「xOff」と「yOff」)の分だけ移動させられたものである。この領域は、「dest」のウィンドウの既存のクライアント領域(「destKind」で指定された種類のもの)と合わさって(指定された演算子「op」に従って合併)、新たな領域を構成する。この結果として生じた領域は、「dest」のウィンドウの指定された種類のクライアント領域として記憶される。矩形のリスト(配列)は空であっても良く、その場合は空の領域を指定したことになる。これは `ShapeMask` に `None` を設定するのとは違う。

矩形群の順序関係は、クライアントがこれを知っている場合、引数「ordering」で指定することができる。これによって X サーバの演算がより速くなる。「ordering」の値の意味は、X プロトコルの `SetClipRectangles` リクエストのところで述べたものと同じである。不正確な順序が指定された場合、X サーバは `Match` エラーを生成することができるけれども、必ずしもそうしなければいけないわけではない。エラーを生成しなかった場合、グラフィクス表示の結果は未定義である。`UnSorted` の場合を除いて矩形群は共通部分(重なる部分)を持ってはならず、さもなければ、結果として生じる領域は未定義となる。`UnSorted` は、矩形群が任意の順序であってよいことを意味する。`YSorted` は、矩形の原点の y 座標が昇順(小さいものが先頭)となるように矩形群が並んでいることを意味する。`YXSorted` は、`YSorted` の順序に対して、「同一の y 座標の原点を持つ矩形は全て、原点の x 座標が昇順となるように並んでいる」という制約を追加したものである。`YXBanded` は、`YXSorted` の順序に対して、「選択可能な y 座標の走査線の全てについて、ある走査線を領域内に含む矩形は全て、同一の y 座標の原点と同一の y 方向の幅(高さ)を持たなければならない」という制約を追加したものである。

`ShapeMask`

dest: WINDOW
destKind: SHAPE_KIND
op: SHAPE_OP
xOff, yOff: INT16
source: PIXMAP or `None`
Errors: `Window`, `Pixmap`, `Match`, `Value`

このリクエストの source は、１ビットの深度のピクスマップ、もしくは `None` である。source が `None` の場合、(destKind で)指定されたクライアント領域は対象ウィンドウから削除され、有効領域はデフォルト領域に戻る。その場合、このリクエストによって発生する `ShapeNotify` イベントと、後に実行される `ShapeQueryExtents` リクエストでは、クライアント形状は未設定であると報告されることになる。有効なピクスマップが指定された場合、同ピクスマップは領域へと変換される。その際、ビットが 1 のところは領域に含まれ、ビットが 0 のところは領域から除外され、xOff と yOff の分だけウィンドウの原点から移動させられる。この結果として生じた領域は、dest のウィンドウの既存の(destKind の種類の)クライアント領域と(演算子 op に従って)組み合わされて、新たな領域を作る。この領域は、dest のウィンドウの指定された種類のクライアント領域として記憶される。source のピクスマップと dest のウィンドウは、同一のスクリーンで作成されたものでなければならない。さもなければ、`Match` エラーが発生する。

`ShapeCombine`

dest: WINDOW
destKind: SHAPE_KIND
op: SHAPE_OP
xOff, yOff: INT16
source: WINDOW
sourceKind: SHAPE_KIND
Errors: `Window`, `Match`, `Value`

source のウィンドウの sourceKind で指定された種類のクライアント領域は、xOff と yOff の分だけ同ウィンドウの原点から移動させられ、dest のウィンドウの destKind で指定された種類のクライアント領域と組み合わせられる(訳註：演算子 op に従って組み合わせる)。結果として生じた領域は、dest のウィンドウの指定された種類のクライアント領域として記憶される。source のウィンドウと dest のウィンドウは、同じスクリーンの上に存在しなければならない。さもなければ、`Match` エラーが発生する。

`ShapeOffset`

dest: WINDOW
destKind: SHAPE_KIND
xOff, yOff: INT16
Errors: `Window`, `Match`, `Value`

destKind で指定されたクライアント領域は、その領域の現在の位置を基準として、xOff と yOff の分だけ移動させられる。

`ShapeQueryExtents`

dest: WINDOW
=>
boundingShaped: BOOL
clipShaped: BOOL
xBoundingShape: INT16
yBoundingShape: INT16
widthBoundingShape: CARD16
heightBoundingShape: CARD16
xClipShape: INT16
yClipShape: INT16
widthClipShape: CARD16
heightClipShape: CARD16
Errors: `Window`

boundingShaped と clipShaped には、それに対応するクライアント領域が設定されていれば `True` が返り、そうでなければ `False` が返る。x、y、width、及び height にはクライアント領域の位置と大きさが返る。但し、クライアント領域が未だ設定されてない場合は、同一の種類のデフォルト領域の位置と大きさが返る。

`ShapeSelectInput`

window: WINDOW
enable: BOOL
Errors: `Window`,`Value`

enable に `True` を指定すると、指定されたウィンドウの境界領域、クリップ領域、もしくは入力領域が何れかのクライアントによって変更された場合に、X サーバからこのリクエストを発したクライアントへ、常に `ShapeNotify` イベントが送信されるようになる。enable に `False` を指定すると、X サーバはそのようなイベントを送信するのを止める。

`ShapeInputSelected`

window: WINDOW
=>
enable: BOOL
Errors: `Window`

enable に `True` が返れば、window のウィンドウに関する `ShapeNotify` イベントがこのクライアント(このリクエストを使用したクライアント)へ向けて生成されることがわかる。

`ShapeGetRectangles`

window: WINDOW
kind: SHAPE_KIND
=>
rectangles: LISTofRECTANGLE
ordering: { `UnSorted`, `YSorted`, `YXSorted`, `YXBanded` }
Errors: `Window,` `Match`

戻り値の矩形のリストは kind で指定された種類の領域を表す。また、このリストの矩形群の順序(ordering)も返る。ordering の値の意味は `ShapeRectangles` リクエストのものと同じである。

## 第５章　イベント

`ShapeNotify`

window: WINDOW
kind: SHAPE_KIND
shaped: BOOL
x, y: INT16
width, height: CARD16
time: TIMESTAMP

ウィンドウのクライアント境界領域、クライアント・クリップ領域もしくはクライアント入力領域の形状が変更された時は常に、`ShapeSelectInput` を使用して `ShapeNotify` イベントを要求していたクライアントのそれぞれに対して、同イベントが送信される。

kind は、どちらの型のクライアント領域(境界領域もしくはクリップ領域)が変更されたのかを示す。shaped には、ウィンドウが kind の型(のクライアント領域)の形状を持っている場合には `True` が、ウィンドウがもはやこの型(のクライアント領域)の形状を持っていない場合には `False` が入っている。x、y、width、及び height は、現在の形状の位置と範囲を表す。shaped が `False` の場合、これらはデフォルト領域の位置と範囲を表すことになる。タイムスタンプ(time)は、形状が変更された時のサーバ時刻を表す。

## 第６章　符号化

この文書は X11 の「プロトコルの符号」の文書(X Window System Protocol の附録 B の「Protocol Encoding」)で確立された規約に則っているので、そちらの文書も参照してほしい。

この拡張の名前は「SHAPE」である。

## 新しい型(New Types)

    SHAPE_KIND
         0     Bounding(境界領域)
         1     Clip(クリップ領域)
         2     Input(入力領域)

    SHAPE_OP
         0     Set
         1     Union
         2     Intersect
         3     Subtract
         4     Invert

## リクエスト

    ShapeQueryVersion
         1     CARD8              opcode(X11 の「SHAPE拡張」を表す命令コード)
         1     0                  shape opcode(SHAPE 拡張の命令コード)
         2     1                  request length(リクエストの長さ)

    =>
         1     1                  Reply(返答)
         1                        unused(使わない)
         2     CARD16             sequence number(通し番号)
         4     0                  length(長さ)
         2     CARD16             major version(版番号の上位)
         2     CARD16             minor version(版番号の下位)
         20                       unused(使わない)

    ShapeRectangles
         1     CARD8              opcode(X11 の「SHAPE拡張」を表す命令コード)
         1     1                  shape opcode(SHAPE 拡張の命令コード)
         2     4+2n               request length(リクエストの長さ)
         1     SHAPE_OP           operation(操作)
         1     SHAPE_KIND         destination kind(destination の領域の種類)
         1                        ordering
               0     UnSorted
               1     YSorted
               2     YXSorted
               3     YXBanded
         1                        unused(使わない)
         4     WINDOW             destination window
         2     INT16              x offset
         2     INT16              y offset
         8n    LISTofRECTANGLE    rectangles(矩形のリスト)

    ShapeMask
         1     CARD8              opcode(X11 の「SHAPE拡張」を表す命令コード)
         1     2                  shape opcode(SHAPE 拡張の命令コード)
         2     5                  request length(リクエストの長さ)
         1     SHAPE_OP           operation(操作)
         1     SHAPE_KIND         destination kind(destination の領域の種類)
         2                        unused(使わない)
         4     WINDOW             destination window
         2     INT16              x offset
         2     INT16              y offset
         4     PIXMAP             source bitmap
               0     None

    ShapeCombine
         1     CARD8              opcode(X11 の「SHAPE拡張」を表す命令コード)
         1     3                  shape opcode(SHAPE 拡張の命令コード)
         2     5                  request length(リクエストの長さ)
         1     SHAPE_OP           operation(操作)
         1     SHAPE_KIND         destination kind(destination の領域の種類)
         1     SHAPE_KIND         source kind(source の領域の種類)
         1                        unused(使わない)
         4     WINDOW             destination window
         2     INT16              x offset
         2     INT16              y offset
         4     WINDOW             source window

    ShapeOffset
         1     CARD8              opcode(X11 の「SHAPE拡張」を表す命令コード)
         1     4                  shape opcode(SHAPE 拡張の命令コード)
         2     4                  request length(リクエストの長さ)
         1     SHAPE_KIND         destination kind(destination の領域の種類)
         3                        unused(使わない)
         4     WINDOW             destination window
         2     INT16              x offset
         2     INT16              y offset

    ShapeQueryExtents
         1     CARD8              opcode(X11 の「SHAPE拡張」を表す命令コード)
         1     5                  shape opcode(SHAPE 拡張の命令コード)
         2     2                  request length(リクエストの長さ)
         4     WINDOW             destination window

     =>
         1     1                  Reply(返答)
         1                        unused(使わない)
         2     CARD16             sequence number(通し番号)
         4     0                  reply length
         1     BOOL               bounding shaped(境界領域が設定されているか)
         1     BOOL               clip shaped(クリップ領域が設定されているか)
         2                        unused(使わない)
         2     INT16              bounding shape extents x(境界領域の形状の x 座標)
         2     INT16              bounding shape extents y
         2     CARD16             bounding shape extents width
         2     CARD16             bounding shape extents height
         2     INT16              clip shape extents x(クリップ領域の形状の x 座標)
         2     INT16              clip shape extents y
         2     CARD16             clip shape extents width
         2     CARD16             clip shape extents height
         4                        unused(使わない)

    ShapeSelectInput
         1     CARD8              opcode(X11 の「SHAPE拡張」を表す命令コード)
         1     6                  shape opcode(SHAPE 拡張の命令コード)
         2     3                  request length(リクエストの長さ)
         4     WINDOW             destination window
         1     BOOL               enable
         3                        unused(使わない)

    ShapeInputSelected
         1     CARD8              opcode(X11 の「SHAPE拡張」を表す命令コード)
         1     7                  shape opcode(SHAPE 拡張の命令コード)
         2     2                  request length(リクエストの長さ)
         4     WINDOW             destination window
     =>
         1     1                  Reply(返答)
         1     BOOL               enabled
         2     CARD16             sequence number(通し番号)
         4     0                  reply length(この返答の長さ)
         24                       unused(使わない)

    ShapeGetRectangles
         1     CARD8              opcode(X11 の「SHAPE拡張」を表す命令コード)
         1     8                  shape opcode(SHAPE 拡張の命令コード)
         2     3                  request length(リクエストの長さ)
         4     WINDOW             window
         1     SHAPE_KIND         source kind(source の領域の種類)
         3                        unused(使わない)
     =>
         1     1                  Reply(返答)
         1                        ordering
               0     UnSorted
               1     YSorted
               2     YXSorted
               3     YXBanded
         2     CARD16             sequence number(通し番号)
         4     2n                 reply length(この返答の長さ)
         4     CARD32             nrects(矩形の数 n)
         20                       unused(使わない)
         8n    LISTofRECTANGLE    rectangles(矩形のリスト)

## イベント

    ShapeNotify
         1     CARD8               type (0 + extension event base)(型 (0 + この拡張の基本値))
         1     SHAPE_KIND          shape kind(形状の種類)
         2     CARD16              sequence number(通し番号)
         4     WINDOW              affected window(イベントが起きたウィンドウ)
         2     INT16               x value of extents(領域の x 座標)
         2     INT16               y value of extents
         2     CARD16              width of extents
         2     CARD16              height of extents
         4     TIMESTAMP           server time
         1     BOOL                shaped(形状が今でも存在するか)
         11                        unused(使わない)

## 用語解説

bounding region(境界領域)

  親ウィンドウの領域の中、このウィンドウが占める部分。この領域は２つの部分に分かれる。枠(borderボーダ)と内部領域である。

clip region(クリップ領域)

  ウィンドウの内部領域であり、境界領域(bounding region)の一部である。この領域は、ウィンドウ(の内容)が消された場合に「ウィンドウの背景」で描画される領域であり、同ウィンドウに対するグラフィクス出力の全てが入る領域であり、そして子ウィンドウ(の描画されない領域)を切り取る(clip)領域である。

input region(入力領域)

  境界領域(bounding region)の一部であり、ポインタを含む(contain)ことができる。(訳註：ポインタの「contain」については、X Window System Protocol の「Containment」のところに記述がある。)

default bounding region(デフォルト境界領域)

  X プロトコルでウィンドウ・サイズに関連して説明されている通りの矩形の領域であり、ウィンドウの内部とその枠(ボーダ)を含む。

default clip region(デフォルト・クリップ領域)

  X プロトコルでウィンドウ・サイズに関連して説明されている通りの矩形領域であり、ウィンドウの内部を含み、枠(ボーダ)は含まない。

default input region(デフォルト入力領域)

  X プロトコルでウィンドウ・サイズに関連して説明されている通りの矩形の領域であり、ウィンドウの内部とその枠(ボーダ)を含む。

client bounding region(クライアント境界領域)

  ウィンドウに結び付けられた領域であり、この拡張が直接変更を加える領域である(変更の際には `ShapeBounding` を指定する)。この領域とデフォルト境界領域とを合わせて用いることで、有効境界領域が定まる。

client clip region(クライアント・クリップ領域)

  ウィンドウに結び付けられた領域であり、この拡張が直接変更を加える領域である(変更の際には `ShapeClip` を指定する)。この領域とデフォルト・クリップ領域とクライアント境界領域とを合わせて用いることで、有効クリップ領域が定まる。

client input region(クライアント入力領域)

  ウィンドウに結び付けられた領域であり、この拡張が直接変更を加える領域である(変更の際には `ShapeInput` を指定する)。この領域とデフォルト入力領域とクライアント境界領域とを合わせて用いることで、有効入力領域が定まる。

effective bounding region(有効境界領域)

  スクリーン上のウィンドウの実際の形状であり、枠と内部を含む領域(但し、重なっているウィンドウ群の影響は計算に入れない)。ウィンドウがクライアント境界領域を持っている場合、有効境界領域は、デフォルト境界領域とクライアント境界領域の共通部分(重なる領域)となる。ウィンドウがクライアント境界領域を持ってない場合、有効境界領域はデフォルト境界領域と等しくなる。

effective clip region(有効クリップ領域)

  スクリーン上のウィンドウの内部の実際の形状である(但し、重なっているウィンドウ群の影響は計算に入れない)。ウィンドウがクライアント・クリップ領域もしくはクライアント境界領域を持っている場合、有効クリップ領域は、デフォルト・クリップ領域と(もし存在すれば)クライアント・クリップ領域と(もし存在すれば)クライアント境界領域との共通部分(３つが重なる領域)となる。ウィンドウがクライアント・クリップ領域もクライアント境界領域も持っていない場合、有効クリップ領域はデフォルト・クリップ領域と等しくなる。

effective input region(有効入力領域)

  スクリーン上のウィンドウの、ポインタを「含む」(“contain”)ことができる部分の実際の形状である(重なっているウィンドウ群の影響は計算に入れない)。ウィンドウがクライアント入力領域もしくはクライアント境界領域を持っている場合、有効入力領域は、デフォルト入力領域と(もし存在すれば)クライアント入力領域と(もし存在すれば)クライアント境界領域との共通部分(３つが重なる領域)となる。ウィンドウがクライアント入力領域もクライアント境界領域も持っていない場合、有効入力領域はデフォルト入力領域と等しくなる。(訳註：ポインタの「contain」については、X Window System Protocol の「Containment」のところに記述がある。)

入り口に戻る