sway / wlroots (Wayland) RDP

wlroots compositors have no built-in RDP server. lamco-rdp-server captures the screen with wlroots' wlr-screencopy and injects input with the wlroots virtual input protocols, so sway, river, labwc, and Wayfire get standard RDP with the same binary that runs on GNOME and KDE.

Install

Native (recommended on wlroots) or Flatpak (CE). Screencast uses xdg-desktop-portal-wlr plus PipeWire; input uses the wlroots virtual-input protocols directly. Verify:

lamco-rdp-server --show-capabilities

Minimal config

~/.config/lamco-rdp-server/config.toml:

[server]
# Dual-stack by default; use "0.0.0.0:3389" only to force IPv4-only.
listen_addr = "[::]:3389"

[security]
tls = true

[video]
codec = "auto"

Start it:

lamco-rdp-server

Connect

Dual-stack by default (IPv4 + IPv6). Use a hostname or explicit address (IPv6 in brackets):

  • Windows: mstsc.exe → host:3389 (or [2001:db8::10]:3389).
  • Linux: Remmina, or xfreerdp /v:host:3389 /u:USER.

sway / wlroots specifics (current in 1.4.5)

  • Capture: wlr-screencopy (wlr-direct), honoring the compositor's wl_shm buffer format.
  • Input: the wlroots virtual keyboard/pointer protocols (zwp_virtual_keyboard_v1, zwlr_virtual_pointer_v1) rather than libei.
  • Clipboard: wlr-data-control / ext-data-control.
  • Dynamic resolution. A client-initiated resize switches the first enabled output to a custom mode through zwlr_output_management_v1, so the physical output changes resolution instead of the server only capturing a scaled region. Gated by display.resize_drives_output_mode (on by default) and requires display.output_management. Best-effort: the first enabled head is the target, not necessarily the one being captured.
  • Capture requests are paced to the higher of video.target_fps and performance.adaptive_fps.max_fps, rather than re-requesting the instant the previous frame lands. wayfire benefits most.
  • Unattended access recognises ext-image-copy-capture-v1 as a dialog-free capture path (Jay, labwc, phoc, Mir, Wayfire 0.11 and later).
  • Unicode typing works on the portal-generic path through keysym injection. wlr-direct still cannot inject keysyms, because zwp_virtual_keyboard_v1 has no request for it.
  • Verified on sway 1.11 and 1.12: native connect, EGFX video, input, and clipboard all pass (wlr-screencopy benchmarked cleanly at approximately 25 fps).

Troubleshooting

SymptomCauseFix
Colors are skewed (blue renders as brown)The bridge assumed BGRx, but sway delivers Xbgr8888 (RGBx byte order) via wlr-screencopyFixed in 1.4.4 (honors the wl_shm capture format and swaps R/B)
Connects, then black screenNo H.264 encoder, or EGFX not negotiated--show-capabilities; install Cisco OpenH264 for software H.264 (see Video Encoding), or use a GPU (VA-API)
Input does nothingVirtual-input protocols unavailable in the running compositorConfirm the compositor advertises zwlr_virtual_pointer_v1 / zwp_virtual_keyboard_v1

See also: Installation, Configuration, Security, Video Encoding, the Platform Compatibility matrix, and the sibling guides for GNOME/Mutter, KDE/KWin, Hyprland, and COSMIC.