SHAPE 拡張機能

kind領域の種類
op領域の結合方法
ordering矩形リストの順番
関数
XShapeQueryExtension拡張機能の情報を取得
XShapeQueryVersion拡張機能のバージョンを取得
XShapeCombineRegionRegion の領域を結合
XShapeCombineRectangles矩形リストを領域に結合
XShapeCombineMask1bit Pixmap の領域を結合
XShapeCombineShapeウィンドウの領域と結合
XShapeOffsetShape領域をオフセット移動
XShapeQueryExtents現在の領域を取得
XShapeSelectInput拡張機能のイベントマスクを選択
XShapeInputSelected拡張機能のイベントマスクを取得
XShapeGetRectangles現在の領域の矩形リストを取得
イベント
ShapeNotifyShapeNotify イベント
#include <X11/extensions/shape.h>
-lXext
#define ShapeBounding 0
#define ShapeClip     1
#define ShapeInput    2
形状のないウィンドウの場合、ウィンドウのサイズが 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
ShapeBounding
[境界領域] 親ウィンドウ内で、そのウィンドウが占めている領域 (境界線を含む)。
この範囲外は、他のウィンドウが表示される部分となる。
ShapeClip
[クリップ領域] 境界領域のサブセット。子ウィンドウが表示される領域、また、グラフィックスで描画できる領域。
境界領域内であり、クリップ領域外の範囲は、ウィンドウの境界線の領域となる。
ShapeInput
[入力領域] 境界領域のサブセット。ポインタがこの領域にある場合、そのウィンドウ上にあるものとする。
#define ShapeSet        0
#define ShapeUnion      1
#define ShapeIntersect  2
#define ShapeSubtract   3
#define ShapeInvert     4
領域の結合方法
ShapeSet
src が、そのまま新しいリージョンとして保存される
ShapeUnion
src と dst が結合されて、新しいリージョンが生成される
ShapeIntersect
src と dst の両方に含まれる領域が生成される
ShapeSubtract
dst から src の領域を削除して生成される
ShapeInvert
src から dst の領域を削除して生成される
<X11/X.h>
#define Unsorted  0
#define YSorted   1
#define YXSorted  2
#define YXBanded  3
矩形リストの順番
Unsorted
任意の順番
YSorted
Y 位置が小さい順
YXSorted
X と Y 位置が小さい順
YXBanded
YXSorted に加えて、すべての Y 走査線において、その走査線を含んでいるすべての矩形が、同一の Y 位置と範囲を持つ
関数
Bool XShapeQueryExtension(Display *display, int *event_base, int *error_base);
拡張機能の情報を取得
event_base
イベントタイプのベース値が返る
error_base
エラータイプのベース値が返る
戻り値
拡張機能がサポートされている場合、True
Status XShapeQueryVersion(Display *display, int *major_version, int *minor_version);
拡張機能のバージョンを取得
major_version,minor_version
サポートされているバージョンが返る。現在は最大で 1.1。
戻り値
拡張機能がサポートされている場合、0 以外
void XShapeCombineRegion(Display *display, Window dest, int dest_kind, int x_off, int y_off, Region region, int op);
Region を複数の矩形リストに変換した後、XShapeCombineRectangles を呼び出して、指定ウィンドウの指定領域に結合します。
x_off,y_off
結合先のオフセット位置
void XShapeCombineRectangles(Display *display, Window dest, int dest_kind, int x_off, int y_off,
    XRectangle *rectangles, int n_rects, int op, int ordering);
指定ウィンドウの指定領域に、矩形リストで示された領域を結合する。
矩形リストを空に指定すると、空の領域を設定できる。
x_off,y_off
結合先のオフセット位置
rectangles
矩形の配列
n_rects
矩形の数
op
結合タイプ
ordering
矩形リストの順序関係。
この指定により、サーバーの動作が高速化される可能性があります。

間違った順序が指定された場合、サーバーは Match エラーを生成する可能性がありますが、必ずしもそうする必要はありません。
エラーが生成されない場合、グラフィックスの結果は未定義になります。

Unsorted 以外は、各矩形が交差していない必要があり、交差している場合は、結果の領域は未定義になります。
XShapeCombineMask(Display *display, Window dest, int dest_kind, int x_off, int y_off, Pixmap src, int op);
指定ウィンドウに、Pixmap (1bit) の領域を結合する。

有効な Pixmap が指定されている場合、ビットが 1 の部分は領域に含まれ、ビットが 0 の部分は領域に含まれない。

src と dest ウィンドウは、同じスクリーン上に作成されている必要があります。そうでない場合は、Match エラーが発生します。
src
深さ 1bit の Pixmap、または None。

None の場合、kind で指定された領域がウィンドウから削除され、デフォルトの領域に戻ります。
このリクエストによって生成された ShapeNotify イベントと、後続の XShapeQueryExtents 関数は、クライアント形状が指定されていないことを報告します。
XShapeCombineShape(Display *display, Window dest, int dest_kind, int x_off, int y_off, Window src, int src_kind, int op);
src ウィンドウのクライアント領域を、x_off, y_off 分オフセット移動し、dest ウィンドウのクライアント領域と結合します。
src と dest ウィンドウは同じスクリーン上にある必要があります。そうでない場合は、Match エラーが発生します。
void XShapeOffsetShape(Display *display, Window dest, int dest_kind, int x_off, int y_off);
クライアント領域を、指定オフセットの量だけ移動します。
Status XShapeQueryExtents(Display *display, Window window,
    Bool *bounding_shaped, int *x_bounding, int *y_bounding, unsigned int *w_bounding, unsigned int *h_bounding,
    Bool *clip_shaped, int *x_clip, int *y_clip, unsigned int *w_clip, unsigned int *h_clip);
ウィンドウの現在の各領域を、矩形で取得する。
領域が指定されていない場合は、デフォルト領域が使用されます。
bounding_shaped
境界領域が指定されているかが返る
{x,y,w,h}_bounding
境界領域の範囲を返す
clip_shaped
クリップ領域が指定されているかが返る
{x,y,w,h}_clip
クリップ領域の範囲を返す
戻り値
拡張機能がサポートされていれば、0 以外が返る
void XShapeSelectInput(Display *display, Window window, unsigned long mask);
拡張機能のイベントマスクを選択
mask
指定できるのは、ShapeNotifyMask のみ。
unsigned long XShapeInputSelected(Display *display, Window window);
拡張機能のイベントマスクを取得
戻り値
ウィンドウで ShapeNotifyMask が選択されている場合は、ShapeNotifyMask。それ以外の場合は 0 を返します。
拡張機能がサポートされていない場合は、0 を返します。
XRectangle *XShapeGetRectangles(Display *display, Window window, int kind, int *count, int *ordering);
現在の領域の矩形リストを取得
count
矩形の個数が返る
ordering
矩形リストの順序が返る
戻り値
kind で指定された領域を示す、矩形リストを返します。XFree() で解放します。
拡張機能がサポートされていない場合、NULL を返します。
イベント
typedef struct {
    int    type;
    unsigned long serial;
    Bool send_event;
    Display *display;
    Window window;
    int kind;
    int x, y;
    unsigned width, height;
    Time time;
    Bool shaped;
} XShapeEvent;
各領域が変更されるたびに、ShapeNotify イベントが送信されます。
kind
変更された領域の種類。ShapeBounding or ShapeClip
x,y,width,height
新しい領域の範囲
time
領域が変更された時のタイムスタンプ
shaped
形状が存在する場合 True