v0.15.13
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.quitaction (which bypassesclose_request) share the same dialog - Recording indicator in the sidebar — a red
media-record-symbolicdot (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 newon_recording_changednotebook 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::Bannerbelow 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 menu —
GestureLongPress(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-cligrantedpassword-manager-service— the CLI could not reach the system keyring (rustconn-cli secretfailed 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 noble —
packaging/obs/AppImageBuilder.ymlstill 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.*t64package renames); test images that cannot run a noble-based AppImage (fedora-30, ubuntu-focal) removed - Supply-chain hygiene for CI downloads —
flatpak-cargo-generator.py(3 workflows) andlinuxdeploy-plugin-gtk.share 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 atar -tzfintegrity check - CI cargo caches can seed each other — all six cache blocks now share a
restore-keysfallback, 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 buildnow passes--offline(belt-and-suspenders on top of vendored sources) and the installed desktop file is checked withdesktop-file-validate(desktop-file-utilsadded to BuildRequires) - OBS debian packaging —
Recommendsnow listsfreerdp3-x11 | freerdp3-waylandalternatives (matching the top-level debian/), and a header comment documents the intentional differences between the two debian packagings AppImageBuilder.ymlversion is now synced by workflows — bothobs-update.ymland 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-datablocks 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
GestureClickon eachTreeExpander(CAPTURE phase); on the reporter's environment right-clicks on nested rows never reached that gesture. A fallbackGestureClickon theListViewitself (BUBBLE phase) now resolves the clicked row from the pointer coordinates viapick()— 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 sharedshow_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_itemize→g_object_ref()on a freedPangoFont, hit during VTE's first text measurement of a freshly created terminal (FontInfo::get_unistr_info) inside the GTK snapshot phase. Root cause: VTE readsgtk-fontconfig-timestamponly when it creates its cachedFontInfo(the timestamp is part of the font-cache key) and never subscribes to changes, so after a fontconfig update (font installation,fc-cache, KDE pushingFontconfig/Timestampvia 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 forgtk-fontconfig-timestampchanges and re-applies the font on every open terminal, forcing VTE to rebuild its font cache against the new fontconfig state (vte_terminal_set_fontdeliberately recreates the font even for an unchanged description); (2) all remaining widget/VTE work in thechild-exitedhandler (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 forclose_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.RustConnSnap
sudo snap install rustconnDebian/Ubuntu (.deb from this release)
sudo dpkg -i rustconn_0.15.13_amd64.deb
sudo apt-get install -f # Install dependencies if neededFedora (.rpm from this release)
sudo dnf install rustconn-0.15.13-1.fc44.x86_64.rpmAppImage
chmod +x RustConn-0.15.13-x86_64.AppImage
./RustConn-0.15.13-x86_64.AppImagemacOS (Homebrew)
brew tap totoshko88/rustconn
brew install rustconn
open $(brew --prefix)/opt/rustconn/RustConn.appAll 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 rustconnArch Linux (AUR)
yay -S rustconnFreeBSD (Ports)
pkg install rustconnFull installation guide: https://github.com/totoshko88/RustConn/blob/main/docs/INSTALL.md