https://wayland.freedesktop.org/docs/book/Protocol.html
Waylandにおいてコピー・アンド・ペースト(コピペ)およびドラッグ・アンド・ドロップ(DnD; Drag&Drop)を実現するためのもの
以下の3コンポーネントを管理する:
- Data Source:データ提供側が作成するもの
- Data Offer:データ受信側が受け取るもの
- Data Devices:上2つを結びつけるもの
コピペの流れ
コピペはどういうふうに行われる?
データ提供側のアプリでCtrl+Cを押す
もともと wl_data_device_manager.create_data_device で作った wl_data_device を持っているものとする
- wl_data_device_manager.create_data_source を送って wl_data_source を作成
- wl_data_source.offer によりデータの種類をMIMEで指定
- たとえばテキストデータなら
text/plainとか、Chromeで画像をコピーするとimage/pngとchromium/x-source-urlとtext/htmlが同時に送られるとか
- たとえばテキストデータなら
- wl_data_device.set_selection に wl_data_source を渡して、コピーされたことを通知
ペースト先のアプリにkeyboard focusが当たる
- wl_data_device.data_offer を受け取る
- 新しい wl_data_offer が作成される
- wl_data_offer.offer を受け取って、サポートしているMIMEタイプを確認
- wl_data_device.selection を受け取る
ペースト先のアプリでCtrl+Vを押す
- wl_data_offer.receive を fd と一緒に送る
- データ提供側に wl_data_source.send が送られる
actions
Windows では、エクスプローラーでShiftを押しながらDnDするとファイルを移動、Ctrlを押しながらだとコピーという使い分けができる
これを実現するのが wl_data_device v3からの wl_data_device_manager.dnd_action で、move / copy / ask から選択できる
コンポジタが受け取るやつ:
- wl_data_source.set_actions(actions)
- wl_data_source がサポートしている action が通知される
- wl_data_offer.set_actions(supported_actions, preferred_action)
- 前者はbitmaskだが後者はenumのいずれか1つ
- wl_data_device.(enter|motion) 等により複数回送られることがある
コンポジタが送信するやつ:
- wl_data_offer.source_actions(actions)
- wl_data_offer を作成した直後、もしくは wl_data_source.set_actions によって action が変化したときに送る
- wl_data_source.action(action)
- どのアクションを使うのか決定する
- wl_data_device.drop 後は送信されない
- wl_data_offer.action(action)
- どのアクションを使うのか決定する
- 送信先による wl_data_offer.set_actions への返事として複数回送ることができる
- wl_data_device.drop 後は送信されない