cua-driver-rs (Linux/Wayland): KDE Plasma 6.7 — agent cursor renders but input doesn't dispatch (portal-libei feature gated off in published binary)
@r33drichards is already working on this.
Since Jun 23, 2026.
- Dominant language
- HTML
- Stars
- 23.1k
- Forks
- 1.6k
- Avg merge
- 22h 29m
- Merged PRs (30d)
- 190
Description
User report
I tried using it on KDE Plasma 6.7 (Wayland) on Arch Linux, it didn't work, I saw the blue cursor but it didn't do the task I asked it to do, which was just to pause the music that was playing, and I specified the app.
Environment
- OS: Arch Linux
- DE: KDE Plasma 6.7 (Wayland)
- cua-driver: Linux published tarball (assumed current ≥ v0.6.0, please confirm)
Symptom
- Agent cursor (the colored overlay added in the Wayland-parity slice) renders correctly → confirms the overlay path via
wp-fractional-scale-v1+wp-viewporteris reaching the compositor. - The requested action (pause music in a named app) does not execute → input dispatch is silently no-op'ing.
- App was named explicitly, so window resolution should have succeeded via
ext-foreign-toplevel-list-v1.
Likely root cause
The native-Wayland parity work in #1966 added two input paths:
- wlroots:
zwlr_virtual_pointer_v1— works on sway, Hyprland, labwc, wayfire, dwl. Not implemented by KWin/Plasma. - xdg-desktop-portal + libei:
org.freedesktop.portal.RemoteDesktop.ConnectToEIS→reis(pure-Rust libei) — the only path that works on KDE Plasma / GNOME.
The libei path is feature-gated behind portal-libei in crates/platform-linux/Cargo.toml. It was gated off in the published binary by #1967 because the cross-platform CD's debian:11 build container ships PipeWire 0.3.19 (too old for libspa-sys 0.8 which needs ≥0.3.40) and has no libei-dev (added in trixie only). The Nix build enables --features portal-libei and works; the curl-pipe-bash tarball does not.
So on KDE Plasma:
- cursor overlay renders ✓ (no input needed)
- screencopy capture probably succeeds via wlroots screencopy if KWin exposes it, OR falls back to xdg-desktop-portal Screenshot
- input dispatch silently no-ops because
wlr_virtual_pointerisn't advertised andportal_screencast/libeimodules are#[cfg(feature = "portal-libei")]-gated out of the binary
Reproduction
Confirmed reproducible by anyone on KDE Plasma 6.x Wayland with a current Linux cua-driver tarball:
cua-driver list-windows→ returns windows (works viaext-foreign-toplevel-list-v1).cua-driver click ...against any of those windows → cursor moves visually, no actual click delivered.cua-driver doctor→ should currently report all-green even though input is dead.
Diagnostic to confirm
Once the user has tracing on, the log should show no attempt to use wlr_virtual_pointer (protocol not advertised) AND no attempt to use libei (compiled out). The bind loop in wayland::mod.rs will pick zero input-capable globals.
Options
-
Ship the published binary with
portal-libeienabled. Requires either:- bumping the CD container to bookworm (PipeWire 0.3.65 has what libspa-sys needs) — but that raises the GLIBC floor 2.31 → 2.36 and breaks Ubuntu 22.04 / RHEL 9 / Debian 11 for the entire binary, not just Wayland features. Not acceptable — see #1925 + #1919.
- vendoring newer PipeWire/libspa headers into the CD container — fragile.
- Building two Linux variants per release:
cua-driver-rs-<v>-linux-x86_64-binary.tar.gz(current, no portal-libei) andcua-driver-rs-<v>-linux-x86_64-portal.tar.gz(newer-glibc, full features). install.sh sniffs glibc and picks. Cleanest path forward.
-
doctor / runtime warning when the user is on KDE/GNOME and the portal-libei feature is gated off. At least surfaces "your DE needs the portal stack which isn't in this build" instead of silently no-op'ing input.
-
xdg-desktop-portal Screenshot + uinput fallback for input on systems without portal RemoteDesktop. Coarse but works without libei. Probably wrong long-term but cheap.
Recommendation
Land #2 first (one-day fix, ends the silent failure mode) → file #1 as the proper feature work. The two-variant publish is the canonical answer, mirrors how the wlroots-vs-portal split actually exists in the codebase.
References
- Wayland-parity PR that introduced the input paths: #1966
- Feature-gate that disabled
portal-libeiin the published binary: #1967 - GLIBC floor history: #1925 / #1919
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.