Skip to content

v0.15.13

Choose a tag to compare

@github-actions github-actions released this 10 Jun 18:09
· 28 commits to main since this release

What's Changed

Added

  • Menu key / Shift+F10 opens the sidebar context menu for the selected row (#157) — standard GNOME HIG keyboard access to the connection/group context menu, anchored to the selected row. Requested as a reliable alternative on systems where right-click on nested rows misbehaves
  • Confirmation before closing with open sessions — closing the window or pressing Ctrl+Q with open session tabs now asks "Close RustConn?" with the number of open tabs instead of silently disconnecting everything. Skipped when minimize-to-tray is enabled (the app keeps running). Both the window close button and the app.quit action (which bypasses close_request) share the same dialog
  • Recording indicator in the sidebar — a red media-record-symbolic dot (with tooltip and screen-reader label) appears next to a connection while any of its sessions is being recorded; recording is privacy-sensitive and must be visible at a glance. Driven by a new on_recording_changed notebook callback so every start/stop path (manual action, auto-record, session end) updates it
  • Import duplicate handling — importing connections whose names already exist now shows a dialog with the duplicate count and the choices Cancel / Skip Duplicates / Import All, instead of silently creating renamed copies
  • Persistent cloud-sync failure banner — sync errors (manual Sync Now and background auto-export, which previously only logged to the journal) now reveal an adw::Banner below the header bar that stays until dismissed or the next successful sync; transient toasts are kept for success messages only (GNOME HIG: banner for state that needs attention)
  • Touch long-press opens the sidebar context menuGestureLongPress (touch-only) on the connection list, sharing the coordinate-based row resolution with the right-click fallback

Improved

  • Context menu keyboard navigation and accessibility — the custom sidebar context menu now supports Up/Down arrow navigation with wrap-around plus Home/End, focuses its first item on open (so the Menu-key path is immediately navigable), highlights the focused item, and announces itself as a menu (AccessibleRole::Menu / MenuItem) to screen readers
  • Error message quality (GNOME HIG writing style) — removed "Please" from 10 validation messages (imperative voice), replaced three generic "OK" buttons with "Close", and rewrote raw error surfaces ("Error: {e}", "Unknown error", "Error loading log file") to explain what happened and what to do next; export/log-file failures now name the likely cause (permissions, disk space, moved/deleted file)
  • Sidebar bottom-toolbar buttons enlarged to the 44×44 px minimum tap target (GNOME HIG pointer & touch); Ukrainian translations added for all new strings

Packaging & CI

  • Snap: rustconn-cli granted password-manager-service — the CLI could not reach the system keyring (rustconn-cli secret failed under strict confinement) while the GUI app could; plugs are now in sync
  • Snap: SSH agent limitation documented honestly — snapd has no interface exposing the host SSH agent socket (unlike Flatpak's --socket=ssh-auth), so agent-based auth cannot work in the snap; docs/SNAP.md previously suggested checking $SSH_AUTH_SOCK, now it documents the limitation, workarounds, and a comparison-table row
  • AppImage recipe migrated from jammy to noblepackaging/obs/AppImageBuilder.yml still targeted Ubuntu 22.04, which never shipped the GTK4 build of VTE, while the released AppImage is already built on ubuntu-24.04 runners; the recipe now matches reality (incl. *t64 package renames); test images that cannot run a noble-based AppImage (fedora-30, ubuntu-focal) removed
  • Supply-chain hygiene for CI downloadsflatpak-cargo-generator.py (3 workflows) and linuxdeploy-plugin-gtk.sh are now fetched from pinned commits and verified against SHA-256 checksums; linuxdeploy (continuous tag, unstable checksums) gets retry + ELF sanity check; the Homebrew source tarball download gets retry with backoff plus a tar -tzf integrity check
  • CI cargo caches can seed each other — all six cache blocks now share a restore-keys fallback, so check/clippy/test/proptest/MSRV jobs reuse each other's registry and target artifacts instead of rebuilding from scratch on every key miss
  • OBS spec hardening — Fedora/RHEL cargo build now passes --offline (belt-and-suspenders on top of vendored sources) and the installed desktop file is checked with desktop-file-validate (desktop-file-utils added to BuildRequires)
  • OBS debian packagingRecommends now lists freerdp3-x11 | freerdp3-wayland alternatives (matching the top-level debian/), and a header comment documents the intentional differences between the two debian packagings
  • AppImageBuilder.yml version is now synced by workflows — both obs-update.yml and the release OBS job update its version field alongside spec/dsc/_service (previously only the local hook did)
  • Flatpak manifests de-drifted — release and local manifests updated to inetutils 2.8 (Flathub already had it) and got the same x-checker-data blocks as the Flathub manifest (vte, inetutils, picocom, libsecret, mc, freerdp), so flatpak-external-data-checker reports outdated pins on all three manifests consistently

Fixed

  • Sidebar context menu not opening for rows nested deeper than the root level on some systems (reported on KDE Plasma) (#157) — the menu was shown only by a per-row GestureClick on each TreeExpander (CAPTURE phase); on the reporter's environment right-clicks on nested rows never reached that gesture. A fallback GestureClick on the ListView itself (BUBBLE phase) now resolves the clicked row from the pointer coordinates via pick() — independent of per-row event dispatch, so it works at any nesting depth. In the normal case the per-row gesture still fires first and claims the press, cancelling the fallback; when both fire (claim propagation differs between compositors), the result is idempotent — same selection, same menu position. Item-data extraction was deduplicated into a shared show_context_menu_for_connection_item() helper used by the per-row gesture, the fallback, and the new keyboard path

  • Crash (SIGSEGV) in pango when opening a new SSH tab or on screen unlock — follow-up to v0.15.9 (#171) — debug-symbol analysis of all five crash dumps (Ubuntu 24.04 dbgsym for pango 1.52.1 and vte 0.76.0) showed the same use-after-free: pango_itemizeg_object_ref() on a freed PangoFont, hit during VTE's first text measurement of a freshly created terminal (FontInfo::get_unistr_info) inside the GTK snapshot phase. Root cause: VTE reads gtk-fontconfig-timestamp only when it creates its cached FontInfo (the timestamp is part of the font-cache key) and never subscribes to changes, so after a fontconfig update (font installation, fc-cache, KDE pushing Fontconfig/Timestamp via XSettings on screen unlock) terminals keep stale Pango font references — which is why the crash always struck right when a new tab was opened (existing tabs render from VTE's glyph cache and rarely re-itemize) and why a restart always cleared it. Two changes: (1) RustConn now listens for gtk-fontconfig-timestamp changes and re-applies the font on every open terminal, forcing VTE to rebuild its font cache against the new fontconfig state (vte_terminal_set_font deliberately recreates the font even for an unchanged description); (2) all remaining widget/VTE work in the child-exited handler (disconnect indicator, terminal.reset(), reconnect banner, auto-reconnect setup) is now deferred to the next main-loop idle instead of running inside VTE's signal emission, closing the same race the v0.15.9 fix closed for close_tab

Dependencies

  • Updated: crypto-primes 0.7.0→0.7.1, ksni 0.3.4→0.3.5, regex 1.12.3→1.12.4 (with regex-syntax 0.8.10→0.8.11), zerocopy 0.8.50→0.8.52 (with zerocopy-derive)

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.15.13_amd64.deb
sudo apt-get install -f  # Install dependencies if needed

Fedora (.rpm from this release)

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

AppImage

chmod +x RustConn-0.15.13-x86_64.AppImage
./RustConn-0.15.13-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