From 1c97e40a6a3744c888b58a9aa495a6fc4b9a7612 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 1 Jan 2026 04:41:41 -0800 Subject: [PATCH 1/2] Support ctrl+^ -> RS, move to physical key Fixes #2797 Part of #1862 --- src/common/input/Keyboard.test.ts | 4 ++++ src/common/input/Keyboard.ts | 11 +++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/common/input/Keyboard.test.ts b/src/common/input/Keyboard.test.ts index 9bde7594..cc36c1d0 100644 --- a/src/common/input/Keyboard.test.ts +++ b/src/common/input/Keyboard.test.ts @@ -353,5 +353,9 @@ describe('Keyboard', () => { assert.equal(testEvaluateKeyboardEvent({ ctrlKey: true, shiftKey: true, keyCode: 50, key: '@' }).key, '\x00'); }); + it('should return proper sequence for ctrl+^', () => { + assert.equal(testEvaluateKeyboardEvent({ ctrlKey: true, shiftKey: true, keyCode: 54, key: '^' }).key, '\x1e'); + }); + }); }); diff --git a/src/common/input/Keyboard.ts b/src/common/input/Keyboard.ts index 31e66740..32085467 100644 --- a/src/common/input/Keyboard.ts +++ b/src/common/input/Keyboard.ts @@ -360,12 +360,11 @@ export function evaluateKeyboardEvent( // Include only keys that that result in a _single_ character; don't include num lock, // volume up, etc. result.key = ev.key; - } else if (ev.key && ev.ctrlKey) { - if (ev.key === '_') { // ^_ - result.key = C0.US; - } - if (ev.key === '@') { // ^ + shift + 2 = ^ + @ - result.key = C0.NUL; + } else if (ev.key && ev.ctrlKey && ev.shiftKey) { + switch (ev.code) { + case 'Minus': result.key = C0.US; break; // ^_ (Ctrl+Shift+-_ + case 'Digit2': result.key = C0.NUL; break; // ^@ (Ctrl+Shift+2) + case 'Digit6': result.key = C0.RS; break; // ^^ (Ctrl+Shift+6) } } break; From 1caf6dbe50f47e4cc3c58747d1d9001a5dec120d Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 1 Jan 2026 05:19:56 -0800 Subject: [PATCH 2/2] Fix tests --- src/common/input/Keyboard.test.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/common/input/Keyboard.test.ts b/src/common/input/Keyboard.test.ts index cc36c1d0..8c7f0dbc 100644 --- a/src/common/input/Keyboard.test.ts +++ b/src/common/input/Keyboard.test.ts @@ -350,11 +350,15 @@ describe('Keyboard', () => { }); it('should return proper sequence for ctrl+@', () => { - assert.equal(testEvaluateKeyboardEvent({ ctrlKey: true, shiftKey: true, keyCode: 50, key: '@' }).key, '\x00'); + assert.equal(testEvaluateKeyboardEvent({ ctrlKey: true, shiftKey: true, keyCode: 50, code: 'Digit2', key: '@' }).key, '\x00'); }); it('should return proper sequence for ctrl+^', () => { - assert.equal(testEvaluateKeyboardEvent({ ctrlKey: true, shiftKey: true, keyCode: 54, key: '^' }).key, '\x1e'); + assert.equal(testEvaluateKeyboardEvent({ ctrlKey: true, shiftKey: true, keyCode: 54, code: 'Digit6', key: '^' }).key, '\x1e'); + }); + + it('should return proper sequence for ctrl+_', () => { + assert.equal(testEvaluateKeyboardEvent({ ctrlKey: true, shiftKey: true, keyCode: 189, code: 'Minus', key: '_' }).key, '\x1f'); }); });