What's Changed
Changed
- RDP default quality mode — new RDP connections now default to Quality (RemoteFX) instead of Balanced; existing connections with explicitly saved Balanced or Speed settings are not affected
Fixed
- SPICE fallback viewer reported as failed —
connect_with_fallback()returned an error even when the external SPICE viewer launched successfully; now returnsOk(())so the GUI correctly shows the connected state - SPICE embedded mouse clicks at wrong position — click and release events sent coordinates (0,0) instead of the actual cursor position; now applies the same widget-to-framebuffer coordinate transformation as mouse motion
- RDP file import ignores gateway port —
.rdpparser read gateway port fromgatewayaccesstokeninstead of the standardgatewayportfield; gateway connections now use the correct port - Session type misclassified for terminal protocols — only SSH was classified as embedded; Telnet, Serial, Kubernetes, and MOSH sessions are now correctly classified as terminal-embedded
- MOSH
--sshargument not parsed correctly —--ssh=ssh -p PORTwas passed as a single argument; now split into--sshandssh -p PORTas two separate arguments for correct parsing - MOSH connections accepted port 0 —
validate_connection()now rejects port 0, consistent with SSH and other protocols - Config file corruption on power failure — synchronous
save_toml_filenow callssync_all()before atomic rename, matching the async version's durability guarantee - CLI
deleteauto-confirms in non-interactive mode — piped input no longer auto-confirms destructive operations; use--forceto bypass confirmation in scripts - CLI
addallows duplicate connection names — now returns an error if a connection with the same name already exists - CLI
group deleteleaves orphaned connections — connections belonging to a deleted group now have theirgroup_idcleared - CLI
updateuses case-sensitive exact match — now usesfind_connectionfor case-insensitive and fuzzy matching, consistent with other commands - FreeRDP 2.x flagged as version-incompatible — detection entries for
wlfreerdp/xfreerdp(2.x) hadmin_version("3.0.0"); corrected to"2.0.0" - External window saves default size instead of current —
setup_close_handlernow useswindow.width()/height()to capture actual dimensions after user resize - Cluster dialog buttons break on layout change — Select All / Deselect All buttons are now stored as struct fields instead of being found via fragile
parent()traversal - Whitespace-only group and snippet names accepted —
validate_groupandvalidate_snippetnow trim names before checking emptiness - Tray dirty-check hash collision — replaced simple timestamp sum with
DefaultHashercombining connection IDs and timestamps Connection::default_portduplicatedProtocolType::default_port— now delegates toself.protocol.default_port()
Security
- Script credential resolver password not zeroed — intermediate
Stringholding the password from script output is now zeroed viazeroize::Zeroizeafter wrapping inSecretString - Encrypted credential changes not detected —
SecretSettings::PartialEqnow includes all*_encryptedfields so save-if-changed logic detects credential updates
Improved
- Highlight rules performance —
CompiledHighlightRulesnow usesRegexSetfor fast initial filtering before running individual regexes; avoids executing every pattern on every terminal line - Command palette sort performance —
SearchEngineis now created once before sorting instead of inside every comparator call - GTK main loop polling —
poll_for_resultusestimeout_add_localat 16ms intervals instead ofidle_add_local_onceto avoid busy-spinning - Terminal themes cached —
all_themes()andtheme_names()useOnceLockto avoid repeated allocation - Fuzzy search allocation —
fuzzy_score_optimizedreplacedto_lowercase()with allocation-free case-insensitive search - Export runs on background thread — large exports no longer freeze the UI
- CLI download default allocation — reduced from 10MB to 1MB for small downloads
- Group descendant collection —
collect_descendant_groupsusesHashSetfor O(1) lookups instead of O(n)Vec::contains parse_argssupports quoted strings — usesshell_words::split()so RDP arguments with spaces and quotes are parsed correctly- Tray menu translated — all tray menu strings wrapped in
i18n() - Password generator tips translated — security tip strings wrapped in
i18n() - Session restore version validation —
from_jsonnow warns on version mismatch for forward compatibility - ZeroTrust protocol registry documented —
get_by_type()explains that ZeroTrust delegates to provider-specific protocols - Wayland subsurface code documented — dead Wayland native paths annotated as future extension points
- Duplicate CSS rules removed —
.status-connectedand.status-connectingwere defined twice in sidebar CSS - Dead Flatpak config helpers removed — unused
get_flatpak_boundary_config_dirandget_flatpak_cloudflared_config_dir CredentialResolutionContextstruct — replaces 8-argument function with a bundled context struct- Embedded RDP 4K performance — replaced per-frame 33MB pixel buffer clone (
data.to_vec()) with a persistent CairoImageSurfacethat is updated in-place viasurface.data()+mark_dirty_rectangle(); eliminates the main bottleneck that caused near-slideshow rendering at 4K resolution; oldPixelBufferpath kept as fallback for FreeRDP external mode - RDP frame extraction optimized —
extract_region_datareplaced per-pixel copy+swap loop with row-basedmemcpy+ bulk R↔B channel swap; full-frame fast path avoids row-by-row copy when region covers entire image; LLVM auto-vectorizes the swap loop into SIMD on x86_64 - RDP cursor artifacts (random pixels below cursor) — cursor bitmaps from IronRDP are padded to 32×32 or 64×64 with transparent rows; on HiDPI the downscale + compositor upscale caused color bleeding at transparency edges; now crops transparent padding before downscale and uses premultiplied alpha (
B8g8r8a8Premultiplied) to prevent bleed; R↔B channel swap moved from session layer to cursor handler to avoid double-swap
Installation
Debian/Ubuntu
sudo dpkg -i rustconn_0.10.7_amd64.deb
sudo apt-get install -f # Install dependencies if neededFedora
sudo dnf install rustconn-0.10.7-1.fc41.x86_64.rpmAppImage
chmod +x RustConn-0.10.7-x86_64.AppImage
./RustConn-0.10.7-x86_64.AppImageopenSUSE (OBS)
Packages available at: https://build.opensuse.org/package/show/home:totoshko88:rustconn/rustconn
# Tumbleweed
sudo zypper ar https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/openSUSE_Tumbleweed/ rustconn
sudo zypper ref
sudo zypper in rustconn
# Leap 16.0
sudo zypper ar https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/16.0/ rustconn
sudo zypper ref
sudo zypper in rustconn