xdg-shell (ver 6)

xdg_wm_base
struct xdg_wm_base_listenerハンドラ構造体
xdg_wm_base_add_listenerハンドラ設定
xdg_wm_base_destroy破棄
xdg_wm_base_create_positionerxdg_positioner を作成
xdg_wm_base_get_xdg_surfacexdg_surface を作成
xdg_wm_base_pongping に応答
xdg_surface
struct xdg_surface_listenerハンドラ構造体
xdg_surface_add_listenerハンドラ設定
xdg_surface_destroy破棄
xdg_surface_get_toplevelxdg_toplevel の作成
xdg_surface_get_popupxdg_popup の作成
xdg_surface_set_window_geometry実体の範囲をセット
xdg_surface_ack_configureconfigure イベントへの応答
xdg_toplevel
struct xdg_toplevel_listenerハンドラ構造体
enum xdg_toplevel_stateウィンドウの状態
xdg_toplevel_add_listenerハンドラ設定
xdg_toplevel_destroyウィンドウの破棄
xdg_toplevel_set_parent親をセット
xdg_toplevel_set_titleタイトル設定
xdg_toplevel_set_app_idアプリケーション識別子を設定
xdg_toplevel_show_window_menuウィンドウメニューの表示
xdg_toplevel_moveユーザー操作による移動を開始
xdg_toplevel_resizeユーザー操作によるサイズ変更を開始
xdg_toplevel_set_max_sizeウィンドウの最大サイズを設定
xdg_toplevel_set_min_sizeウィンドウの最小サイズを設定
xdg_toplevel_set_maximized最大化
xdg_toplevel_unset_maximized最大化を戻す
xdg_toplevel_set_fullscreenフルスクリーンにする
xdg_toplevel_unset_fullscreenフルスクリーンを戻す
xdg_toplevel_set_minimized最小化する
xdg_popup
struct xdg_popup_listenerハンドラ構造体
xdg_popup_add_listenerハンドラ設定
xdg_popup_destroy破棄
xdg_popup_grab明示的にグラブ
xdg_popup_repositionポップアップの位置を変更
xdg_positioner
xdg_positioner_destroy破棄
xdg_positioner_set_sizeサイズをセット
xdg_positioner_set_anchor_rect親のアンカー矩形をセット
xdg_positioner_set_anchorアンカー矩形の辺をセット
xdg_positioner_set_gravity配置方向をセット
xdg_positioner_set_constraint_adjustment位置とサイズの調整の設定
xdg_positioner_set_offsetオフセット位置をセット
xdg_positioner_set_reactiveリアクティブをセット
xdg_positioner_set_parent_size親のウィンドウサイズをセット
xdg_positioner_set_parent_configureconfigure イベントのシリアルをセット
xdg_wm_base
struct xdg_wm_base_listener {
    void (*ping)(void *data, struct xdg_wm_base *xdg_wm_base, uint32_t serial);
};
ハンドラ構造体
ping
クライアントが応答可能かどうかを判断するために、不定期に送られる。
xdg_wm_base_pong() を実行して応答する。
int xdg_wm_base_add_listener(struct xdg_wm_base *xdg_wm_base,
    const struct xdg_wm_base_listener *listener, void *data);
ハンドラ設定
void xdg_wm_base_destroy(struct xdg_wm_base *xdg_wm_base);
破棄
struct xdg_positioner *xdg_wm_base_create_positioner(struct xdg_wm_base *xdg_wm_base);
サーフェスを配置するための xdg_positioner を作成。
struct xdg_surface *xdg_wm_base_get_xdg_surface(struct xdg_wm_base *xdg_wm_base, struct wl_surface *surface);
ウィンドウ用の xdg_surface を作成する。
void xdg_wm_base_pong(struct xdg_wm_base *xdg_wm_base, uint32_t serial);
ping イベントに応答する。
xdg_surface
struct xdg_surface_listener {
    void (*configure)(void *data, struct xdg_surface *xdg_surface, uint32_t serial);
};
ハンドラ構造体
configure
configure シーケンスの終了を示す。
configure シーケンスは、サーフェスの状態の1つ以上のイベントのセット。

