wl_subcompositor

wl_subcompositor (ver 1)
wl_subcompositor_destroy破棄
wl_subcompositor_get_subsurfacewl_subsurface の作成
wl_subsurface
wl_subsurface_destroy破棄
wl_subsurface_set_position位置を変更する
wl_subsurface_place_aboveスタックを上に移動
wl_subsurface_place_belowスタックを下に移動
wl_subsurface_set_sync同期モードに変更
wl_subsurface_set_desync非同期モードに変更
サブサーフェスは、親の領域でクリッピングされないため、親の範囲を超える部分は、はみ出して表示される。

サブサーフェスは、wl_buffer がセットされて、親サーフェスが表示されると、表示される。
どちらが先に発生するかの順序は関係ない。
親が非表示になるか、wl_buffer = NULL が適用されると、非表示になる。
これらのルールは、サーフェスのツリー構造によって、再帰的に適用される。

同期モードは、ツリー構造によって、同じモードが子孫に適用される。

サブサーフェスは、キーボードフォーカスを持たない。
wl_surface_offset() は無視される。
wl_subcompositor (ver 1)
void wl_subcompositor_destroy(struct wl_subcompositor *wl_subcompositor);
クライアントがこのオブジェクトを今後使用しないことをサーバーに通知する。
wl_subsurface オブジェクトを含む他のオブジェクトには影響しない。
struct wl_subsurface *wl_subcompositor_get_subsurface(
    struct wl_subcompositor *wl_subcompositor, struct wl_surface *surface, struct wl_surface *parent);
wl_surface のサブサーフェスを作成し、指定された親サーフェスに関連付ける。
これにより、プレーンな wl_surface がサブサーフェスになる。

surface には、別のロールがすでに存在してはならず、既存の wl_subsurface オブジェクトも存在してはならない。
親サーフェスは、子サーフェスの子孫であってはならない。また、親は子サーフェスと異なる必要がある。

サブサーフェスを親に追加する操作は、親で wl_surface_commit() が実行された時に適用される。
surface
サブサーフェスにする wl_surface
parent
親サーフェス
wl_subsurface
void wl_subsurface_destroy(struct wl_subsurface *wl_subsurface);
サブサーフェスの破棄。
親への関連付けは削除され、サーフェスは直ちに非表示になる。

親サーフェスの更新と削除を同期させる必要がある場合、まず wl_buffer = NULL をアタッチしてサブサーフェスを非表示にし、親を更新してから、サブサーフェスを破棄する。
void wl_subsurface_set_position(struct wl_subsurface *wl_subsurface, int32_t x, int32_t y);
位置を変更する。
座標は、親サーフェスの状態が適用されるたびに有効になる。

親サーフェスの commit 前に、複数回呼び出された場合、新しい位置は常に、以前の位置に置き換えられる。
初期位置は 0, 0。
x,y
親の座標。親の領域内に限定されず、負の値も許可される。
void wl_subsurface_place_above(struct wl_subsurface *wl_subsurface, struct wl_surface *sibling);
このサブサーフェスは、sibling のすぐ上に配置され、Z 順序が変更される。

Z 順序はダブルバッファリングされる。
リクエストは順番に処理され、すぐに保留状態に適用される。
最終的な保留状態は、親サーフェスの状態が次に適用されるときに、アクティブ状態にコピーされる。

新しいサブサーフェスは、最初は、兄弟および親のスタックの最上位として追加される。
sibling
兄弟サーフェスの1つ、または親サーフェスであること。
親の場合は、親のすぐ上になる (兄弟の中で最上位になるわけではない)。
void wl_subsurface_place_below(struct wl_subsurface *wl_subsurface, struct wl_surface *sibling);
スタックを下に移動
sibling
兄弟サーフェスの1つ、または親サーフェス。
親の場合は、親のすぐ下となり、親の背面となる。
void wl_subsurface_set_sync(struct wl_subsurface *wl_subsurface);
サブサーフェスの commit 動作を、同期モード (親依存モードとも呼ばれる) に変更する。
デフォルトは同期モード。

同期モードでは、サブサーフェスの wl_surface_commit() では出力に適用されず、状態がキャッシュされ、親サーフェスの状態が適用された時に、サブサーフェスのキャッシュが適用される。
これにより、親とそのすべての同期されたサブサーフェスのアトミック更新が保証される。
キャッシュが適用されると、キャッシュが無効になるため、それ以降の親サーフェスの commit では、古い状態が (再) 適用されない。
void wl_subsurface_set_desync(struct wl_subsurface *wl_subsurface);
サブサーフェスの commit 動作を、非同期モード (独立モードまたは自由実行モードとも呼ばれる) に変更する。

非同期モードでは、サブサーフェスの wl_surface_commit() は、キャッシュされずに直接適用する。
親サーフェスで commit しても、サブサーフェスの状態には影響しない。
このモードでは、サブサーフェスを独自に更新できる。

非同期モードで commit が呼び出されたときに、キャッシュが存在する場合、保留状態がキャッシュに追加され、全体に適用される。
これにより、キャッシュが無効になる。

※サブサーフェスが非同期に設定されている場合でも、親サブサーフェスは、それを上書きして、同期として動作する場合がある。

親サーフェスが非同期として動作する場合、キャッシュされた状態は set_desync に適用される。