From be32a060e7a120b4d6e6c0f9356140698a8940d6 Mon Sep 17 00:00:00 2001 From: Ednunp <29843396+Ednunp@users.noreply.github.com> Date: Wed, 24 Jun 2026 14:47:02 +0100 Subject: [PATCH] Add "double-press to copy status" toggle + document the spoken-status changes (held for next release) Preferences General-tab checkbox "Double-press the speak-status hotkey to copy the status to the clipboard" (Alt+C), machine-wide (AppConfig.DoublePressStatusToCopy), on by default. When off, a double press just reads the status again. SpeakStatusLine reads the flag only when the timing already qualifies, so a normal single press never touches the config. Manual's speak-status section now covers the line-by-line read, GB totals, and the double-press copy + its toggle. Held for the next release. Co-Authored-By: Claude Opus 4.8 --- MANUAL.md | 4 +++- readme.html | 4 +++- src/RemSound.App/MainForm.cs | 7 +++++-- src/RemSound.App/PreferencesDialog.cs | 20 +++++++++++++++++++- src/RemSound.Core/AppConfig.cs | 5 +++++ 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/MANUAL.md b/MANUAL.md index 4e78d31..04671a5 100644 --- a/MANUAL.md +++ b/MANUAL.md @@ -813,7 +813,9 @@ If RemSound was minimised to the system tray when you pressed the hotkey, it swi The main window has a **status line** that updates every second with how long you've been connected, how many peers you have, whether sound is flowing, and how healthy the connection is. Normally your screen reader reads it like any other text — but now and then, for reasons that have nothing to do with RemSound, a screen reader loses sight of it and says there's nothing there. -This hotkey is the cure. Give **Speak the RemSound status information** a key in the Keyboard shortcuts dialog, and from then on pressing it reads the whole status line out loud, wherever you are — even when RemSound is tucked away in the tray or another program is in front. It's unset to start with, so the key is yours to choose. +This hotkey is the cure. Give **Speak the RemSound status information** a key in the Keyboard shortcuts dialog, and from then on pressing it reads the whole status out loud, wherever you are — even when RemSound is tucked away in the tray or another program is in front. It's unset to start with, so the key is yours to choose. + +It reads the status out **a line at a time** — peers, ping, uptime, data rates, totals — so each piece lands as its own short phrase rather than one long run-on, and big totals show in gigabytes once they pass a gigabyte. A quick **double press** of the same hotkey **copies the status to the clipboard** instead of reading it, so you can paste it to someone if you're comparing notes. If you'd rather a double press just read it again, untick **Double-press the speak-status hotkey to copy the status to the clipboard** on the **General** tab of Preferences (it's on by default). This one is just for screen-reader users: it talks straight through your screen reader. It works with the screen readers RemSound's speech helper supports — **NVDA** , JAWS, Window-Eyes, System Access, SuperNova and ZoomText — and falls back to Windows' own built-in speech if none of those is running. If you don't use a screen reader, just leave this one unset. diff --git a/readme.html b/readme.html index 1b94742..0a63e21 100644 --- a/readme.html +++ b/readme.html @@ -858,7 +858,9 @@ Audient USB Audio ASIO Driver — Pair 3 (channels 5/6): Loop-back 1 (L) / L

The main window has a status line that updates every second with how long you've been connected, how many peers you have, whether sound is flowing, and how healthy the connection is. Normally your screen reader reads it like any other text — but now and then, for reasons that have nothing to do with RemSound, a screen reader loses sight of it and says there's nothing there.

-

This hotkey is the cure. Give Speak the RemSound status information a key in the Keyboard shortcuts dialog, and from then on pressing it reads the whole status line out loud, wherever you are — even when RemSound is tucked away in the tray or another program is in front. It's unset to start with, so the key is yours to choose.

+

This hotkey is the cure. Give Speak the RemSound status information a key in the Keyboard shortcuts dialog, and from then on pressing it reads the whole status out loud, wherever you are — even when RemSound is tucked away in the tray or another program is in front. It's unset to start with, so the key is yours to choose.

+ +