クライアントは、新しい状態に合わせてサーフェスを調整し、それを commit する前に、xdg_surface_ack_configure() を実行する必要がある。

複数の configure イベントが来た場合、最後の configure イベント以外は無視できる。
int xdg_surface_add_listener(struct xdg_surface *xdg_surface,
    const struct xdg_surface_listener *listener, void *data);
ハンドラ設定
void xdg_surface_destroy(struct xdg_surface *xdg_surface);
破棄
struct xdg_toplevel *xdg_surface_get_toplevel(struct xdg_surface *xdg_surface);
サーフェスをトップレベルウィンドウにする。
struct xdg_popup *xdg_surface_get_popup(struct xdg_surface *xdg_surface,
    struct xdg_surface *parent, struct xdg_positioner *positioner);
サーフェスをポップアップウィンドウにする。
void xdg_surface_set_window_geometry(struct xdg_surface *xdg_surface,
    int32_t x, int32_t y, int32_t width, int32_t height);
ウィンドウの実体範囲 (影などの部分を除いた範囲) をセット。

これは、ウィンドウの位置やサイズをセットするものではない。
commit 時に適用される。

設定された場合、それを解除することはできない。
新しいサブサーフェスまたは wl_buffer がアタッチされても、この関数が実行されるまでは、範囲は変化しない。
void xdg_surface_ack_configure(struct xdg_surface *xdg_surface, uint32_t serial);
configure イベント時に、wl_surface を commit する場合、commit の前に実行する必要がある。
serial は configure イベントで渡された値をそのまま渡す。

例えば、トップレベルの場合、コンポーザーはこの情報を使用して、最大化状態またはフルスクリーン状態の時、ウィンドウを左上に移動させることができる。

この関数の直後に、すぐに commit する必要はない。
次回の commit の前に、何回か ack_configure を実行することもできる。
xdg_toplevel
struct xdg_toplevel_listener {
    void (*configure)(void *data, struct xdg_toplevel *xdg_toplevel,
        int32_t width, int32_t height, struct wl_array *states);
    void (*close)(void *data, struct xdg_toplevel *xdg_toplevel);
    # ver 4
    void (*configure_bounds)(void *data, struct xdg_toplevel *xdg_toplevel, int32_t width, int32_t height);
    # ver 5
    void (*wm_capabilities)(void *data, struct xdg_toplevel *xdg_toplevel, struct wl_array *capabilities);
};
ハンドラ構造体
configure
クライアントに、サイズや状態の変更を行うよう要求する。
指定された状態は、すぐには適用されない。

width か height が 0 の場合、サイズの変更はなし。
states は、uint32_t (enum xdg_toplevel_state) の wl_array 配列になっている。
close
ユーザーによってウィンドウを閉じる要求が行われた時。
デスクトップ上の操作などで、アプリを閉じる操作が実行された時。
クライアントはこの要求を無視したりしてもよい。
configure_bounds
ver 4
ウィンドウのサイズが制限されることが推奨される場合、xdg_toplevel.configure イベントの前に送信される場合がある。

width, height は、サーフェスの座標空間上で、サイズの境界幅。
0 の場合、境界幅は不明であり、イベントが送信されなかったときと同じ。

境界幅は、たとえば、モニターのサイズから、パネルやその他のシェルコンポーネントを除いたサイズであり、ウィンドウがこのサイズに収まらないことはない。

境界幅はいつでも変更される可能性があり、その場合、新しい configure_bounds が送信され、その後に xdg_toplevel.configure と xdg_surface.configure が送信される。
wm_capabilities
ver 5
コンポジターがサポートしている機能を通知する。
uint32_t の配列で、enum xdg_toplevel_state の値が格納されている。

サポートされていない機能がある場合、クライアントは、それに対応する UI 要素を非表示または無効にする必要がある。
コンポジターは、サポートしていない機能をクライアントが要求した場合、無視する。

