Skip to content

Releases: hbuddenberg/rdp-connect

v2.0.1 — Fix MONITOR_ID parsing with spaces

Choose a tag to compare

@hbuddenberg hbuddenberg released this 30 Aug 22:46

Fixed

  • Indirect Expansion Crash on MONITOR_ID: Fixed Bash set -euo pipefail crash when MONITOR_ID contains spaces (e.g. monitor description strings like "ASUSTek COMPUTER INC XG27ACS...") during indirect variable expansion for canvas capping resolution overrides.
  • Single-Monitor Canonical Resolution: Enhanced single-monitor mode resolution matching to resolve description substrings against canonical monitor JSON for correct workspace and geometry calculation under both Hyprland and Niri.

v2.0.0 — Quickshell UI, Automated Installer & AUR Package

Choose a tag to compare

@hbuddenberg hbuddenberg released this 28 Aug 17:14

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog.

[2.0.0] — 2026-08-28

Added

  • Native Quickshell Modal UI (ui/shell.qml): Modern standalone applet matching the Omarchy 4 design system with 4px border radius, 2px dynamic accent border reading live from colors.toml, visual profile picker, monitor checkboxes, and hardware feature toggles (Audio, Clipboard, Drive, USB, Webcam).
  • Interactive Quickshell Selector Engine: rdp-connect automatically uses Quickshell as its primary graphical selector when run without arguments, applying configured options directly without duplicate prompts.
  • Multi-Launcher Hierarchy: Graceful fallback across launchers: QuickshellWalkerWofiRofi.
  • Robust Autoinstaller (install.sh): Unified installer with dependency checking, user/system mode support, Quickshell UI deployment, and permission hardening.
  • Arch Linux & AUR Packaging (PKGBUILD, rdp-connect.install): Complete standard PKGBUILD recipe for AUR distribution with clean dependencies and license packaging.
  • --version / -V CLI Flags: Added standard version display command.

Security

  • Hardened Secret Isolation: Verified strict stdin credential piping to FreeRDP (/from-stdin:force) preventing credential exposure in process tables (ps aux).
  • No Hardcoded Credentials: Ensured all repositories, tests, and documentation are strictly clean of private data.

v1.2.1

Choose a tag to compare

@hbuddenberg hbuddenberg released this 20 Aug 14:03

Fix VA-API driver auto-detection by removing hardcoded LIBVA_DRIVER_NAME=iHD.

v1.1.0 — Client selection, kill-on-relaunch, dynamic selector, Hyprland keybind

Choose a tag to compare

@hbuddenberg hbuddenberg released this 28 Jul 21:39

Major additions since v0.6.0

Multi-client support

  • CLIENT selection (--client x11|sdl|wayland + profile key CLIENT):
    • x11 (default): xfreerdp3 — most stable for single-mon
    • sdl: sdl-freerdp3 — supports 3-window multimon on Wayland (auto-sets FREERDP_WLROOTS_HACK=force + SDL_VIDEODRIVER=wayland + grab flags + bitmap rendering)
    • wayland: wlfreerdp3 — native Wayland single-mon
  • SDL multimon tuning: skip /monitors: (SDL has own IDs), /gfx removed (bitmap = lighter), /bpp:16

Kill-on-relaunch

  • Running rdp-connect <profile> when a session is active now kills the old instance (SIGTERM → SIGKILL the process group) and relaunches cleanly
  • Fixed: exec 200> was truncating the PID file before reading it → peer PID was always empty

Dynamic profile selector (Super+Shift+R)

  • Walker preferred (matching hyprcaffeine style), then wofi, then rofi
  • Nerd Font icon 󰍹 + HOST + USER shown per profile
  • Dynamic box sizing: height = (profiles × 45px + 80px), width = 1050px
  • Excludes .env.bak.* files (only real profiles)
  • Hyprland keybind Super+Shift+Ruwsm-app -- rdp-connect

Default = single-mon

  • MONITOR_MODE default changed from multi to single (most stable under Hyprland)

Colored --help + migrator

  • Rich-like ANSI colored --help (respects NO_COLOR + TTY)
  • --update-profiles now adds ALL tunable keys (audio + monitor mode + layout)

Monitor layout config

  • MONITORS, MONITOR_ORDER, MONITOR_<id>, DYNAMIC_RESOLUTION profile keys
  • --monitors, --monitor-order, --dynamic-resolution CLI flags

Known limitations

  • SDL3 multimon on wlroots: functional but unstable (FREERDP_WLROOTS_HACK + grab flags; "not responding" dialogs). Upstream: FreeRDP #12393.
  • No fullscreen spanning: Wayland architecture prevents single surface crossing monitors.
  • Audio redirect to client: Arch package lacks working backends. Use AUDIO_REDIRECT=0 (server playback via /audio-mode:1).

Full diff: v0.6.0...v1.1.0

v0.6.0 — Client selection (x11/sdl/wayland), single-mon default, full tunable config

Choose a tag to compare

@hbuddenberg hbuddenberg released this 23 Jul 22:56

Breaking change