It reads the status out a line at a time — peers, ping, uptime, data rates, totals — so each piece lands as its own short phrase rather than one long run-on, and big totals show in gigabytes once they pass a gigabyte. A quick double press of the same hotkey copies the status to the clipboard instead of reading it, so you can paste it to someone if you're comparing notes. If you'd rather a double press just read it again, untick Double-press the speak-status hotkey to copy the status to the clipboard on the General tab of Preferences (it's on by default).

This one is just for screen-reader users: it talks straight through your screen reader. It works with the screen readers RemSound's speech helper supports — NVDA, JAWS, Window-Eyes, System Access, SuperNova and ZoomText — and falls back to Windows' own built-in speech if none of those is running. If you don't use a screen reader, just leave this one unset.

diff --git a/src/RemSound.App/MainForm.cs b/src/RemSound.App/MainForm.cs index 356681c..5c4947a 100644 --- a/src/RemSound.App/MainForm.cs +++ b/src/RemSound.App/MainForm.cs @@ -3360,13 +3360,16 @@ public sealed class MainForm : Form private void SpeakStatusLine() { var now = DateTime.UtcNow; - var doublePress = now - lastSpeakStatusPressUtc <= TimeSpan.FromMilliseconds(600); + var withinDoublePressWindow = now - lastSpeakStatusPressUtc <= TimeSpan.FromMilliseconds(600); lastSpeakStatusPressUtc = now; var text = statusReadout.Text; if (string.IsNullOrWhiteSpace(text)) text = "No status information available."; - if (doublePress) + // Double press copies to the clipboard — but only if the user has left that on (Preferences → + // General). Read the flag only when the timing already qualifies, so a normal single press never + // touches the config file. + if (withinDoublePressWindow && AppConfig.Load().DoublePressStatusToCopy) { // Second quick press: copy the status to the clipboard so it can be shared. Clipboard access // needs the UI thread — this runs on it (the hotkey is marshalled onto the owner form). diff --git a/src/RemSound.App/PreferencesDialog.cs b/src/RemSound.App/PreferencesDialog.cs index 2a86406..4d02bfe 100644 --- a/src/RemSound.App/PreferencesDialog.cs +++ b/src/RemSound.App/PreferencesDialog.cs @@ -210,6 +210,15 @@ internal sealed class PreferencesDialog : Form AutoSize = true, }; + // Screen-reader convenience (machine-wide, AppConfig). On by default. When off, a double press of + // the speak-status hotkey just reads the status again rather than copying it. + private readonly AccessibleCheckBox doublePressCopyBox = new() + { + Text = "Double-press the speak-status hotkey to copy the status to the clipboard (Alt+&C)", + AccessibleName = "Double-press the speak-status hotkey to copy the status to the clipboard", + AutoSize = true, + }; + // Update settings — startup-check checkbox, frequency dropdown, manual check button, // silent-install checkbox. Sits above the logging row so users meet it during setup; the // canonical order in the dialog is "things related to the program staying current" before @@ -566,6 +575,15 @@ internal sealed class PreferencesDialog : Form silentlyInstallUpdatesBox.Checked = cfgForLoad.SilentlyInstallUpdates; upnpEnabledBox.Checked = cfgForLoad.UpnpEnabled; + // Double-press-the-speak-status-hotkey-to-copy toggle (machine-wide, AppConfig). On by default. + doublePressCopyBox.Checked = cfgForLoad.DoublePressStatusToCopy; + doublePressCopyBox.CheckedChanged += (_, _) => + { + var cfg = AppConfig.Load(); + cfg.DoublePressStatusToCopy = doublePressCopyBox.Checked; + try { cfg.Save(); } catch { /* harmless — choice just won't survive a restart */ } + }; + checkForUpdatesOnStartupBox.CheckedChanged += (_, _) => { var cfg = AppConfig.Load(); @@ -798,7 +816,7 @@ internal sealed class PreferencesDialog : Form // is a field (declared above) so OnShown can focus it when the dialog opens. Logging is its // own tab (2026-06-19); the two logging controls moved off the General tab to lead it. tabs.TabPages.Add(MakeTab("General", - browseProfilesFolderButton, acceptRemoteVolumeBox, upnpEnabledBox, upnpStatusLabel)); + browseProfilesFolderButton, acceptRemoteVolumeBox, upnpEnabledBox, upnpStatusLabel, doublePressCopyBox)); tabs.TabPages.Add(MakeTab("Audio cues", cueGroup)); tabs.TabPages.Add(MakeTab("Startup behaviour", startMinimisedBox, startWithUserBox, startWithProfileBox, startupListPanel)); diff --git a/src/RemSound.Core/AppConfig.cs b/src/RemSound.Core/AppConfig.cs index ef064dc..958ee98 100644 --- a/src/RemSound.Core/AppConfig.cs +++ b/src/RemSound.Core/AppConfig.cs @@ -196,6 +196,11 @@ public sealed class AppConfig public bool? UntickOthersWhenUsingDefaultOutput { get; set; } public bool? UntickOthersWhenUsingDefaultInput { get; set; } + /// If true, pressing the "speak status" global hotkey twice in quick succession copies the + /// status text to the clipboard (instead of just reading it again). On by default; the user can turn + /// it off on the Preferences General tab. Machine-wide; a screen-reader convenience (Andre's idea). + public bool DoublePressStatusToCopy { get; set; } = true; + /// If non-null and a profile with this title exists, RemSound skips the /// startup profile picker and loads this profile directly. Combine with /// + the Windows auto-start registry entry