コンポジターは、最初の xdg_surface.configure イベントの前に、このイベントを1回送信する必要がある。
サポートする機能が変更された場合、コンポジターはこのイベントを再度送信してた後、xdg_surface.configure イベントを送信する必要がある。
enum xdg_toplevel_state {
    XDG_TOPLEVEL_STATE_MAXIMIZED = 1,
    XDG_TOPLEVEL_STATE_FULLSCREEN = 2,
    XDG_TOPLEVEL_STATE_RESIZING = 3,
    XDG_TOPLEVEL_STATE_ACTIVATED = 4,
    # ver 2
    XDG_TOPLEVEL_STATE_TILED_LEFT = 5,
    XDG_TOPLEVEL_STATE_TILED_RIGHT = 6,
    XDG_TOPLEVEL_STATE_TILED_TOP = 7,
    XDG_TOPLEVEL_STATE_TILED_BOTTOM = 8,
    # ver 6
    XDG_TOPLEVEL_STATE_SUSPENDED = 9,
};
ウィンドウの状態
XDG_TOPLEVEL_STATE_MAXIMIZED
最大化。
configure イベントで指定された構成は、クライアントによって遵守される必要がある。
遵守されない場合、xdg_wm_base.invalid_surface_state エラーが発生する。
クライアントは、ウィンドウに影やその他の装飾を付けずに描画する必要がある。
XDG_TOPLEVEL_STATE_FULLSCREEN
フルスクリーン化。
configure イベントで指定された構成は最大値であり、クライアントはそれを超えてサイズを変更できない。
サーフェスがフルスクリーン領域全体を覆うには、クライアントが、指定された寸法に従う必要がある。
XDG_TOPLEVEL_STATE_RESIZING
ウィンドウサイズが、ドラッグなどにより変更中。
configure イベントで指定された構成は最大値であり、クライアントはそれを超えてサイズを変更することはできない。
ただし、アスペクト比またはセルサイズ構成を持つクライアントは、より小さいサイズを使用できる。
XDG_TOPLEVEL_STATE_ACTIVATED
ウィンドウがアクティブ状態。
ウィンドウの装飾は、ウィンドウがアクティブの状態として描画される必要がある。
ただし、実際にキーボードまたはポインタのフォーカスがあることとは別である。
XDG_TOPLEVEL_STATE_TILED_LEFT
ver 2
サーフェスの左端はタイル化されている。
ウィンドウは、現在タイル化されたレイアウトになっており、左端は、タイルグリッドの別の部分に隣接していると見なされる。
クライアントは、ウィンドウの左側に影や装飾を付けずに描画する必要がある。
XDG_TOPLEVEL_STATE_SUSPENDED
ver 6
サーフェスの再描画が中断されている。
サーフェスは現在、通常どおりに再描画されていない。
たとえば、サーフェスの内容が別のウィンドウに隠れている場合や、画面がロックされているために、出力がオフになっている場合など。
int xdg_toplevel_add_listener(struct xdg_toplevel *xdg_toplevel,
    const struct xdg_toplevel_listener *listener, void *data);
ハンドラ設定
void xdg_toplevel_destroy(struct xdg_toplevel *xdg_toplevel);
ウィンドウを非表示にして破棄する。
void xdg_toplevel_set_parent(struct xdg_toplevel *xdg_toplevel, struct xdg_toplevel *parent);
ウィンドウの親を設定する。
このウィンドウは、親のウィンドウよりも常に前面に表示される。

指定された親は、このウィンドウが表示されている間、常に表示されている状態でなければならない。
ダイアログやツールボックスなどで使う。
void xdg_toplevel_set_title(struct xdg_toplevel *xdg_toplevel, const char *title);
短いタイトルを UTF-8 で設定する。
タスクバーなどで表示されたりする。
void xdg_toplevel_set_app_id(struct xdg_toplevel *xdg_toplevel, const char *app_id);
アプリケーション識別子の文字列を設定する。

app_id は、ウィンドウが属するアプリケーションの、一般的なクラス名。
アプリケーションの .desktop ファイルの、拡張子を除く名前が推奨される。
"abc.desktop" なら "abc"。

コンポーザーはこれを使用して、複数のウィンドウをグループ化したり、新しいアプリケーションを起動する方法を決定したりすることができる。

D-Bus 起動可能アプリケーションの場合、ID は D-Bus サービス名として使用される。
void xdg_toplevel_show_window_menu(struct xdg_toplevel *xdg_toplevel,
    struct wl_seat *seat, uint32_t serial, int32_t x, int32_t y);
