Xfixes

XFixesQueryExtension拡張機能の情報を取得
XFixesQueryVersion拡張機能のバージョンを取得
ver 1.0
XFixesChangeSaveSetXChangeSaveSet の拡張版
XFixesSelectSelectionInputセレクションの所有権に関するイベントを選択する
XFixesSelectionNotifyセレクションの所有者が変わった時のイベント
XFixesSelectCursorInputカーソルが変更された時のイベントを選択
XFixesCursorNotifyカーソルが変更された時のイベント
XFixesGetCursorImage現在のカーソルの画像を返す
ver 2.0
XFixesDestroyRegionRegion を破棄
XFixesCreateRegion複数の矩形から Region を作成
XFixesCreateRegionFromBitmap1bit Pixmap から Region を作成
XFixesCreateRegionFromWindowウィンドウから Region を作成
XFixesCreateRegionFromGCGC のクリップから Region を作成
XFixesCreateRegionFromPicturePicture から Region を作成
XFixesSetRegion既存の Region を、複数の矩形領域に置き換え
XFixesCopyRegionRegion のコピー
XFixesUnionRegionRegion を結合してセット
XFixesIntersectRegionRegion を結合したものを追加
XFixesSubtractRegionRegion を結合した領域を削除
XFixesInvertRegion矩形範囲から Regin を除外してセット
XFixesTranslateRegion相対移動
XFixesRegionExtentssrc の矩形領域をセット
XFixesFetchRegion領域を矩形のリストで返す
XFixesFetchRegionAndBounds指定矩形内の領域を矩形のリストで返す
XFixesSetGCClipRegionRegion を GC のクリップマスクにセット
XFixesSetWindowShapeRegionRegion を XShape の領域としてセット
XFixesSetPictureClipRegionRegion を Picture のクリップマスクにセット
XFixesSetCursorNameカーソルに名前を付ける
XFixesGetCursorNameカーソルの名前を取得
XFixesChangeCursorカーソルに対するすべての参照を、別のカーソルに置き換え
XFixesChangeCursorByName指定名のカーソルすべてを、別のカーソルに置き換え
ver 3.0
XFixesExpandRegionRegion を指定ピクセル分拡張してセット
ver 4.0
XFixesHideCursorカーソルを非表示にする
XFixesShowCursorカーソルを表示する
ver 5.0
XFixesCreatePointerBarrierポインタバリアを作成
XFixesDestroyPointerBarrierポインタバリアを破棄
ver 6.0
XFixesSetClientDisconnectModeクライアントの切断時のモードをセット
XFixesGetClientDisconnectModeクライアントの切断時のモードを取得
#include <X11/extensions/Xfixes.h>
-lXfixes
[pkgconfig] xfixes
Bool XFixesQueryExtension(Display *dpy, int *event_base_return, int *error_base_return);
拡張機能の情報を取得
Status XFixesQueryVersion(Display *dpy, int *major_version_return, int *minor_version_return);
拡張機能のバージョンを取得
major_version_return,minor_version_return
サーバーで使用できるバージョンが返る。
戻り値
拡張機能がサポートされている場合、True。
ver 1.0
void XFixesChangeSaveSet(Display *dpy, Window win, int mode, int target, int map);
XChangeSaveSet の拡張版です。

あるアプリケーションを別のアプリケーションに埋め込むと、単一のフレームワーク内で。異種のドキュメントとビューを統合する方法が提供されます。
X プロトコルの観点から見ると、これは入れ子になったウィンドウマネージャーに似ています。
埋め込みアプリケーションは、ウィンドウマネージャーがトップレベルウィンドウに対して行うのと同じように、埋め込みウィンドウを「管理」します。
埋め込みアプリケーションの失敗から、埋め込みアプリケーションを保護するには、埋め込みアプリケーションの失敗によって、埋め込みウィンドウが破棄されずに保存されるように、コアの SaveSet メカニズムを使用するのが合理的です。

