wayland-client-protocol.h [3]

wl_data_device_manager
wl_data_device_manager_destroy破棄
wl_data_device_manager_create_data_sourcewl_data_source の作成
wl_data_device_manager_get_data_devicewl_data_device の作成
wl_data_device
wl_data_device_add_listenerハンドラ設定
wl_data_device_destroy破棄
wl_data_device_release解放
wl_data_device_start_dragD&D の開始を要求
wl_data_device_set_selectionクリップボードにデータをセット
wl_data_offer
wl_data_offer_add_listenerハンドラ設定
wl_data_offer_accept指定 MIME を受け取ることを通知する
wl_data_offer_receiveデータの送信を要求
wl_data_offer_destroy破棄
wl_data_offer_finishD&D 処理の終了を通知
wl_data_offer_set_actionsアクションを設定
wl_data_source
wl_data_source_add_listenerハンドラ設定
wl_data_source_offer対応する MIME タイプの追加
wl_data_source_destroy破棄
wl_data_source_set_actionsアクションを設定
wl_data_device_manager
void wl_data_device_manager_destroy(
    struct wl_data_device_manager *wl_data_device_manager);
破棄
struct wl_data_source *wl_data_device_manager_create_data_source(
    struct wl_data_device_manager *wl_data_device_manager);
wl_data_source の作成
struct wl_data_device *wl_data_device_manager_get_data_device(
    struct wl_data_device_manager *wl_data_device_manager,
    struct wl_seat *seat);
wl_data_device の作成
wl_data_device
int wl_data_device_add_listener(struct wl_data_device *wl_data_device,
    const struct wl_data_device_listener *listener, void *data);
void (*data_offer)(void *data, struct wl_data_device *data_device, struct wl_data_offer *id);

void (*enter)(void *data, struct wl_data_device *data_device, uint32_t serial,
    struct wl_surface *surface, wl_fixed_t x, wl_fixed_t y, struct wl_data_offer *id);

void (*leave)(void *data, struct wl_data_device *data_device);

void (*motion)(void *data, struct wl_data_device *data_device,
    uint32_t time, wl_fixed_t x, wl_fixed_t y);

void (*drop)(void *data, struct wl_data_device *data_device)

void (*selection)(void *data, struct wl_data_device *data_device, struct wl_data_offer *id);
data_offer
データの変更により、新しい wl_data_offer が作成された時。
[D&D] enter または [クリップボード] selection の前に来る。

この直後に、wl_data_offer:offer イベントが送信され、提供する MIME タイプが送られる。
enter
D&D ポインタが、クライアントが所有するサーフェスに入ると送信される。
leave
D&D ポインタがサーフェスから離れ、セッションが終了すると送信される。
クライアントは、この時点で wl_data_offer を破棄する必要がある。
motion
クライアントが管理しているサーフェス内で D&D ポインタが移動したときに送信される。
drop
ドロップを受け付けている状態で、ユーザーがボタンを離して、D&D 操作が終了した時。

wl_data_offer:action イベントで最後に受け取ったアクションを元に、COPY または MOVE であれば、wl_data_offer_receive() でデータを受信できる。

ver 3 以降では、wl_data_offer_finish() を実行して、操作が終了したことを通知する。

ASK の場合、クライアント側でメニューを出すなどした後、wl_data_offer_set_actions() で結果のアクションを指定、または wl_data_offer_destroy() で操作をキャンセルする必要がある。
selection
クリップボードに現在セットされているデータの wl_data_offer が通知される。
クリップボードにセットされているデータがない場合は、NULL が渡される。

キーボードフォーカスを受け取る直前、または、クライアントにキーボードフォーカスがある時に新しいクリップボードデータが設定された場合、送信される。

この直前には、MIME タイプを通知するために、wl_data_device:data_offer イベントと wl_data_offer:offer イベントが呼ばれる。

渡された wl_data_offer は、次にこのイベントが呼ばれるまで、または、クライアントがキーボードフォーカスを失うまで有効である。

クライアントは、このイベント内で、前回の wl_data_offer を破棄しなければならない。
void wl_data_device_destroy(struct wl_data_device *wl_data_device);
ver 2 以降では、wl_data_device_release() を使う。
void wl_data_device_release(struct wl_data_device *wl_data_device);
wl_data_device_manager のバージョンが WL_DATA_DEVICE_RELEASE_SINCE_VERSION 以上なら、destroy の代わりにこちらを使う。

ver 2 から
void wl_data_device_start_drag(struct wl_data_device *wl_data_device,
    struct wl_data_source *source, struct wl_surface *origin,
    struct wl_surface *icon, uint32_t serial);
D&D を行う側が、D&D を開始するように要求する。

source は、データソース。
NULL の場合、クライアント内部での D&D 操作となる。

ポインタの enter/leave/motion イベントは、この関数を実行したクライアントにのみ送信される。

origin は、ドラッグが始まるサーフェス。
serial は、ボタン押しイベント時に渡されたシリアル値。

