Skip to content

v0.23.8

Choose a tag to compare

@github-actions github-actions released this 10 Oct 15:48
· 64 commits to main since this release

What's Changed

Fixed

  • Recording manager failures are surfaced instead of silently swallowed — in the Recordings dialog, a failure to rename or delete a recording returned early after only a tracing::warn!, so the dialog closed, nothing changed on disk, and the user was given no reason. Both now raise a modal adw::AlertDialog (Could Not Rename Recording / Could Not Delete Recording) with the underlying error, per the project's own error-feedback decision rule (a failed user-triggered data operation belongs in a dialog, never in logs only). A failure to list the recordings folder likewise returned into an empty list indistinguishable from "no recordings"; it now swaps the list placeholder to a dialog-warning-symbolic status page (Could Not Load Recordings) naming the read error, so a load failure is visibly different from an empty folder. (rustconn/src/dialogs/recording.rs)
  • Tunnel stop and delete-save failures are no longer silent — stopping a tunnel from the Tunnels dialog logged a failure only to tracing; it now shows an error toast (Could not stop tunnel '…'), consistent with the start path which already surfaced a dialog. More importantly, a failure to save settings after deleting a standalone tunnel was swallowed, so the deletion silently reappeared on next launch; it now raises a modal Could Not Save Changes dialog warning that the change may return. (rustconn/src/dialogs/tunnel.rs)
  • Adding an SSH key reports failure in a dialog, not a toast — a failed ssh-add in Settings → SSH Agent showed a dismissable error toast while its two sibling failure paths in the same tab used a modal alert::show_error. A security action that did not take effect is now reported through the modal dialog (Could Not Add Key), matching the siblings and the GNOME HIG error-feedback rule. (rustconn/src/dialogs/settings/ssh_agent_tab.rs)
  • The "Enable Cloud Sync?" confirmation now has a default response — the dialog set a close response (Escape → Cancel) but no default_response, so Enter did nothing and the initial focus was undefined, unlike every sibling confirmation. Cancel is now the default (the safe action), per the GNOME HIG. (rustconn/src/window/edit_group.rs)
  • The new-theme name prompt can no longer be dismissed into a silent no-op — entering an empty name and pressing Create (or Enter) quietly closed the terminal-theme prompt doing nothing. The Create response now stays disabled until the name is non-empty, so the action can never be silently discarded. (rustconn/src/dialogs/settings/terminal_tab.rs)
  • The Theme Editor dialog is wide enough to read its colour rows — the editor's adw::AlertDialog grew only to its natural width, leaving the colour rows cramped. AlertDialog exposes no content_width, so the width is now set through the embedded ScrolledWindow's min/max_content_width (420–480), the documented GNOME HIG technique for widening a message dialog whose extra_child is meant to be read. (rustconn/src/dialogs/settings/terminal_tab.rs)
  • The On-startup "open a connection" picker is now type-to-search — the Interface tab's startup-action ComboRow lists one entry per saved connection and can get long, so it now carries the same type-to-search the jump-host picker uses (a PropertyExpression over the StringList plus set_enable_search), instead of a scroll-only popup. (rustconn/src/dialogs/settings/ui_tab.rs)

