From 1ff84e229b8e7777bbec35d17fef5af0a2b626e5 Mon Sep 17 00:00:00 2001 From: louisbar Date: Wed, 17 Apr 2024 19:57:52 -0400 Subject: [PATCH] Added macOptionIsEscape according to #4904 --- src/browser/Terminal.ts | 6 +++--- src/common/input/Keyboard.test.ts | 15 +++++++++++++-- src/common/input/Keyboard.ts | 11 ++++++++--- src/common/services/OptionsService.ts | 1 + 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/browser/Terminal.ts b/src/browser/Terminal.ts index 0e945aa92b..5da65c617f 100644 --- a/src/browser/Terminal.ts +++ b/src/browser/Terminal.ts @@ -1007,7 +1007,7 @@ export class Terminal extends CoreTerminal implements ITerminal { } // Ignore composing with Alt key on Mac when macOptionIsMeta is enabled - const shouldIgnoreComposition = this.browser.isMac && this.options.macOptionIsMeta && event.altKey; + const shouldIgnoreComposition = this.browser.isMac && this.options.macOptionIsMeta && this.options.macOptionIsEscape && event.altKey; if (!shouldIgnoreComposition && !this._compositionHelper!.keydown(event)) { if (this.options.scrollOnUserInput && this.buffer.ybase !== this.buffer.ydisp) { @@ -1020,7 +1020,7 @@ export class Terminal extends CoreTerminal implements ITerminal { this._unprocessedDeadKey = true; } - const result = evaluateKeyboardEvent(event, this.coreService.decPrivateModes.applicationCursorKeys, this.browser.isMac, this.options.macOptionIsMeta); + const result = evaluateKeyboardEvent(event, this.coreService.decPrivateModes.applicationCursorKeys, this.browser.isMac, this.options.macOptionIsMeta, this.options.macOptionIsEscape); this.updateCursorStyle(event); @@ -1084,7 +1084,7 @@ export class Terminal extends CoreTerminal implements ITerminal { private _isThirdLevelShift(browser: IBrowser, ev: KeyboardEvent): boolean { const thirdLevelKey = - (browser.isMac && !this.options.macOptionIsMeta && ev.altKey && !ev.ctrlKey && !ev.metaKey) || + (browser.isMac && !this.options.macOptionIsMeta && !this.options.macOptionIsEscape && ev.altKey && !ev.ctrlKey && !ev.metaKey) || (browser.isWindows && ev.altKey && ev.ctrlKey && !ev.metaKey) || (browser.isWindows && ev.getModifierState('AltGraph')); diff --git a/src/common/input/Keyboard.test.ts b/src/common/input/Keyboard.test.ts index c598fc58c0..db0def4954 100644 --- a/src/common/input/Keyboard.test.ts +++ b/src/common/input/Keyboard.test.ts @@ -20,6 +20,7 @@ function testEvaluateKeyboardEvent(partialEvent: { applicationCursorMode?: boolean; isMac?: boolean; macOptionIsMeta?: boolean; + macOptionIsEscape?: boolean; } = {}): IKeyboardResult { const event: IKeyboardEvent = { altKey: partialEvent.altKey || false, @@ -34,9 +35,10 @@ function testEvaluateKeyboardEvent(partialEvent: { const options = { applicationCursorMode: partialOptions.applicationCursorMode || false, isMac: partialOptions.isMac || false, - macOptionIsMeta: partialOptions.macOptionIsMeta || false + macOptionIsMeta: partialOptions.macOptionIsMeta || false, + macOptionIsEscape: partialOptions.macOptionIsEscape || false }; - return evaluateKeyboardEvent(event, options.applicationCursorMode, options.isMac, options.macOptionIsMeta); + return evaluateKeyboardEvent(event, options.applicationCursorMode, options.isMac, options.macOptionIsMeta, options.macOptionIsEscape); } describe('Keyboard', () => { @@ -175,6 +177,15 @@ describe('Keyboard', () => { assert.equal(testEvaluateKeyboardEvent({ altKey: true, keyCode: 13 }, { isMac: true, macOptionIsMeta: true }).key, '\x1b\r'); }); }); + describe('with macOptionIsEscape', () => { + it('should return \\x80 for alt+@', () => { + assert.equal(testEvaluateKeyboardEvent({ altKey: true, keyCode: 64 }, { isMac: true, macOptionIsEscape: true }).key, '\x80'); + }); + + it('should return \\x9F for alt+_', () => { + assert.equal(testEvaluateKeyboardEvent({ altKey: true, keyCode: 95 }, { isMac: true, macOptionIsEscape: true }).key, '\x9F'); + }); + }); it('should return \\x1b[5A for alt+up', () => { assert.equal(testEvaluateKeyboardEvent({ altKey: true, keyCode: 38 }).key, '\x1b[1;5A'); // CSI 5 A diff --git a/src/common/input/Keyboard.ts b/src/common/input/Keyboard.ts index b86eeac468..fb75e2ab8f 100644 --- a/src/common/input/Keyboard.ts +++ b/src/common/input/Keyboard.ts @@ -39,7 +39,8 @@ export function evaluateKeyboardEvent( ev: IKeyboardEvent, applicationCursorMode: boolean, isMac: boolean, - macOptionIsMeta: boolean + macOptionIsMeta: boolean, + macOptionIsEscape: boolean ): IKeyboardResult { const result: IKeyboardResult = { type: KeyboardResultType.SEND_KEY, @@ -346,11 +347,15 @@ export function evaluateKeyboardEvent( } else if (ev.keyCode === 221) { result.key = C0.GS; } - } else if ((!isMac || macOptionIsMeta) && ev.altKey && !ev.metaKey) { + } else if ((!isMac || macOptionIsMeta || macOptionIsEscape) && ev.altKey && !ev.metaKey) { // On macOS this is a third level shift when !macOptionIsMeta. Use instead. const keyMapping = KEYCODE_KEY_MAPPINGS[ev.keyCode]; const key = keyMapping?.[!ev.shiftKey ? 0 : 1]; - if (key) { + if (macOptionIsEscape && ev.keyCode >= 64 && ev.keyCode <= 95) { + result.key = String.fromCharCode(128 + ev.keyCode - 64); + console.log(12); + } + else if (key) { result.key = C0.ESC + key; } else if (ev.keyCode >= 65 && ev.keyCode <= 90) { const keyCode = ev.ctrlKey ? ev.keyCode - 64 : ev.keyCode + 32; diff --git a/src/common/services/OptionsService.ts b/src/common/services/OptionsService.ts index 0375f6addb..85c395266e 100644 --- a/src/common/services/OptionsService.ts +++ b/src/common/services/OptionsService.ts @@ -36,6 +36,7 @@ export const DEFAULT_OPTIONS: Readonly> = { scrollSensitivity: 1, screenReaderMode: false, smoothScrollDuration: 0, + macOptionIsEscape: false, macOptionIsMeta: false, macOptionClickForcesSelection: false, minimumContrastRatio: 1,