icon は、カーソル形状のサーフェス (NULL 可)。

開始時は、左上がホットスポットとなっているが、開始後に wl_surface_attach() を実行することによって、位置を変更できる。

なお、形状変更時は wl_surface_commit() で適用させる必要がある。

アイコンの surface には、D&D アイコンの役割が与えられる。
サーフェスに既に別の役割がある場合は、プロトコルエラーが発生する。

wl_surface がアイコンサーフェスとして使用されなくなるまで、アイコンサーフェスの現在の入力領域と保留中の入力領域はクリアされ、wl_surface_set_input_region() は無視される。
アイコンとしての使用が終了すると、現在の入力領域と保留中の入力領域は未定義になる。
void wl_data_device_set_selection(struct wl_data_device *wl_data_device,
    struct wl_data_source *source, uint32_t serial);
source をクリップボードのデータとして設定する。

この時点で、現在クリップボードのデータを持っているのは、このクライアントとなり、データの送信が要求されたら対応する必要がある。

クリップボードの所有権を放棄したい場合は、source を NULL に設定する。

serial は、他のすべてのイベントで最後に取得したシリアル値。
wl_data_offer
int wl_data_offer_add_listener(struct wl_data_offer *data_offer,
    const struct wl_data_offer_listener *listener, void *data);
void (*offer)(void *data, struct wl_data_offer *data_offer, const char *mime_type);

▼ ver 3 から

void (*source_actions)(void *data, struct wl_data_offer *data_offer, uint32_t source_actions);

void (*action)(void *data, struct wl_data_offer *data_offer, uint32_t dnd_action);
offer
提供されている MIME タイプが送られてくる。
wl_data_offer の作成直後に送信される。
1つの MIME タイプごとにイベントが来る。
source_actions
D&D 実行元が対応しているアクションが通知される。

wl_data_device:enter の直前、または、D&D 中に wl_data_source_set_actions() でアクションが変更されるたびに送信される。

ver 3 から
action
サーバーによって最終的に選択されたアクション (1つ or なし) が提示される。

wl_data_offer_set_actions() で、受け取る側のアクションが変更されると、D&D 操作中に複数回送信される。

ドロップ時には、このイベントで最後に受け取ったアクション、または、ASK の場合は wl_data_offer_set_actions() で最後に設定されたアクションを実行する必要がある。

サーバは、D&D 中に Ctrl などの装飾が押された時に、選択したアクションを変更することもできる。
wl_data_device:drop の前に、(装飾キーが押されたために) 選択されたアクションが変更されることがある。

ASK アクションの場合にも、アクションの変更が起こる可能性がある。
この段階で起こるアクションの変更は、常にクライアント間の交渉の結果であり、サーバーは関与できない。

ASK アクションでは、最終的な wl_data_offer_set_actions() および wl_data_offer_accept() は、wl_data_offer_finish() の前に実行する必要がある。

ver 3 から
void wl_data_offer_accept(struct wl_data_offer *wl_data_offer,
    uint32_t serial, const char *mime_type);
D&D を受け取る側が、指定された MIME タイプを受け入れることを示す。
serial は、enter 時の値。

ver 2:
クライアントが指定 MIME タイプを受け取れるかを調べるために使われる。
D&D が成功するかどうかは別。

ver 3:
NULL の場合は、D&D を受け入れない。
受け入れる場合は、ソース側が対応しているタイプのいずれかを指定する。
NULL を設定後にドロップされた場合、D&D 操作はキャンセルされ、ソース側は wl_data_source:cancelled を受け取る。
受け取る側は、wl_data_source:action とこの関数で、ドロップの受け入れ状態を設定する必要がある。
void wl_data_offer_receive(struct wl_data_offer *wl_data_offer,
    const char *mime_type, int32_t fd);
MIME タイプを指定して、ソース側に対して、データの送信を要求する。
転送は渡されたファイルディスクリプタ(通常は pipe で作成)を介して行われる。

ソース側は、要求された MIME タイプのデータを書き込んだ後、fd をクローズする。
ソース側が対応していない MIME タイプでも、そのまま send イベントが要求される。

D&D を受け取る側では、データが受け取れるものかどうかを判断するために、先取りしてデータを取得したりすることができる。
void wl_data_offer_destroy(struct wl_data_offer *wl_data_offer);
破棄
void wl_data_offer_finish(struct wl_data_offer *wl_data_offer);
D&D を受け取る側が、データの受信後に操作を正常に終了したことを通知する。

データの受信が終了した後に実行する。
この要求を受け取ると、コンポジタは受け取る側のクライアントに wl_data_source:dnd_finished を発行する。

この後に wl_data_offer_destroy() を実行するとエラーになる。

また、wl_data_offer_accept() で MIME タイプ を NULL に指定した後、または、wl_data_offer:action でアクションが NONE になっている状態で、この要求を実行すると、エラーが発生する。

ver 3 から
void wl_data_offer_set_actions(struct wl_data_offer *wl_data_offer,
    uint32_t dnd_actions, uint32_t preferred_action);