サーバー側で実装されているウィンドウメニュー (タイトルバーを右クリックした時などのメニュー) を実行させる。
ボタンやキーが押された時に実行する。
x,y
親の座標
void xdg_toplevel_move(struct xdg_toplevel *xdg_toplevel, struct wl_seat *seat, uint32_t serial);
ユーザー操作によって、ウィンドウ位置の移動を開始させる。

ウィンドウがフルスクリーンや最大化の時や、serial 値が有効でない場合、サーバーはクライアントからの要求を無視することができる。

カーソル形状は、サーバー側で自動的に変更される。
移動が完了したときに、デバイスのフォーカスが戻ってくるという保証はない。
void xdg_toplevel_resize(struct xdg_toplevel *xdg_toplevel,
    struct wl_seat *seat, uint32_t serial, uint32_t edges);
ユーザー操作によって、ウィンドウサイズの変更を開始する。
edges
サイズを変更する端の位置。

enum xdg_toplevel_resize_edge {
    XDG_TOPLEVEL_RESIZE_EDGE_NONE = 0,
    XDG_TOPLEVEL_RESIZE_EDGE_TOP = 1,
    XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM = 2,
    XDG_TOPLEVEL_RESIZE_EDGE_LEFT = 4,
    XDG_TOPLEVEL_RESIZE_EDGE_TOP_LEFT = 5,
    XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_LEFT = 6,
    XDG_TOPLEVEL_RESIZE_EDGE_RIGHT = 8,
    XDG_TOPLEVEL_RESIZE_EDGE_TOP_RIGHT = 9,
    XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_RIGHT = 10,
};
void xdg_toplevel_set_max_size(struct xdg_toplevel *xdg_toplevel, int32_t width, int32_t height);
ウィンドウの最大サイズを設定する。
commit 時に適用される。

※サーバーはこの値を無視する場合があるため、常に適用されるとは限らない。

一度も設定されていない場合、または値が 0 の場合は、最大サイズは「なし」となる。

最小サイズよりも小さい値や、負の値の場合、プロトコルエラーが発生する。
void xdg_toplevel_set_min_size(struct xdg_toplevel *xdg_toplevel, int32_t width, int32_t height);
ウィンドウの最小サイズを設定
void xdg_toplevel_set_maximized(struct xdg_toplevel *xdg_toplevel);
ウィンドウを最大化する。

この要求の後、サーバーは configure イベントを送る。
クライアントは、イベントで状態を取得し、最大化状態の描画や設定を行う。

すでに最大化されている場合、サーバーは configure イベントで、最大化が ON の状態を伝える。
void xdg_toplevel_unset_maximized(struct xdg_toplevel *xdg_toplevel);
ウィンドウの最大化を元に戻す。
動作は最大化時とほぼ同じ。
void xdg_toplevel_set_fullscreen(struct xdg_toplevel *xdg_toplevel, struct wl_output *output);
ウィンドウをフルスクリーンの状態にする。

ウィンドウのサイズが、出力全体に広げられない場合は、中央に表示して、周りを黒色にする。
output
出力先。NULL でサーバーが自動選択する。
void xdg_toplevel_unset_fullscreen(struct xdg_toplevel *xdg_toplevel);
フルスクリーンを戻す
void xdg_toplevel_set_minimized(struct xdg_toplevel *xdg_toplevel);
ウィンドウを最小化する。
※現在最小化されているかどうかを確認する方法はない。
xdg_popup
struct xdg_popup_listener {
    void (*configure)(void *data, struct xdg_popup *xdg_popup,
        int32_t x, int32_t y, int32_t width, int32_t height);
    void (*popup_done)(void *data, struct xdg_popup *xdg_popup);
    # ver 3
    void (*repositioned)(void *data, struct xdg_popup *xdg_popup, uint32_t token);
};
ハンドラ構造体
configure
ポップアップに、位置やサイズを変更するよう要求される時。
x, y は、親の左上隅を基準として、xdg_positioner のルールに基づいて、ポップアップが配置される位置。

