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 を持っているものとする

  1. wl_data_device_manager.create_data_source を送って wl_data_source を作成
  2. wl_data_source.offer によりデータの種類をMIMEで指定
    1. たとえばテキストデータならtext/plainとか、Chromeで画像をコピーするとimage/pngchromium/x-source-urltext/htmlが同時に送られるとか
  3. wl_data_device.set_selection に wl_data_source を渡して、コピーされたことを通知

ペースト先のアプリにkeyboard focusが当たる

  1. wl_data_device.data_offer を受け取る
    1. 新しい wl_data_offer が作成される
  2. wl_data_offer.offer を受け取って、サポートしているMIMEタイプを確認
  3. wl_data_device.selection を受け取る

ペースト先のアプリでCtrl+Vを押す

  1. wl_data_offer.receive を fd と一緒に送る
  2. データ提供側に 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 後は送信されない