D&D を受け取る側が対応可能なアクションを設定する。

サーバーがアクションを変更する場合、wl_data_source:action と wl_data_offer:action イベントを発生させることがある。

wl_data_device:enter/motion イベント時の応答として、複数回実行できる。

指定したアクションが実行できない場合、ソース側は wl_drag_source:cancelled を受け取る。

引数の dnd_actions、preferred_action は、wl_data_device_manager_dnd_actions 列挙型の値。
dnd_actions は、受け付けるアクションの複数のフラグ。
preferred_action は、優先されるアクション。dnd_actions で指定したうちのいずれか一つ。

WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE = 0
WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY = 1
WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE = 2
WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK  = 4

ASK を受け付ける場合、受け取る側は、wl_data_offer_receive() でデータの送信を要求した後、wl_data_offer_set_actions() で、最終的に実行するアクション (ASK 以外) を指定する。

その後、wl_data_offer_finish() を実行して、ユーザーが選択したアクションを伝える。
最終的なアクションが wl_data_offer:source_actions で渡された中にない場合は、エラーが発生する。

ユーザ側でキャンセルが選択された場合など、ASK が却下された時は、クライアントは即座に wl_data_offer_destroy() を実行する必要がある。

ver 3 から
wl_data_source
int wl_data_source_add_listener(struct wl_data_source *wl_data_source,
    const struct wl_data_source_listener *listener, void *data);
void (*target)(void *data, struct wl_data_source *wl_data_source, const char *mime_type);

void (*send)(void *data, struct wl_data_source *wl_data_source,
    const char *mime_type, int32_t fd);

void (*cancelled)(void *data, struct wl_data_source *wl_data_source);

void (*dnd_drop_performed)(void *data, struct wl_data_source *wl_data_source);

void (*dnd_finished)(void *data, struct wl_data_source *wl_data_source);

void (*action)(void *data, struct wl_data_source *wl_data_source, uint32_t dnd_action);
target
D&D を受け入れる側で、ポインタの enter/move イベントが受け入れられた時に送信される。
受け取る側がドロップを受け付けない状態の場合、mime_type は NULL となる。
send
サーバーや他のクライアントからデータを要求された時。
fd に write() で書き込んでデータを送信し、close() で閉じる。
cancelled
この時点で、渡された wl_data_source は有効ではないため、この wl_data_source を破棄する必要がある。

これが起こる原因はいくつかある。

・ クライアントがデータを持っている状態で、他のクライアントがクリップボードデータをセットして、置き換わった時。

・ D&D 時、受け取る側が提供された MIME タイプのいずれも受け入れなかった。

・ D&D 時、受け取る側とソース側でアクションが一致しなかった。

・ D&D 時、ボタンを離した先が有効なサーフェス上ではなかった。

・ サーバーが D&D 操作をキャンセルした(サーバー側のタイムアウトなど)。
dnd_drop_performed
ユーザーがボタンを離して、受け取る側がドロップを受け付けた時。
wl_data_device:drop の後に来る。

操作のキャンセル時は発生せず、wl_data_source:cancelled が発生する。

wl_data_source はこの後も使用される可能性があるため、ここでは破棄しないこと。

ver 3 から
dnd_finished
D&D 処理がすべて終了した。

ソース側は wl_data_source を自由に破棄し、関連するすべてのデータを解放することができる。

アクションが MOVE だった場合、ソース側は移動元データを削除できる。

ver 3 から
action
サーバーが最終的に選択したアクション (1つまたは無し) が示される。

D&D 操作中、主に wl_data_offer_set_actions() によって、受け取る側が対応アクションを変更した時、wl_data_device がサーフェスに入る/離れるときに、複数回送信されます。

ASK アクション時は、wl_data_source:dnd_drop_performed の後にこのイベントが来る。
この場合、最終的な wl_data_source:action イベントは wl_data_source:dnd_finished の直前に発生する。

選択されたアクションは変更される可能性がある (ASK → MOVE など)。
したがって、最終アクションの実行は常に wl_data_offer:dnd_finished 時に行う必要がある。

D&D 実行元では、このアクションを元に、対応したカーソル形状へと変更できる。

ver 3 から
void wl_data_source_offer(struct wl_data_source *wl_data_source, const char *mime_type);
ソースとして対応している MIME タイプを追加する。
複数のタイプを提供するために複数回呼び出すことができる。
void wl_data_source_destroy(struct wl_data_source *wl_data_source);
破棄
void wl_data_source_set_actions(struct wl_data_source *wl_data_source, uint32_t dnd_actions);
ソース側が対応可能なアクションを設定する。

wl_data_device_start_drag() の前に一度だけ行う必要がある。

サーバーが状況に応じてアクションを変更する場合、wl_data_source:action と wl_data_offer:action イベントを発生させることがある。

dnd_actions 引数は、wl_data_device_manager_dnd_actions 列挙型のフラグ値。

ver 3 から