trycua / trycua/cua

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)

Open
#1,982 3 comments 0 reactions 1 assignee View on GitHub

@r33drichards is already working on this.

Since Jun 23, 2026.

bug
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-viewporter is 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:

  1. wlroots: zwlr_virtual_pointer_v1 — works on sway, Hyprland, labwc, wayfire, dwl. Not implemented by KWin/Plasma.
  2. xdg-desktop-portal + libei: org.freedesktop.portal.RemoteDesktop.ConnectToEISreis (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_pointer isn't advertised and portal_screencast/libei modules 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:

  1. cua-driver list-windows → returns windows (works via ext-foreign-toplevel-list-v1).
  2. cua-driver click ... against any of those windows → cursor moves visually, no actual click delivered.
  3. 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

  1. Ship the published binary with portal-libei enabled. 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) and cua-driver-rs-<v>-linux-x86_64-portal.tar.gz (newer-glibc, full features). install.sh sniffs glibc and picks. Cleanest path forward.
  2. 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.

  3. 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-libei in the published binary: #1967
  • GLIBC floor history: #1925 / #1919

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.