コア SaveSet メカニズムは、各 save_set メンバー ウィンドウのターゲットを、終了クライアントが所有していない、最も近い囲みウィンドウとして定義します。
埋め込みアプリケーションの場合、この最も近いウィンドウは通常、ウィンドウマネージャー フレームです。
ここでの問題は、ウィンドウマネージャは通常、save-set メカニズムによってそのウィンドウ内に表示される新しいウィンドウを受信して正しく管理することを期待しておらず、代わりにクライアントウィンドウの破棄に応答して、フレームウィンドウを破棄することです。これにより、埋め込まれたウィンドウが破壊されます。

この問題を簡単に解決するには、save-set メンバーのターゲットを、基になるウィンドウの破壊の影響を受けないウィンドウに変更します。
XFIXES はルート ウィンドウをターゲットとして選択します。

埋め込みウィンドウがトップレベルに突然表示されるとユーザーが混乱する可能性があるため、XFIXES では、無条件にウィンドウをマップするのではなく、save-set 処理後にウィンドウをマップ解除するかどうかを、クライアントが選択できるようにします。
mode
SetModeInsert : save-set に挿入
SetModeDelete : save-set から削除
target
SaveSetNearest : 最も近い、このクライアント以外で作成されたウィンドウに親化する。
SaveSetRoot : ルートウィンドウに親化する。
map
SaveSetMap, SaveSetUnmap
void XFixesSelectSelectionInput(Display *dpy, Window win, Atom selection, unsigned long eventMask);
セレクションの所有権に関する、さまざまな原因が発生したときに、ウィンドウに配信されるイベントを選択します。
イベントタイプは、event_base + XFixesSelectionNotify。
eventMask
選択するイベントのマスク。各サブタイプ別に分かれている。
XFixesSetSelectionOwnerNotifyMask: subtype = XFixesSetSelectionOwnerNotify
XFixesSelectionWindowDestroyNotifyMask: subtype = XFixesSelectionWindowDestroyNotify
XFixesSelectionClientCloseNotifyMask: subtype = XFixesSelectionClientCloseNotify
typedef struct {
    int type;
    unsigned long serial;
    Bool send_event;
    Display *display;
    Window window;
    int subtype;
    Window owner;
    Atom selection;
    Time timestamp;
    Time selection_timestamp;
} XFixesSelectionNotifyEvent;
セレクションの所有者が変わった時のイベント
subtype
セレクションの所有権が変更した原因。
XFixesSetSelectionOwnerNotify : XSetSelectionOwner() によって所有権が変化した
XFixesSelectionWindowDestroyNotify : ウィンドウが削除された
XFixesSelectionClientCloseNotify : クライアントの接続が閉じられた
owner
現在のセレクションの所有者、または None
timestamp
イベントが生成された時間
selection_timestamp
セレクションを所有するために使用されたタイムスタンプ
void XFixesSelectCursorInput(Display *dpy, Window win, unsigned long eventMask);
カーソルが変更された時のイベントを選択する。
イベントタイプは、event_base + XFixesCursorNotify。

イベントは、発生したスクリーンに関係なく配信されます。

XInput 拡張機能の ver 2.0 以降をサポートするサーバーは、ClientPointer のカーソル変更イベントのみをクライアントに通知し、他のマスターポインターは通知しません (XI2 プロトコル仕様のセクション 4.4 を参照)。

現在のカーソル画像を除く、画面内容のミラーリングは、コアプロトコルまたは VNC アドオンを使用して、簡単に実行できます。
コアプロトコルを使用して、現在表示されているカーソルイメージを検出する方法はありません。
カーソルイメージには、ユーザーインターフェイスに関する、重要な意味的なコンテンツが含まれることがよくあります。
XFIXES は、カーソルイメージがいつ変更されたかを検出し、現在のカーソルイメージを取得する簡単なメカニズムを提供します。

現在のカーソルには、XID が関連付けられている場合と、関連付けられていない場合があるため、使用できる安定した名前はありません。
代わりに、XFIXES は現在のカーソルのイメージのみを返し、カーソルイメージを識別する方法を提供して、以前に表示されたカーソルに変更されるたびに、イメージを再取得することを回避します。
eventMask
XFixesDisplayCursorNotifyMask
typedef struct {
    int type;
    unsigned long serial;
    Bool send_event;
    Display *display;
    Window window;
    int subtype;
    unsigned long cursor_serial;
    Time timestamp;
    Atom cursor_name; //ver 2.0
} XFixesCursorNotifyEvent;
カーソルが変更された時のイベント
subtype
カーソル画像の変化の原因。
XFixesDisplayCursorNotify
cursor_serial
カーソル画像に割り当てられた、画像を識別する番号。
シリアル番号が異なるカーソルでは、イメージが異なる場合があります。
timestamp
カーソルが変更された時刻
cursor_name
カーソル名の Atom (ver 2.0)
XFixesCursorImage *XFixesGetCursorImage(Display *dpy);

