From 06369274dcff9bfa405d8da63bccea7a4323c230 Mon Sep 17 00:00:00 2001 From: Laurens Bezemer | DodoTech Date: Mon, 24 Aug 2026 15:18:49 +0200 Subject: [PATCH] Let the session address be selected, and copied whole MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The address at the head of the session column is the one place the desktop head prints the endpoint it actually dialled, and it was a TextBlock — which in Avalonia is a drawing of a string rather than a string. The next thing people do with an endpoint is paste it somewhere: into a second client, into a ticket, into the ssh command being written in the window beside this one. Retyping is how a digit goes missing from an address that is mostly digits. SelectableTextBlock, which is what the rest of this application already reaches for wherever a string is on screen to be taken away — a fingerprint, a public key, a recovery code, a snippet's command. Nothing else about the row moves: same font, weight, colour and trimming, same tooltip, same close button beside it. The sidebar is one control drawn on both surfaces, so SFTP gets it for the same reason it gets everything else in that block. The trimming and the selection do disagree at the long end, and the fix for that is not to drop the trimming: the ellipsis is there because a long account@host:port would otherwise push the close button off the edge of a panel whose whole point is that it can be got rid of. A drag reaches only the glyphs that were drawn, so a trimmed address has to be taken with select-all — and select-all takes the whole thing, because the ellipsis is a drawing and not a shorter value. That is the half a test can quietly lose, so it is the half the new test asserts, on the longest address the suite has rather than on one that fits and would pass either way. Co-Authored-By: Claude Opus 5 --- .../Views/SessionSidebar.axaml | 21 +++++++++++++--- .../SessionSidebarTests.cs | 25 +++++++++++++++++++ 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/DodoSSH.Client.App/Views/SessionSidebar.axaml b/src/DodoSSH.Client.App/Views/SessionSidebar.axaml index 144ea56..54b7d73 100644 --- a/src/DodoSSH.Client.App/Views/SessionSidebar.axaml +++ b/src/DodoSSH.Client.App/Views/SessionSidebar.axaml @@ -70,12 +70,25 @@ The address, and the button that closes the column. Both on one row, and the address is the trimming one: a long account@host:port is exactly the string that would otherwise push the close button off the edge of a panel whose whole point is that it can be got rid of. + + SelectableTextBlock rather than TextBlock, which is what the rest of this application already + reaches for whenever a string is on screen to be taken somewhere else — a fingerprint, a public + key, a recovery code. This is the one place the shell prints the endpoint it actually dialled, + and the endpoint is a thing people paste: into another client, into a ticket, into the ssh + command they are writing beside this window. Retyping it off the screen is how a digit gets + dropped from an address that is mostly digits. + + The trimming and the selection do disagree at the long end, and the ToolTip is why the + disagreement is tolerable rather than a trap: a drag reaches only the glyphs that were drawn, + so an address wearing an ellipsis has to be taken with select-all — Ctrl+A, then Ctrl+C — and + the hover already shows what the full string is, so nobody is copying half of one without + having been told there is a half. --> - +