Changed

  • Settings rows migrated to native libadwaita rows — the Terminal tab's font-size and scrollback spinners are now adw::SpinRows, and the theme / language / startup-action selectors in the Terminal and Interface tabs are now adw::ComboRows, replacing hand-built SpinButton/DropDown rows. The result sizes, aligns and themes exactly like every other row in the preferences window, follows the GNOME HIG, and drops bespoke row-assembly code. No behaviour change beyond the native look and the searchable startup picker noted above. (rustconn/src/dialogs/settings/{mod,terminal_tab,ui_tab}.rs)
  • Password fields now use revealable native password rows — the connection editor's password field is now an adw::PasswordEntryRow and the Variables dialog's secret-value field a gtk4::PasswordEntry, each with the standard reveal (eye) toggle, in place of hand-built masked entries. The value stays masked by default and is handled as a SecretString as before; the only change is the native widget and its built-in show/hide control. (rustconn/src/dialogs/connection/dialog/passwords.rs, rustconn/src/dialogs/connection/general_tab.rs, rustconn/src/dialogs/variables.rs)
  • Embedded RDP/VNC status screens follow the light/dark theme — the "no connection / connecting / external window" placeholder screens of the embedded RDP and VNC viewers were cairo-painted with a fixed dark rgb(0.12, 0.12, 0.14) background and near-white text, ignoring the GTK theme, so on a light desktop they rendered as a black rectangle (and the .vnc-display CSS background was painted over, making it dead). The placeholder background and body text now derive from the active theme via a new utils::placeholder_surface_colors() helper keyed on adw::StyleManager::is_dark(); the status accent colours (green/yellow/red/blue state dots) stay fixed because they encode meaning. The dark letterbox around live video and the stale-frame dim (#248) stay fixed-dark on purpose, since a dark border/wash behind actual video is standard. (rustconn/src/embedded_rdp/{ui,drawing}.rs, rustconn/src/embedded_vnc/ui.rs, rustconn/src/utils.rs)
  • Split-view pane actions have a keyboard and hidden-header route (GNOME HIG) — the occupied-pane Close / Remove-from-Split actions lived only inside the hover-reveal overlay and the pane-header context menu. With no keyboard path, and with the header hidden when connection-name labels are off, a keyboard-only user — or a user who had turned off both the labels and the hover controls — could be left with no way to dismantle a pane. The pane context menu's action group is now mirrored onto the always-present, focusable pane container, and Shift+F10 / the Menu key open the same menu anchored to the pane, so Reconnect / Remove from Split / Remove Split / Close Connection are reachable from the keyboard regardless of header or hover-control visibility. The pointer right-click and touch long-press on the header are unchanged, so VTE's native Copy/Paste menu is still intact (#84). (rustconn/src/split_view/adapter.rs)
  • Window minimum height lowered to the HIG phone-portrait floor — the main window requested a 400px minimum height while its width floor was already refined down to the measured narrow-tier minimum (≥360). The height request is now 294, so the window can shrink to the GNOME HIG adaptive 360×294 phone-portrait size. (rustconn/src/window/mod.rs)
  • Writing-style polish in Settings — the Monitoring tab's "System info" switch is now "System information" (HIG: avoid abbreviations), and the Interface tab's startup-action list uses consistent header caps ("Do Nothing" alongside "Local Shell"). (rustconn/src/dialogs/settings/{monitoring_tab,ui_tab}.rs)

Documentation

  • Internal UI/UX HIG audit of all interface components for the 0.23.8 release; the actionable findings above were applied, and the audit confirmed the rest of the surface (header bars, toolbars, adaptive layout, mandatory shortcuts, icon-button accessibility, AlertDialog safe-defaults, the CSS @media-free tab-bar seam fix) is HIG-compliant.

Dependencies

  • Updated: cc 1.6.0 → 1.7.0, smallvec 1.16.2 → 1.16.3, syn 3.0.6 → 3.0.7, uuid 1.27.0 → 1.28.0. All semver-compatible patch/minor bumps; no security advisories affected (cargo deny check advisories clean). CLI download versions all current (TigerVNC pinned at 1.16.2); the RustCrypto release-candidate family (aes-gcm, ecdsa, rsa, picky, x25519-dalek, …) and the out-of-range majors (zip 8→9, x509-cert 0.2→0.3) remain held back, pinned transitively by the sspi/picky-krb stack exactly as in 0.23.1–0.23.7; picky-krb 0.12.5 stays held at 0.12.4 for the same reason (its GssApiMessageError variant breaks the pinned sspi 0.21.3). The Flatpak/Flathub manifests are in sync (GNOME runtime 51, FreeRDP 3.32.1, cJSON 1.7.19, OpenH264 2.6.0).

Installation

Flatpak (Recommended)

flatpak install flathub io.github.totoshko88.RustConn

Snap

sudo snap install rustconn

Debian/Ubuntu (.deb from this release)

sudo dpkg -i rustconn_0.23.8_amd64.deb
sudo apt-get install -f  # Install dependencies if needed

Fedora (.rpm from this release)

sudo dnf install rustconn-0.23.8-1.fc44.x86_64.rpm

AppImage

chmod +x RustConn-0.23.8-x86_64.AppImage
./RustConn-0.23.8-x86_64.AppImage

macOS (Homebrew)

brew tap totoshko88/rustconn
brew install rustconn
open $(brew --prefix)/opt/rustconn/RustConn.app

All dependencies (GTK4, libadwaita, VTE, Adwaita icons) are installed automatically.
Requires macOS 13 (Ventura) or later.

OBS Repositories

Packages available at: https://build.opensuse.org/package/show/home:totoshko88:rustconn/rustconn

# Debian 13 (Trixie)
echo 'deb http://download.opensuse.org/repositories/home:/totoshko88:/rustconn/Debian_13/ /' \
  | sudo tee /etc/apt/sources.list.d/rustconn.list
curl -fsSL https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/Debian_13/Release.key \
  | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/rustconn.gpg > /dev/null
sudo apt update && sudo apt install rustconn

# Ubuntu 24.04 LTS (Noble)
echo 'deb http://download.opensuse.org/repositories/home:/totoshko88:/rustconn/xUbuntu_24.04/ /' \
  | sudo tee /etc/apt/sources.list.d/rustconn.list
curl -fsSL https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/xUbuntu_24.04/Release.key \
  | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/rustconn.gpg > /dev/null
sudo apt update && sudo apt install rustconn

# Ubuntu 26.04 LTS (Resolute)
echo 'deb http://download.opensuse.org/repositories/home:/totoshko88:/rustconn/xUbuntu_26.04/ /' \
  | sudo tee /etc/apt/sources.list.d/rustconn.list
curl -fsSL https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/xUbuntu_26.04/Release.key \
  | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/rustconn.gpg > /dev/null
sudo apt update && sudo apt install rustconn

# Fedora 44
sudo dnf config-manager addrepo --from-repofile=https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/Fedora_44/home:totoshko88:rustconn.repo
sudo dnf install rustconn

# Fedora 43
sudo dnf config-manager addrepo --from-repofile=https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/Fedora_43/home:totoshko88:rustconn.repo
sudo dnf install rustconn

# openSUSE Tumbleweed
sudo zypper ar https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/openSUSE_Tumbleweed/ rustconn
sudo zypper ref && sudo zypper in rustconn

# openSUSE Leap 16.0
sudo zypper ar https://download.opensuse.org/repositories/home:/totoshko88:/rustconn/openSUSE_Leap_16.0/ rustconn
sudo zypper ref && sudo zypper in rustconn

Arch Linux (AUR)

yay -S rustconn

FreeBSD (Ports)

pkg install rustconn

Full installation guide: https://github.com/totoshko88/RustConn/blob/main/docs/INSTALL.md

Verifying your download

Every binary on this release (deb, rpm, AppImage, Flatpak) is covered two ways.

Plain checksums — download SHA256SUMS alongside the asset, then:

sha256sum -c SHA256SUMS

Signed build provenance (SLSA, via Sigstore) — proves the file was built by this
workflow from this commit:

gh attestation verify RustConn-0.23.8-x86_64.AppImage --repo totoshko88/RustConn

(The snap is signed by the Snap Store; the macOS build is delivered via the Homebrew tap.)