typedef struct {
    short x, y;
    unsigned short  width, height;
    unsigned short  xhot, yhot;
    unsigned long   cursor_serial;
    unsigned long   *pixels;
#if XFIXES_MAJOR >= 2
    Atom atom;
    const char *name;
#endif
} XFixesCursorImage;
現在のカーソルの画像を返す
戻り値
XFree() で解放する。

x,y現在のカーソル位置
width,heightカーソル画像のサイズ
xhot,yhotホットスポット位置
cursor_serialこのカーソル画像に割り当てられた番号。
このカーソル画像が将来再表示される場合、この同じシリアル番号が XFixesCursorNotify イベントで報告されます。
pixelsカーソル画像。
1px あたり 32bit。最上位ビットから順に、A,R,G,B の各 8bit。
アルファ値が事前に乗算される。
ver 2.0
void XFixesDestroyRegion(Display *dpy, XserverRegion region);
Region を破棄
XserverRegion XFixesCreateRegion(Display *dpy, XRectangle *rectangles, int nrectangles);
指定された四角形のリストで初期化された領域を作成します。
長方形は任意の順序で指定でき、それらを結合したものが領域になります。

コアプロトコルの場合、四角形の順序を指定できますが、順序情報を単に無視して四角形を結合するのと同じくらい、四角形が実際にその順序になっているかどうかを確認するのが難しいことがわかります。
したがって、このリクエストには順序情報が不要になります。
XserverRegion XFixesCreateRegionFromBitmap(Display *dpy, Pixmap bitmap);
depth = 1 の Pixmap から、ピクセルが 1 にセットされた部分の領域を作成する。
XserverRegion XFixesCreateRegionFromWindow(Display *dpy, Window window, int kind);
指定されたウィンドウ領域で初期化された領域を作成します。
境界領域とクリップ領域の定義については、Shape 拡張機能を参照してください。
kind
WindowRegionBounding, WindowRegionClip
XserverRegion XFixesCreateRegionFromGC(Display *dpy, GC gc);
指定された GContext のクリップリストから初期化された領域を作成します。
XserverRegion XFixesCreateRegionFromPicture(Display *dpy, XID picture);
指定された Picture のクリップリストから初期化された領域を作成します。
(Xrender 拡張機能)
void XFixesSetRegion(Display *dpy, XserverRegion region, XRectangle *rectangles, int nrectangles);
region の現在の内容を、複数の矩形の結合によって形成された領域に置き換える。
void XFixesCopyRegion(Display *dpy, XserverRegion dst, XserverRegion src);
dst を src の内容に置き換える。
void XFixesUnionRegion(Display *dpy, XserverRegion dst, XserverRegion src1, XserverRegion src2);
src1 と src2 を結合し、結果を dst にセットする。
dst は、src1 または src2 と同じにすることができます。
void XFixesIntersectRegion(Display *dpy, XserverRegion dst, XserverRegion src1, XserverRegion src2);
src1 と src2 を結合し、dst に領域を追加する。
void XFixesSubtractRegion(Display *dpy, XserverRegion dst, XserverRegion src1, XserverRegion src2);
dst から、src1 と src2 を結合した領域を削除。
void XFixesInvertRegion(Display *dpy, XserverRegion dst, XRectangle *rect, XserverRegion src);
rect の範囲から src を除外して dst にセット
void XFixesTranslateRegion(Display *dpy, XserverRegion region, int dx, int dy);
領域を相対移動する。
void XFixesRegionExtents(Display *dpy, XserverRegion dst, XserverRegion src);
src の矩形領域をセット
XRectangle *XFixesFetchRegion(Display *dpy, XserverRegion region, int *nrectanglesRet);
領域は、YX バンド順の四角形のリストとして返されます。
XRectangle *XFixesFetchRegionAndBounds(Display *dpy, XserverRegion region, int *nrectanglesRet, XRectangle *bounds);
指定矩形内の領域を矩形のリストで返す
void XFixesSetGCClipRegion(Display *dpy, GC gc, int clip_x_origin, int clip_y_origin, XserverRegion region);
GC のクリップマスクを、指定された領域に変更し、クリップの原点を設定します。
出力は領域内に収まるようにクリップされます。
クリップの原点は、グラフィックス リクエストで指定された、出力先ドローアブルの原点を基準として解釈されます。
領域はクリップの原点を基準として解釈されます。
region に対する今後の変更は、GC クリップマスクには影響しません。
void XFixesSetWindowShapeRegion(Display *dpy, Window win, int shape_kind, int x_off, int y_off, XserverRegion region);
指定されたウィンドウの Shape 拡張機能による領域を、region の領域に設定します。
今後 region を変更しても、ウィンドウの形状には影響しません。
void XFixesSetPictureClipRegion(Display *dpy, XID picture, int clip_x_origin, int clip_y_origin, XserverRegion region);
Picture (Xrender 拡張機能) のクリップマスクを、指定された領域に変更し、クリップの原点を設定します。
入力と出力は、領域内に収まるようにクリップされます。
クリップの原点は、Picture に関連付けられたドローアブルの原点を基準として解釈されます。
領域はクリップの原点を基準として解釈されます。
region に対する将来の変更は、クリップマスクには影響しません。
void XFixesSetCursorName(Display *dpy, Cursor cursor, const char *name);
名前を Atom としてインターンし、その Atom をカーソルの名前として設定します。