ver 2 以前では、初期設定として1回のみ送信される。
ver 3 以降では、ポップアップが xdg_positioner でセットアップされ、set_reactive が要求された場合、または reposition 要求に応答して、再度送信されることがある。
popup_done
ポップアップがコンポジターによって閉じられたときに送信される。
クライアントは、この時点で xdg_popup_destroy() を使って破棄する必要がある。
repositioned
ver 3
xdg_popup_reposition() 要求の完了を通知するためのもの。
token 引数は、xdg_popup_reposition() で渡されるトークン。

このイベントが発行された直後に、xdg_popup.configure および xdg_surface.configure が送信され、更新されたサイズと位置、新しいシリアルが通知される。

クライアントは、オプションとして、ポップアップの内容を更新する必要があるが、新しい位置を有効にするには、新しいポップアップ構成を確認する必要がある。
int xdg_popup_add_listener(struct xdg_popup *xdg_popup,
    const struct xdg_popup_listener *listener, void *data);
ハンドラ設定
void xdg_popup_destroy(struct xdg_popup *xdg_popup);
破棄
void xdg_popup_grab(struct xdg_popup *xdg_popup, struct wl_seat *seat, uint32_t serial);
ポップアップ開始時に、明示的にグラブする。
ポップアップが閉じられるか、破棄された場合、グラブは解除される。

サーバーがグラブを拒否した場合、ポップアップは解除される。
この時、ポップアップがネストされている場合は、すべてのポップアップが解除される。

ポップアップの親は、トップレベルか、明示的なグラブを持つ、別のポップアップであること。

親がポップアップの場合は、一番最後に作成したものから、順に破棄すること。
ネストされた一番最後のポップアップが破棄された場合は、親のポップアップがグラブされる。

グラブされているサーフェスは、すべてのサーフェス上のポインタイベントを取得する。
serial
ボタン、キー押しなどのユーザーアクション時のイベントのシリアル。
void xdg_popup_reposition(struct xdg_popup *xdg_popup, struct xdg_positioner *positioner, uint32_t token);
//ver 3
すでに表示されているポップアップの位置を変更する。

ポップアップは、新しい positioner の設定により配置され、その後、xdg_popup.repositioned、xdg_popup.configure、xdg_surface.configure イベントが発行される。
以前の positioner によって設定されたパラメータは、すべて破棄される。

複数回実行された場合、コンポジターは最後の1つ以外をすべてスキップすることがある。

ポップアップが、親の configure イベントに応じて再配置される場合、クライアントは、xdg_positioner_set_parent_configure() と、場合によっては xdg_positioner_set_parent_size() を実行して、コンポジターがポップアップを適切に制限できるようにする必要がある。

ポップアップが、サイズ変更されている親と一緒に再配置されるが、configure イベントに応じて再配置される場合、クライアントは xdg_positioner_set_parent_size() を実行する必要がある。
token
xdg_popup.repositioned イベントに渡されるトークン。
新しいポップアップの位置は、対応する configure イベントがクライアントによって確認されるまで、有効にならない。
トークン自体は不透明で、他に特別な意味はない。
xdg_positioner
void xdg_positioner_destroy(struct xdg_positioner *xdg_positioner);
破棄
void xdg_positioner_set_size(struct xdg_positioner *xdg_positioner, int32_t width, int32_t height);
表示するウィンドウのサイズを設定する。
width,height
0 以下の値でエラー。
void xdg_positioner_set_anchor_rect(struct xdg_positioner *xdg_positioner,
    int32_t x, int32_t y, int32_t width, int32_t height);
親座標でのアンカー矩形を指定する。
子サーフェスは、この矩形範囲を基準として配置される。

xdg_surface_set_window_geometry() で設定された範囲を基準とする。
width,height
負の値を指定するとエラー。
void xdg_positioner_set_anchor(struct xdg_positioner *xdg_positioner, uint32_t anchor);
ポップアップの位置が配置される時に、アンカー矩形のどの辺を基準にするかを指定する。
anchor
基準になる辺。
TOP_LEFT なら、アンカー矩形の左上位置に合わせて配置する。

位置が一つだけなら、辺の中央に置かれる。
NONE なら、矩形の中央位置となる。

