migrate clipboard bridge from wlr-data-control to ext-data-control

The wlr-data-control unstable protocol is deprecated; its superseding
staging protocol ext-data-control-v1 ships in wayland-protocols.
Migrate the host-side clipboard/primary bridge to it:

- bind ext_data_control_manager_v1 version 1 instead of zwlr_manager
  (ext-data-control v1 always supports primary selection, so the
  dc_primary_supported gate is dropped and the registry bind is plain)
- rename all zwlr_data_control_* to ext_data_control_* types/calls
- generate ext-data-control-v1 from wayland-protocols and drop the
  bundled wlr-data-control-unstable-v1.xml
- update README and test log-message expectations

wltest --screencopy is unaffected; the screencopy migration is separate.
This commit is contained in:
Andrew Hamilton 2026-09-08 00:37:52 +10:00
parent 0dc782a5d3
commit 592a2a036e
5 changed files with 98 additions and 383 deletions

View file

@ -1822,7 +1822,7 @@ def test_standalone_headless_gestures_roundtrip(tmp_path):
def test_nested_primary_selection_bridged(tmp_path):
"""Nested mode: a tab's primary selection is fanned out to a second tab
exactly as standalone, and the host-side bridge publishes it over
wlr-data-control (when the host implements v2) without echo-looping."""
ext-data-control (when the host implements it) without echo-looping."""
if not os.environ.get("WAYLAND_DISPLAY"):
pytest.skip("needs a live host Wayland session (WAYLAND_DISPLAY)")
out = tmp_path / "primary.out"
@ -1867,9 +1867,9 @@ def test_nested_host_primary_to_kick(tmp_path):
payload* because a live host may already hold its own primary selection at
boot, which kick faithfully mirrors first.
Skipped on hosts without wlr-data-control v2 (e.g. GNOME/mutter): the
Skipped on hosts without ext-data-control (e.g. GNOME/mutter): the
host->nested primary mirror only exists on that backend, so this test
needs a data-control host -- run it on a compositor like labwc/sway."""
needs an ext-data-control host -- run it on a compositor like labwc/sway."""
if not os.environ.get("WAYLAND_DISPLAY"):
pytest.skip("needs a live host Wayland session (WAYLAND_DISPLAY)")
token = f"kick-h2n-{os.getpid()}-{time.monotonic_ns()}"
@ -1881,12 +1881,12 @@ def test_nested_host_primary_to_kick(tmp_path):
s.wait_any_active()
s.wait_active_frame()
assert s.proc.poll() is None
# The host->nested primary bridge only exists over wlr-data-control
# v2 (a focus-based wl_data_device host has no primary channel at
# The host->nested primary bridge only exists over ext-data-control
# (a focus-based wl_data_device host has no primary channel at
# all), which is decided at bridge_init before any client maps.
s.wait_for(r"clipboard bridge:")
if "clipboard bridge: host data-control backend" not in s.read_log():
pytest.skip("host compositor lacks wlr-data-control v2; "
pytest.skip("host compositor lacks ext-data-control; "
"host->nested primary selection is not bridged here")
# Primary offers only reach the *focused* tab (wlroots delivers
# device selection events to the focused client), so crown the