原文はこちら。
翻訳にあたって、オープンソースグループ・ジャパンの MIT ライセンスの訳、aznote のSHAPE拡張に関する記事、及び一瀬亮の非矩形のウィンドウに関する記事を参考にした。
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)ウィンドウは、3次元の錯覚を作り出すために「drop shadow」を表示したいと考えるであろう。また別の例を挙げると、ユーザ・インタフェイスの様式(style guide)の中には、角の丸いボタンを必要とするものもある。特にイベントの配送やカーソルの形状が絡む場面で、四角くない形状を完全に実現することは、核となる X プロトコルのみでは不可能である。最後の例は丸い時計と四角くないアイコンであり、これはデスクトップの視覚的付加物として欠かせないものである。
この拡張は次の機構を提供する。即ち、ウィンドウの視覚的な形状と入出力領域の形状の両方を任意の、場合によっては繋がっていない、非矩形の形に変更する機構を提供する。この拡張の狙いは既存の機能(semantics)を補うことであって、これを置き換えることではない。とりわけ、この拡張を認識しないクライアントであっても形状変更されたウィンドウに適切に対処できるのが望ましい。例えば、ウィンドウ・マネージャは、矩形の要素を単位としてスクリーン上の実際の配置を交渉できるべきである。この目的を達成するために、あるウィンドウに与えられた形状は、X プロトコルのウィンドウ・ジオメトリによって定まる矩形であって且つ同ウィンドウの境界を構成するものによって、(周囲を)切り取られる。クライアント・プログラムはウィンドウ・マネージャが用意した領域の範囲まで自身の形状を広げられる、という規約を定めるのが望ましい。
各ウィンドウは(形状が設定されてない時でも)次の3つの領域で構成される。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
この拡張においては、クライアントは、デフォルト領域と掛け合わせて使用する新たな領域を指定することで、境界領域、クリップ領域、入力領域を変更することができる(3つとも変更しても良いし、変更しないものがあっても良い。)。これによって生じる新たな領域を「クライアント境界領域」(client bounding region)、「クライアント・クリップ領域」(client clip region)、「クライアント入力領域」(client input region)と呼ぶ。これらは、ウィンドウの原点からの相対座標で設定され、常にオフセット(offset)の分だけウィンドウの原点から移動した状態で構成される(つまり、ウィンドウが移動しても領域の調整は必要ない)。領域を設定するための手段は3つある。1つは矩形のリスト(訳註:基本的には配列)、1つはビットマップ、もう1つはウィンドウの既存の境界領域やクリップ領域である。これは X プロトコルのグラフィクス・コンテクストの領域に関する規定を元にしたものであり、この手法のおかげでこの拡張がさまざまな用途に使えるようになる。
ウィンドウの既存の形状を演算対象(オペランド)として用いて新たな形状を設定する場合、クライアント領域を使用する。但し、未だクライアント領域が設定されてない場合は例外で、この場合には代わりにデフォルト領域を使用する。
ウィンドウの「有効境界領域」(effective bounding region)は、クライアント境界領域とデフォルト境界領域の共通部分(共通集合)によって構成する。クライアント境界領域の一部であってデフォルト境界領域に含まれない部分は全て、スクリーン上の有効境界領域には含まれない。これは次のことを意味する。即ち、矩形のクライアント・ウィンドウを扱ってきたウィンドウ・マネージャ(あるいは他のジオメトリ・マネージャ)は、今後もクライアントをスクリーンの矩形領域に押し込めることができることを意味する。(訳註:デフォルト境界領域は定義上、常に矩形であるため。)
有効境界領域の構築は動的に行われる。クライアント境界領域そのものが変化して有効境界領域になるわけではない。クライアント境界領域が現在のデフォルト境界領域の範囲をからはみ出すように設定されている場合、後ほどウィンドウが拡大されると、有効境界領域は拡大されてクライアント境界領域をより多く含むようになる。
ウィンドウの「有効クリップ領域」(effective clip region)は、クライアント・クリップ領域とデフォルト・クリップ領域とクライアント境界領域の3つの共通部分で構成される。クライアント・クリップ領域の一部であって、デフォルト・クリップ領域とクライアント境界領域の両方に含まれていない部分は全て、スクリーン上の有効クリップ領域には含まれない。
有効クリップ領域の構築は動的に行われる。クライアント・クリップ領域そのものが変化して有効クリップ領域になるわけではない。クライアント・クリップ領域が現在のデフォルト・クリップ領域の範囲からはみ出すように設定されている場合、後ほどウィンドウやその境界領域が拡大すると、有効クリップ領域は拡大されてクライアント・クリップ領域(有効境界領域に含まれる部分に限る)をより多く含むようになる。
ウィンドウのボーダ(枠)は、有効境界領域と有効クリップ領域の差で構成される。この領域が存在しなければ、ボーダは一切表示されない。この領域が存在する場合、ボーダは、X プロトコルの規定通りにウィンドウの border-tile もしくは border-pixel を用いて塗りつぶされる。ゼロではない幅のボーダを持つウィンドウであっても、ウィンドウのデフォルト・クリップ領域の範囲外に描画することはできないことに注意。また、ボーダの幅がゼロであってもウィンドウはボーダを持つことができることにも注意。この場合でもクリップ形状を境界形状より小さく作ることは可能であるため。
ウィンドウと、全ての下位ウィンドウの可視領域とへ向かう出力は全て、有効クリップ領域の範囲に(周囲を)切り取られる。X サーバは、ウィンドウの内容の中の有効境界領域からはみ出した部分を控えの記憶領域(backing store)に保持してはならない。ウィンドウの原点(の位置)(グラフィクスの操作、背景のタイル描画、及び下位ウィンドウの配置にあたっての原点)は、境界領域やクリップ領域の存在によっては変化しない。
ウィンドウの「有効入力領域」(effective input region)は、クライアント入力領域とデフォルト入力領域とクライアント境界領域の3つの共通部分で構成される。クライアント入力領域の一部であって、デフォルト入力領域とクライアント境界領域の両方に含まれていない領域は全て、スクリーン上の有効入力領域には含まれない。
有効入力領域の構築は動的に行われる。クライアント入力領域そのものが変化して有効入力領域になるわけではない。クライアント入力領域が現在のデフォルト入力領域からはみ出すように設定されている場合、後ほどウィンドウやその境界領域が拡大すると、有効入力領域は拡大されてクライアント入力領域(有効境界領域に含まれる部分に限る)をより多く含むようになる。
デフォルト境界領域の内部であるが有効境界領域の外部である領域は、ウィンドウの一部にはならない。スクリーンのこうした領域は、他のウィンドウが埋めることになる。入力イベントが起きたのがウィンドウのデフォルト境界領域の内部であり且つ有効境界領域の外部であった場合、同イベントは、あたかもそのウィンドウがイベント発生の位置を覆っていなかったかのような仕方で配送される。ウィンドウの矩形でないボーダの中で発生したイベントは、通常の矩形のボーダの中で発生したイベントと同じように、同ウィンドウに配送される。
InputOnly
のウィンドウには境界領域と入力領域を設定することができる。けれども、InputOnly
のウィンドウにクリップ領域の設定を試みたり、この拡張のリクエストの「source」として同ウィンドウのクリップ領域を指定しようと試みたりすると、Match
エラーとなる。
X サーバは、ルート・ウィンドウのクリップ領域と入力領域に起きた変更を受け入れなければならないが、ルート・ウィンドウの境界領域の変更(requested changesリクエストされた変更)は無視することができる。X サーバが境界領域の変更を受け入れる場合、境界領域の外側のスクリーンの内容は実装依存である。
以下の章では、リクエストとイベントの定義を述べるにあたって、下記の型(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
|
このリクエストでは、領域1つを構成するための矩形の配列を指定する。この矩形の座標は、ウィンドウの原点からのものであり、指定されたオフセット(「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 は、1ビットの深度のピクスマップ、もしくは 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」である。
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(使わない)
親ウィンドウの領域の中、このウィンドウが占める部分。この領域は2つの部分に分かれる。枠(borderボーダ)と内部領域である。
ウィンドウの内部領域であり、境界領域(bounding region)の一部である。この領域は、ウィンドウ(の内容)が消された場合に「ウィンドウの背景」で描画される領域であり、同ウィンドウに対するグラフィクス出力の全てが入る領域であり、そして子ウィンドウ(の描画されない領域)を切り取る(clip)領域である。
境界領域(bounding region)の一部であり、ポインタを含む(contain)ことができる。(訳註:ポインタの「contain」については、X Window System Protocol の「Containment」のところに記述がある。)
X プロトコルでウィンドウ・サイズに関連して説明されている通りの矩形の領域であり、ウィンドウの内部とその枠(ボーダ)を含む。
X プロトコルでウィンドウ・サイズに関連して説明されている通りの矩形領域であり、ウィンドウの内部を含み、枠(ボーダ)は含まない。
X プロトコルでウィンドウ・サイズに関連して説明されている通りの矩形の領域であり、ウィンドウの内部とその枠(ボーダ)を含む。
ウィンドウに結び付けられた領域であり、この拡張が直接変更を加える領域である(変更の際には ShapeBounding
を指定する)。この領域とデフォルト境界領域とを合わせて用いることで、有効境界領域が定まる。
ウィンドウに結び付けられた領域であり、この拡張が直接変更を加える領域である(変更の際には ShapeClip
を指定する)。この領域とデフォルト・クリップ領域とクライアント境界領域とを合わせて用いることで、有効クリップ領域が定まる。
ウィンドウに結び付けられた領域であり、この拡張が直接変更を加える領域である(変更の際には ShapeInput
を指定する)。この領域とデフォルト入力領域とクライアント境界領域とを合わせて用いることで、有効入力領域が定まる。
スクリーン上のウィンドウの実際の形状であり、枠と内部を含む領域(但し、重なっているウィンドウ群の影響は計算に入れない)。ウィンドウがクライアント境界領域を持っている場合、有効境界領域は、デフォルト境界領域とクライアント境界領域の共通部分(重なる領域)となる。ウィンドウがクライアント境界領域を持ってない場合、有効境界領域はデフォルト境界領域と等しくなる。
スクリーン上のウィンドウの内部の実際の形状である(但し、重なっているウィンドウ群の影響は計算に入れない)。ウィンドウがクライアント・クリップ領域もしくはクライアント境界領域を持っている場合、有効クリップ領域は、デフォルト・クリップ領域と(もし存在すれば)クライアント・クリップ領域と(もし存在すれば)クライアント境界領域との共通部分(3つが重なる領域)となる。ウィンドウがクライアント・クリップ領域もクライアント境界領域も持っていない場合、有効クリップ領域はデフォルト・クリップ領域と等しくなる。
スクリーン上のウィンドウの、ポインタを「含む」(“contain”)ことができる部分の実際の形状である(重なっているウィンドウ群の影響は計算に入れない)。ウィンドウがクライアント入力領域もしくはクライアント境界領域を持っている場合、有効入力領域は、デフォルト入力領域と(もし存在すれば)クライアント入力領域と(もし存在すれば)クライアント境界領域との共通部分(3つが重なる領域)となる。ウィンドウがクライアント入力領域もクライアント境界領域も持っていない場合、有効入力領域はデフォルト入力領域と等しくなる。(訳註:ポインタの「contain」については、X Window System Protocol の「Containment」のところに記述がある。)