enum xdg_positioner_anchor {
    XDG_POSITIONER_ANCHOR_NONE = 0,
    XDG_POSITIONER_ANCHOR_TOP = 1,
    XDG_POSITIONER_ANCHOR_BOTTOM = 2,
    XDG_POSITIONER_ANCHOR_LEFT = 3,
    XDG_POSITIONER_ANCHOR_RIGHT = 4,
    XDG_POSITIONER_ANCHOR_TOP_LEFT = 5,
    XDG_POSITIONER_ANCHOR_BOTTOM_LEFT = 6,
    XDG_POSITIONER_ANCHOR_TOP_RIGHT = 7,
    XDG_POSITIONER_ANCHOR_BOTTOM_RIGHT = 8,
};
void xdg_positioner_set_gravity(struct xdg_positioner *xdg_positioner, uint32_t gravity);
アンカーの基準位置から、どの方向にポップアップを置くかを指定する。
gravity
方向。

位置が2つ指定されている場合、指定された方向に向けて配置される。
位置が1つのみの場合、指定されていない軸は、中央揃えされる。

enum xdg_positioner_gravity {
    XDG_POSITIONER_GRAVITY_NONE = 0,
    XDG_POSITIONER_GRAVITY_TOP = 1,
    XDG_POSITIONER_GRAVITY_BOTTOM = 2,
    XDG_POSITIONER_GRAVITY_LEFT = 3,
    XDG_POSITIONER_GRAVITY_RIGHT = 4,
    XDG_POSITIONER_GRAVITY_TOP_LEFT = 5,
    XDG_POSITIONER_GRAVITY_BOTTOM_LEFT = 6,
    XDG_POSITIONER_GRAVITY_TOP_RIGHT = 7,
    XDG_POSITIONER_GRAVITY_BOTTOM_RIGHT = 8,
};
void xdg_positioner_set_constraint_adjustment(
    struct xdg_positioner *xdg_positioner, uint32_t constraint_adjustment);
最初に設定した位置とサイズで配置した時に、ウィンドウが画面をはみ出す場合、サーバー側で、位置またはサイズを自動で調整するように指定する。
constraint_adjustment
調整のフラグ。
X, Y 軸ごとに、複数のフラグで指定する。

指定されていない軸は、調整を許可しないという意味になる。
1つの軸に対して、複数の値が指定されている場合、優先順によって、適切なものが1つ使われる。
設定されていない場合のデフォルトは NONE (調整しない)。

enum xdg_positioner_constraint_adjustment {
    XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_NONE = 0,
    XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_SLIDE_X = 1,
    XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_SLIDE_Y = 2,
    XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_FLIP_X = 4,
    XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_FLIP_Y = 8,
    XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_RESIZE_X = 16,
    XDG_POSITIONER_CONSTRAINT_ADJUSTMENT_RESIZE_Y = 32
};

SLIDE は、位置をスライドしてずらす。
FLIP は、位置を反転させる (アンカー矩形の反対側)。
RESIZE は、サイズを変更する。
void xdg_positioner_set_offset(struct xdg_positioner *xdg_positioner, int32_t x, int32_t y);
ポップアップの位置を、指定した px 分ずらす。
void xdg_positioner_set_reactive(struct xdg_positioner *xdg_positioner);
//ver 3
リアクティブにセットすると、親ウィンドウが移動した場合などに、サーフェスの位置などを再調整する。

条件が変更され、ポップアップが再調整された場合、更新されたジオメトリを含む xdg_popup.configure イベントが送信され、その後に xdg_surface.configure イベントが送信される。
void xdg_positioner_set_parent_size(struct xdg_positioner *xdg_positioner, int32_t parent_width, int32_t parent_height);
//ver 3
ポップアップを配置するときに、コンポジターが使用する親ウィンドウのサイズを設定する。

コンポジターはこの情報を使用して、ポップアップが制約される将来の状態を決定する場合がある。
ポップアップが実際に配置される親の寸法と一致しない場合、動作は未定義。
void xdg_positioner_set_parent_configure(struct xdg_positioner *xdg_positioner, uint32_t serial);
//ver 3
このポジショナーが応答として使用する xdg_surface.configure イベントの、シリアル値を設定する。
コンポジターは、この情報を set_parent_size と一緒に使用して、ポップアップが、どの将来の状態を使用して制限されるかを決定できる。