カーソルに名前を付けると、抽象的な意味論的な内容を、特定のカーソル画像に関連付けることができます。
これらの名前をアプリケーションに反映させることで、非視覚的な手段を通じて、セマンティックコンテンツをユーザーに関連付けることができます。
const char *XFixesGetCursorName(Display *dpy, Cursor cursor, Atom *atom);
カーソルの名前と Atom を返します。
名前が設定されていない場合、atom は None になり、name は空になります。
void XFixesChangeCursor(Display *dpy, Cursor source, Cursor destination);
destination に対するすべての参照を、source への参照に置き換えます。
destination のカーソルを使用すると、source のカーソルイメージが表示されるようになります。
void XFixesChangeCursorByName(Display *dpy, Cursor source, const char *name);
指定された名前を持つすべてのカーソルの内容を、source カーソルに置き換えます。
ver 3.0
void XFixesExpandRegion(Display *dpy, XserverRegion dst, XserverRegion src, unsigned left, unsigned right, unsigned top, unsigned bottom);
src 領域内の各四角形を、指定されたピクセル数だけ上下左右に拡張することによって、指定された領域を含む dst 領域を作成します。
ver 4.0
void XFixesHideCursor(Display *dpy, Window win);
指定されたウィンドウ、または、その子ウィンドウの 1 つの中に、カーソルがあるとき、カーソル画像を非表示にする。
1 つ以上のアクティブなクライアントがカーソルの非表示を要求したウィンドウ内にスプライトがある場合、カーソルイメージは表示されません。

カーソルを非表示にすると、カーソル画像が見えなくなりますが、CursorNotify イベントは、カーソル画像が表示されているかのように、通常どおり送信されることに注意してください。

グラブ中に、1 つ以上のアクティブなクライアントが、グラブウィンドウまたはその先祖の 1 つに対して、カーソルの非表示を要求した場合、グラブカーソルのカーソルイメージは、そのグラブの有効期間中は表示されません。

未解決の HideCursor リクエストを持つクライアントが接続を終了すると、これらのリクエストは削除されます。

XInput 拡張機能 ver 2.0 以降をサポートするサーバーは、HideCursor リクエストに応答して、表示されているすべてのカーソルを非表示にします。
カーソルが非表示のときにマスターポインターを作成すると、このマスターポインターのカーソルも非表示になります。
void XFixesShowCursor(Display *dpy, Window win);
指定されたウィンドウ、または、その子ウィンドウの 1 つの中にカーソルがあるときに、カーソル画像を表示する。
アクティブなクライアントがカーソルの非表示を要求していないウィンドウ内にカーソルがある場合は、そのウィンドウのカーソル画像が表示されます。
つまり、クライアントが指定されたウィンドウまたはウィンドウサブツリーに対して HideCursor を呼び出した場合、このリクエストは HideCursor リクエストの効果を逆転させます。

