Skip to content

v0.20.7

Choose a tag to compare

@github-actions github-actions released this 22 Aug 23:23
· 3 commits to main since this release

What's Changed

Fixed

  • SSH sessions offered no way to reconnect once the connection ended (issue #297) — when a session exited or dropped, the "Session disconnected / Reconnect" banner never appeared, and neither did the sidebar's offline indicator, the history record, the post-disconnect task, nor auto-reconnect. TerminalNotebook::connect_child_exited keeps one handler per session and disconnects the previous one, which is what stops an in-place reconnect from running the whole disconnect path once per reconnect the session has ever had (0.20.0). But four unrelated parts of the app watch that same signal — the disconnect path, the activity monitor, and two session-logging flushes — so keying by session alone left only whichever registered last. Session logging wires its handlers from an async callback, i.e. after the disconnect path, so on any connection with logging enabled the sole surviving handler was a logger.flush(): the tab looked alive and nothing offered a reconnect. Handlers are now keyed by purpose as well as by session, so a re-registration replaces its own predecessor and leaves the others attached. A handler that cannot be attached at all (no terminal for the session) now warns instead of returning silently, which is how this stayed invisible for two releases.

  • Cloned connections could not be edited and their right-click menu did not open (issue #298) — three silent failures in the sidebar's per-row right-click handler, all reachable after a clone because duplicating rebuilds the entire connection tree and therefore recycles every row widget. A recycled GtkListItem reports GTK_INVALID_LIST_POSITION, and that value was handed straight to the selection model, which clears the selection rather than moving it — after which Edit, Rename, Duplicate and Delete all returned without doing anything, since each of them re-resolves its target through the selection. The row is now located in the model by identity whenever the list item does not know its own position, and the row itself is resolved from the GtkTreeExpander when the list item carries no data. Beyond that, a press the handler could not resolve produced no menu and no log line, yet still claimed the event sequence — which cancelled the ListView-level fallback gesture that resolves the row from the pointer position and would very likely have succeeded. Unresolved presses are now left unclaimed and every failure path says what it could not resolve.

  • Sidebar context menu opened and vanished within a frame on GNOME Wayland (issue #299) — reported on Fedora 44 / GNOME Shell 50.4 / GTK 4.22, where right-clicking a saved connection flashed the menu and lost it 7–27 ms later, for every protocol, at every nesting depth, with the set of working rows changing between runs. Two independent causes. The popover was parented to the row's GtkTreeExpander — a widget ListView recycles, re-realizes and re-allocates — and a popover is a native surface tied to its parent, so any of that unmaps the menu roughly one frame after it opened. That is why forcing GSK_RENDERER=cairo or software GL changed how often it happened without fixing it: it changed the frame timing, not the anchor. Menus are now parented to the enclosing ScrolledWindow, which is never recycled, with the click point translated into its coordinates. Separately, the per-row menu used autohide=false so that moving the menu between rows costs one right-click instead of two (#87); a Wayland compositor cancels a grab-less xdg_popup on the focus change that follows the click, and the deferred autohide=true retry can never rescue it because a grab has to be requested against the serial of a live input event (#157). Wayland sessions therefore take the grab from the start. Any environment that still cancels a grab-less menu now switches to a grab for the rest of the session after the first attempt, instead of retrying the same doomed re-popup on every menu.

Changed

  • Moving the sidebar context menu between rows takes a second right-click on Wayland — a direct consequence of the #299 fix: the menu now holds the input grab, so the click that dismisses it is consumed by the compositor instead of reaching the next row. This is how GTK 4 context menus behave on Wayland generally, and it replaces a menu that could not be opened at all. X11 sessions keep the one-click behaviour.

Dependencies

  • Updated: cc 1.4.3→1.4.4, cfg-expr 0.20.8→0.20.9, crc32fast 1.5.0→1.5.1, font-types 0.12.3→0.12.4, icu_provider 2.3.0→2.3.1, keccak 0.2.1→0.2.2, log 0.4.33→0.4.34, rustls-webpki 0.103.14→0.103.15, uuid 1.24.1→1.25.0, zerovec-derive 0.11.5→0.11.6. cargo deny check advisories reports no known vulnerabilities. Seventeen further crates sit behind their latest release but cannot move: they are held at -rc or exact versions by constraints elsewhere in the graph (the RustCrypto stack pinned through ironrdp, picky and sspi), so they need an upstream release rather than a lockfile change.

  • Audited, no change needed: GNOME runtime 50 is still the newest branch published on Flathub, and every bundled pinned source is at its latest upstream release — FreeRDP 3.30.0, cJSON 1.7.19, openh264 2.6.0, mc 4.8.33, inetutils 2.8, picocom 3.1. VTE stays pinned below 0.81 by design. The Flathub manifest matches the local one, cargo-sources.json was regenerated from the updated lockfile and both copies are identical. TigerVNC — the only pinned CLI download — is current at 1.16.2, and every auto-resolving CLI endpoint answered. Snap stays on core24 + gnome-46-2404: the GNOME extension is still only available for core22 and core24, so the core26 base that Snapcraft 9 now supports remains out of reach (issue #174).

Internal

  • A property test asserted something the code deliberately does not guaranteemove_to_root_always_succeeds claimed that moving a group to the root always succeeds, but move_group refuses a destination that already holds a folder of the same name, compared case-insensitively. A generated parent/child pair differing only in case ("q" and "Q") therefore made it fail, which it finally did while validating this release. Renamed to move_to_root_succeeds_unless_the_name_is_taken, and the expected outcome now comes from the manager's own sibling_group_name_exists instead of being assumed — a refused move is asserted to leave the group where it was, and the hierarchy is checked in both branches. The behaviour under test is unchanged.

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

Fedora (.rpm from this release)

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

AppImage

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