Ctrl+1..9 to jump to a tab by its current position (main window + Preferences)

Ctrl and a number selects the Nth tab as it currently appears — positions are live, so they follow
the user's tab reordering and the pan/EQ tab's show/hide. Handled in ProcessCmdKey on both the main
window and the Preferences dialog; focuses the tab strip afterwards so NVDA reads the new tab (like
Ctrl+Tab). Matches Andre's readout app. Manual updated.

Build clean; --selftest passes; deployed to both test folders. Held for next release.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Ednunp
2026-07-08 14:31:22 +01:00
co-authored by Claude Opus 4.8
parent 597b002f01
commit fcc3cdc793
4 changed files with 46 additions and 4 deletions
+3 -2
View File
@@ -761,7 +761,7 @@ Both Opus choices can automatically repair a single missing packet (see the sect
## 15. Keyboard shortcuts (within the main window)
Each tab has its own Alt+letter shortcuts. The same letter can do different things on different tabs without clashing — the shortcuts only work on the tab that's showing. Move between tabs with Ctrl+Tab and Ctrl+Shift+Tab.
Each tab has its own Alt+letter shortcuts. The same letter can do different things on different tabs without clashing — the shortcuts only work on the tab that's showing. Move between tabs with Ctrl+Tab and Ctrl+Shift+Tab, or jump straight to one with Ctrl and its number (Ctrl+1 for the first tab, and so on — the numbers follow whatever order you've set the tabs in).
### Connectivity tab
@@ -854,6 +854,7 @@ Key| Action
---|---
**F1**| **Open this manual** in your default web browser. Works anywhere in RemSound — the main window, every dialog, and the profile picker on first launch.
Ctrl+Tab / Ctrl+Shift+Tab| Move to the next / previous tab
Ctrl+1…Ctrl+9| Jump straight to a tab by its position — Ctrl+1 is the first tab, Ctrl+2 the second, and so on. The number follows the current order, so if you reorder the tabs (Preferences → Appearance) the numbers move with them. Works in the main window and in the Preferences dialog.
Tab / Shift+Tab| Move between controls within the current tab
Spacebar| Tick or untick an item in any device list, or toggle the focused checkbox
Up / Down| Move between items in any list
@@ -999,7 +1000,7 @@ All of these cues play through your default Windows sound output, which is separ
### The Audio cues tab
Open **File → Preferences** (or Ctrl+P) and go to the **Audio cues** tab. (Preferences is organised into five tabs — General, Audio cues, Startup behaviour, Update settings and Logging — which you move between with Ctrl+Tab, or with the arrow keys when the row of tab names has focus.)
Open **File → Preferences** (or Ctrl+P) and go to the **Audio cues** tab. (Preferences is organised into six tabs — General, Appearance, Audio cues, Startup behaviour, Update settings and Logging — which you move between with Ctrl+Tab, Ctrl and a number, or the arrow keys when the row of tab names has focus.)
The **Audio cue sounds (Alt+N)** list shows every cue by name. Use the up and down arrow keys to move between them — as you land on each cue, RemSound plays its current sound, so you can hear what's set just by arrowing through.
+3 -2
View File
@@ -802,7 +802,7 @@ Audient USB Audio ASIO Driver &mdash; Pair 3 (channels 5/6): Loop-back 1 (L) / L
<h2 id="shortcuts">15. Keyboard shortcuts (within the main window)</h2>
<p>Each tab has its own Alt+letter shortcuts. The same letter can do different things on different tabs without clashing &mdash; the shortcuts only work on the tab that's showing. Move between tabs with Ctrl+Tab and Ctrl+Shift+Tab.</p>
<p>Each tab has its own Alt+letter shortcuts. The same letter can do different things on different tabs without clashing &mdash; the shortcuts only work on the tab that's showing. Move between tabs with Ctrl+Tab and Ctrl+Shift+Tab, or jump straight to one with Ctrl and its number (Ctrl+1 for the first tab, and so on &mdash; the numbers follow whatever order you've set the tabs in).</p>
<h3>Connectivity tab</h3>
<table>
@@ -896,6 +896,7 @@ Audient USB Audio ASIO Driver &mdash; Pair 3 (channels 5/6): Loop-back 1 (L) / L
<tr><th>Key</th><th>Action</th></tr>
<tr><td><strong>F1</strong></td><td><strong>Open this manual</strong> in your default web browser. Works anywhere in RemSound &mdash; the main window, every dialog, and the profile picker on first launch.</td></tr>
<tr><td>Ctrl+Tab / Ctrl+Shift+Tab</td><td>Move to the next / previous tab</td></tr>
<tr><td>Ctrl+1&hellip;Ctrl+9</td><td>Jump straight to a tab by its position &mdash; Ctrl+1 is the first tab, Ctrl+2 the second, and so on. The number follows the current order, so if you reorder the tabs (Preferences &rarr; Appearance) the numbers move with them. Works in the main window and in the Preferences dialog.</td></tr>
<tr><td>Tab / Shift+Tab</td><td>Move between controls within the current tab</td></tr>
<tr><td>Spacebar</td><td>Tick or untick an item in any device list, or toggle the focused checkbox</td></tr>
<tr><td>Up / Down</td><td>Move between items in any list</td></tr>
@@ -1054,7 +1055,7 @@ Use whatever key combinations you prefer (for example Ctrl+Shift+Up / Ctrl+Shift
<h3>The Audio cues tab</h3>
<p>Open <strong>File &rarr; Preferences</strong> (or Ctrl+P) and go to the <strong>Audio cues</strong> tab. (Preferences is organised into five tabs &mdash; General, Audio cues, Startup behaviour, Update settings and Logging &mdash; which you move between with Ctrl+Tab, or with the arrow keys when the row of tab names has focus.)</p>
<p>Open <strong>File &rarr; Preferences</strong> (or Ctrl+P) and go to the <strong>Audio cues</strong> tab. (Preferences is organised into six tabs &mdash; General, Appearance, Audio cues, Startup behaviour, Update settings and Logging &mdash; which you move between with Ctrl+Tab, Ctrl and a number, or the arrow keys when the row of tab names has focus.)</p>
<p>The <strong>Audio cue sounds (Alt+N)</strong> list shows every cue by name. Use the up and down arrow keys to move between them &mdash; as you land on each cue, RemSound plays its current sound, so you can hear what's set just by arrowing through.</p>
+19
View File
@@ -7221,6 +7221,25 @@ public sealed class MainForm : Form
/// </summary>
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
// Ctrl+1..9 — switch to the main tab at that position. Positions are LIVE: they shift as the
// user reorders tabs (Preferences → Appearance) and the pan/EQ tab may be hidden, so the number
// always means "the Nth tab as it currently appears". Same idea as Andre's readout app.
if ((keyData & Keys.Modifiers) == Keys.Control)
{
int tabNum = (keyData & Keys.KeyCode) switch
{
>= Keys.D1 and <= Keys.D9 => (keyData & Keys.KeyCode) - Keys.D1 + 1,
>= Keys.NumPad1 and <= Keys.NumPad9 => (keyData & Keys.KeyCode) - Keys.NumPad1 + 1,
_ => 0,
};
if (tabNum >= 1 && tabNum <= mainTabControl.TabPages.Count)
{
mainTabControl.SelectedIndex = tabNum - 1;
mainTabControl.Focus(); // focus the tab strip so NVDA reads the new tab, like Ctrl+Tab
return true;
}
}
// Defensive gate for the global menu shortcuts that change state (Ctrl+R = toggle
// recording, Ctrl+S = save profile). The default WinForms behaviour fires these
// shortcuts any time the form has keyboard focus — which technically includes the
+21
View File
@@ -1013,6 +1013,27 @@ internal sealed class PreferencesDialog : Form
/// focus event (without the transition WinForms can treat focus as unchanged and stay silent).
/// * NotifyFocus re-fires the MSAA focus event as belt-and-braces.
/// Ctrl+Tab still switches tabs from inside the page.</summary>
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
// Ctrl+1..N switch to that tab by its current position — matches the main window.
if ((keyData & Keys.Modifiers) == Keys.Control)
{
int n = (keyData & Keys.KeyCode) switch
{
>= Keys.D1 and <= Keys.D9 => (keyData & Keys.KeyCode) - Keys.D1 + 1,
>= Keys.NumPad1 and <= Keys.NumPad9 => (keyData & Keys.KeyCode) - Keys.NumPad1 + 1,
_ => 0,
};
if (n >= 1 && n <= tabs.TabPages.Count)
{
tabs.SelectedIndex = n - 1;
tabs.Focus();
return true;
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
protected override void OnShown(EventArgs e)
{
base.OnShown(e);