クライアントが未処理の HideCursor リクエストを行っていない場合は、BadMatch エラーが生成されます。

XInput ver 2.0 以降をサポートするサーバーは、ShowCursor リクエストに応答して、表示されているすべてのカーソルを表示します。
ver 5.0
PointerBarrier XFixesCreatePointerBarrier(Display *dpy, Window w,
    int x1, int y1, int x2, int y2, int directions, int num_devices, int *devices);
指定されたドローアブルに関連付けられたスクリーン上の、指定された座標で指定された線に沿って、ポインターバリアを作成します。
バリアには空間的な広がりはありません。これは、指定されたピクセルの左端または上端に沿った、単なる線です。
バリア座標はスクリーン空間内にあります。

座標は、x1 == x2 または y1 == y2 のいずれかの軸に揃える必要がありますが、両方を揃えることはできません。
さまざまな座標は任意の順序で指定できます。
x1 == x2 の場合、y1 > y2 または y1 < y2 のいずれかが有効です。
座標が有効でない場合は、BadValue が生成されます。

合成マネージャーとデスクトップ環境には、単一ディスプレイの場合、フィッツの法則に従って簡単なターゲット (たとえば、左上隅) に対応するように、特定の画面位置に UI 要素が含まれる場合があります。
マルチヘッド環境の場合、これらのコーナーは依然として半不浸透性である必要があります。
ポインタバリアを使用すると、アプリケーションはカーソルの動きに追加の制約を定義できるため、複数のディスプレイがある場合でも、これらの領域が期待どおりに動作します。

タッチスクリーンのような絶対位置決めデバイスは、ポインタバリアに従いません。
タッチスクリーンではすべての点がある意味同じ大きさであるのに対し、相対位置決めデバイスでは、エッジとコーナーが無限に大きいため、ターゲットを取得することには何の利点もありません。

WarpPointer および同様のリクエストは、本質的に同じ理由でポインターバリアに従いません。
directions
指定方向へのバリアの通過を許可。
BarrierPositiveX : 正の X 方向への通過を許可。
BarrierPositiveY, BarrierNegativeX, BarrierNegativeY
devies
サーバーが XInput ver 2 以降をサポートしている場合、devices はバリアを適用するマスターデバイスのセットを指定します。
XIAllDevices または XIAllMasterDevices が指定されている場合、バリアはすべてのマスターデバイスに適用されます。
スレーブデバイスに名前が付けられている場合は、BadDevice が生成されます。
これは、XIAllDevices によって暗黙的に指定されたスレーブデバイスには適用されません。
デバイスに複数回名前を付けることは合法であり、デバイスに 1 回だけ名前が付けられたものとして扱われます。
デバイスが削除された場合、バリアは残りのデバイスに引き続き適用されますが、削除されたデバイスと同じ ID を持つ今後のデバイスには適用されません。
一致するデバイスがすべて削除されても、特別なことは何も起こりません。
バリアは明示的に破壊する必要があります。
void XFixesDestroyPointerBarrier(Display *dpy, PointerBarrier b);
ポインタバリアを破棄
ver 6.0
void XFixesSetClientDisconnectMode(Display *dpy, int disconnect_mode);
クライアントの切断時のモードをセットする。

オンデマンドで起動される X サーバー (Xwayland) は、理想的には、最後のクライアントが切断されたときに終了する必要があります。
ただし、システムサービスを提供する一部の X11 クライアントは永久に残るため、シャットダウンを妨げます。

クライアントは自分自身を終了対象として指定でき、X サーバーは残りのクライアントの数を数えるときに、それらのクライアントを無視できます。
他にクライアントが残っていない場合は、サーバーをシャットダウンできます。
disconnect_mode
XFixesClientDisconnectFlagDefault : デフォルト
XFixesClientDisconnectFlagTerminate : サーバーはこのクライアントを切断してシャットダウンする可能性があります
int XFixesGetClientDisconnectMode(Display *dpy);
クライアントの切断時のモードを取得