Default MONITOR_MODE is now single (was multi). rdp-connect <profile> gives single-monitor fullscreen by default — the most stable mode under Hyprland/XWayland. Use --multi-mon or MONITOR_MODE=multi for multi-monitor.

New features since v0.5.0

  • CLIENT selection--client <x11|sdl|wayland> + profile key CLIENT. Three FreeRDP clients:
    • x11 (default): xfreerdp3 (XWayland, best for single-mon)
    • sdl: sdl-freerdp3 (SDL3, supports 3-window multimon on Wayland via FREERDP_WLROOTS_HACK=force + SDL_VIDEODRIVER=wayland + grab flags auto-set)
    • wayland: wlfreerdp3 (native Wayland, single-mon)
  • Colored --help — rich-like ANSI (respects NO_COLOR + TTY).
  • --update-profiles — migrator now adds ALL tunable keys (audio + monitor mode + layout), not just monitor-layout.
  • Monitor layout configMONITORS, MONITOR_ORDER, MONITOR_<id>, DYNAMIC_RESOLUTION (+ --monitors, --monitor-order, --dynamic-resolution flags).
  • Lock-leak fix — engine processes + flock now release cleanly on exit.

Fixes

  • FreeRDP 3.30 compatibility (5 flag issues + phantom empty-arg bug).
  • Hyprland 0.56 Lua dispatcher migration (hyprctl keyword/dispatch deprecated).
  • Audio server-playback (/audio-mode:1 = INFO_REMOTECONSOLEAUDIO; xfreerdp3 help mislabeled).
  • Lock-leak (fd 200 inherited by children → flock never released).

Known limitations

  • SDL3 multimon on wlroots: functional but unstable ("not responding" dialog; SDL3 can't maintain compositor ping/pong with 3 fullscreen windows). Upstream: FreeRDP issue #12393.
  • No fullscreen spanning: Wayland architecture prevents a single surface from crossing monitor boundaries (all 3 clients affected).
  • Audio redirect to client: broken in the Arch freerdp package (pipewire backend not compiled; pulse/alsa compiled but non-functional). Use AUDIO_REDIRECT=0 (server playback) instead.

Full diff: v0.5.0...v0.6.0

v0.5.0 — FreeRDP 3.30 + Hyprland 0.56, audio server-playback, monitor config

Choose a tag to compare

@hbuddenberg hbuddenberg released this 23 Jul 17:26

Highlights

A full session making rdp-connect actually work on a current Arch + Hyprland stack (FreeRDP 3.30, Hyprland 0.56), plus profile-driven audio/monitor control and operational tooling. All additive — no breaking changes to existing profiles.

Fixes

  • FreeRDP 3.30.0 compatibility — the engine's xfreerdp3 invocation targeted an older build and died with the opaque setsid: child N did not exit normally: Success. Five root causes isolated empirically: dropped flags (/async-input, /async-transport, /camera), renamed /reconnect-max-retries:/auto-reconnect-max-retries:, a phantom empty argv token from "${DPI_FLAGS[@]-}" (bash empty-array - gotcha), and the pipewire sound addin that fails to load on the Arch build.
  • Lock-leak — when xfreerdp3 exited, engine processes held the per-profile flock (fd 200 inherited by children + the engine blocked on pipe EOF), so the next run hit the "instancia activa" guard. Now fd 200 is closed in every child and the engine waits on the xfreerdp3 PID, not the pipe.
  • Installerfreerdp3freerdp (correct Arch package name; the old name made ./install-rdp-framework.sh fail with target not found).

Features

  • Audio server-playbackAUDIO_REDIRECT=0 (or --no-audio) emits /audio-mode:1 (sets INFO_REMOTECONSOLEAUDIO) so the remote machine's audio plays on its OWN speakers (mstsc "Play on remote computer"). Note: the xfreerdp3 /? help MISLABELS /audio-mode (:2 disables, :1 is server) — pinned to the source mapping.
  • Monitor layout configMONITORS (count), MONITOR_ORDER (id order), MONITOR_<id> (resolution, single mode), DYNAMIC_RESOLUTION (windowed, live resize via +dynamic-resolution). Flags: --single-mon / --multi-mon / --monitors / --monitor-order / --dynamic-resolution. Single-mode renders at native res (/size) so a 2K monitor isn't shown as HD.
  • Hyprland 0.56 Lua dispatcher migrationhyprctl keyword and legacy dispatch <x> <args> are deprecated on 0.55+; migrated to hl.dsp.* via hyprctl dispatch '<lua>'. A background helper polls for the window then moves/focuses/fullscreens it (the new API is action-based, needs the window to exist).
  • Verbose moderdp-connect -v tees milestones + xfreerdp3 output to stderr (lib log_event extracted for unit-testable tee). No more silent runs ending in an opaque setsid error.
  • Colored --help — rich-like ANSI output (respects NO_COLOR + TTY; degrades to plain).
  • --update-profiles — idempotently migrates existing profiles with the full tunable block (audio + monitor mode + layout), commented, with backup.

Tests

Suite grew with each change; new files installer-deps, freerdp3-flags, verbose-mode, audio-toggle, monitor-mode, monitor-config, hyprland-api, ui-helpers. All green; lint clean.

Full diff: v0.4.0...v0.5.0