From cabd0ca3bccdcb7e4c45c3d085c87d50b45fe226 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 22 Jul 2019 10:34:06 -0700 Subject: [PATCH 1/4] Announce character when typing Fixes #2327 --- src/Terminal.ts | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/Terminal.ts b/src/Terminal.ts index 7a068c84..9c60335e 100644 --- a/src/Terminal.ts +++ b/src/Terminal.ts @@ -179,6 +179,13 @@ export class Terminal extends Disposable implements ITerminal, IDisposable, IInp // Store if user went browsing history in scrollback private _userScrolling: boolean; + /** + * Records whether the keydown event has already been handled and triggered a data event, if so + * the keypress event should not trigger a data event but should still print to the textarea so + * screen readers will announce it. + */ + private _keyDownHandled: boolean = false; + private _inputHandler: InputHandler; public linkifier: ILinkifier; public viewport: IViewport; @@ -1515,6 +1522,8 @@ export class Terminal extends Disposable implements ITerminal, IDisposable, IInp * @param ev The keydown event to be handled. */ protected _keyDown(event: KeyboardEvent): boolean { + this._keyDownHandled = false; + if (this._customKeyEventHandler && this._customKeyEventHandler(event) === false) { return false; } @@ -1530,12 +1539,6 @@ export class Terminal extends Disposable implements ITerminal, IDisposable, IInp this.updateCursorStyle(event); - // if (result.key === C0.DC3) { // XOFF - // this._writeStopped = true; - // } else if (result.key === C0.DC1) { // XON - // this._writeStopped = false; - // } - if (result.type === KeyboardResultType.PAGE_DOWN || result.type === KeyboardResultType.PAGE_UP) { const scrollCount = this.rows - 1; this.scrollLines(result.type === KeyboardResultType.PAGE_UP ? -scrollCount : scrollCount); @@ -1559,11 +1562,10 @@ export class Terminal extends Disposable implements ITerminal, IDisposable, IInp return true; } + this._keyDownHandled = true; this._onKey.fire({ key: result.key, domEvent: event }); this.showCursor(); this._coreService.triggerDataEvent(result.key, true); - - return this.cancel(event, true); } private _isThirdLevelShift(browser: IBrowser, ev: IKeyboardEvent): boolean { @@ -1621,6 +1623,10 @@ export class Terminal extends Disposable implements ITerminal, IDisposable, IInp protected _keyPress(ev: KeyboardEvent): boolean { let key; + if (this._keyDownHandled) { + return false; + } + if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) { return false; } From 6a68a247390cb7397b5b93eebf6fc3237b9308c0 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 22 Jul 2019 10:40:16 -0700 Subject: [PATCH 2/4] Debug log data being sent --- src/Terminal.ts | 4 ++-- src/common/services/CoreService.ts | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Terminal.ts b/src/Terminal.ts index 9c60335e..7f662903 100644 --- a/src/Terminal.ts +++ b/src/Terminal.ts @@ -253,13 +253,13 @@ export class Terminal extends Disposable implements ITerminal, IDisposable, IInp this._instantiationService.setService(IOptionsService, this.optionsService); this._bufferService = this._instantiationService.createInstance(BufferService); this._instantiationService.setService(IBufferService, this._bufferService); + this._logService = this._instantiationService.createInstance(LogService); + this._instantiationService.setService(ILogService, this._logService); this._coreService = this._instantiationService.createInstance(CoreService, () => this.scrollToBottom()); this._instantiationService.setService(ICoreService, this._coreService); this._coreService.onData(e => this._onData.fire(e)); this._dirtyRowService = this._instantiationService.createInstance(DirtyRowService); this._instantiationService.setService(IDirtyRowService, this._dirtyRowService); - this._logService = this._instantiationService.createInstance(LogService); - this._instantiationService.setService(ILogService, this._logService); this._setupOptionsListeners(); this._setup(); diff --git a/src/common/services/CoreService.ts b/src/common/services/CoreService.ts index 674cfedb..d17b0c93 100644 --- a/src/common/services/CoreService.ts +++ b/src/common/services/CoreService.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { ICoreService, IOptionsService, IBufferService } from 'common/services/Services'; +import { ICoreService, ILogService, IOptionsService, IBufferService } from 'common/services/Services'; import { EventEmitter, IEvent } from 'common/EventEmitter'; import { IDecPrivateModes } from 'common/Types'; import { clone } from 'common/Clone'; @@ -26,6 +26,7 @@ export class CoreService implements ICoreService { // TODO: Move this into a service private readonly _scrollToBottom: () => void, @IBufferService private readonly _bufferService: IBufferService, + @ILogService private readonly _logService: ILogService, @IOptionsService private readonly _optionsService: IOptionsService ) { this.decPrivateModes = clone(DEFAULT_DEC_PRIVATE_MODES); @@ -53,6 +54,7 @@ export class CoreService implements ICoreService { } // Fire onData API + this._logService.debug('sending data', data); this._onData.fire(data); } } From d2a311b128bb460c6fbe3b0fae2903dda0600a6a Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 22 Jul 2019 10:40:16 -0700 Subject: [PATCH 3/4] Debug log data being sent --- src/Terminal.ts | 4 ++-- src/common/services/CoreService.ts | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Terminal.ts b/src/Terminal.ts index 7a068c84..6b96a4a3 100644 --- a/src/Terminal.ts +++ b/src/Terminal.ts @@ -246,13 +246,13 @@ export class Terminal extends Disposable implements ITerminal, IDisposable, IInp this._instantiationService.setService(IOptionsService, this.optionsService); this._bufferService = this._instantiationService.createInstance(BufferService); this._instantiationService.setService(IBufferService, this._bufferService); + this._logService = this._instantiationService.createInstance(LogService); + this._instantiationService.setService(ILogService, this._logService); this._coreService = this._instantiationService.createInstance(CoreService, () => this.scrollToBottom()); this._instantiationService.setService(ICoreService, this._coreService); this._coreService.onData(e => this._onData.fire(e)); this._dirtyRowService = this._instantiationService.createInstance(DirtyRowService); this._instantiationService.setService(IDirtyRowService, this._dirtyRowService); - this._logService = this._instantiationService.createInstance(LogService); - this._instantiationService.setService(ILogService, this._logService); this._setupOptionsListeners(); this._setup(); diff --git a/src/common/services/CoreService.ts b/src/common/services/CoreService.ts index 674cfedb..d17b0c93 100644 --- a/src/common/services/CoreService.ts +++ b/src/common/services/CoreService.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { ICoreService, IOptionsService, IBufferService } from 'common/services/Services'; +import { ICoreService, ILogService, IOptionsService, IBufferService } from 'common/services/Services'; import { EventEmitter, IEvent } from 'common/EventEmitter'; import { IDecPrivateModes } from 'common/Types'; import { clone } from 'common/Clone'; @@ -26,6 +26,7 @@ export class CoreService implements ICoreService { // TODO: Move this into a service private readonly _scrollToBottom: () => void, @IBufferService private readonly _bufferService: IBufferService, + @ILogService private readonly _logService: ILogService, @IOptionsService private readonly _optionsService: IOptionsService ) { this.decPrivateModes = clone(DEFAULT_DEC_PRIVATE_MODES); @@ -53,6 +54,7 @@ export class CoreService implements ICoreService { } // Fire onData API + this._logService.debug('sending data', data); this._onData.fire(data); } } From c8a719b64a41c80f626f3b5cce46d718dfea6fe6 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 22 Jul 2019 10:49:40 -0700 Subject: [PATCH 4/4] Clear textarea when ^C or enter is pressed --- src/Terminal.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Terminal.ts b/src/Terminal.ts index 7f662903..952adb01 100644 --- a/src/Terminal.ts +++ b/src/Terminal.ts @@ -1562,6 +1562,13 @@ export class Terminal extends Disposable implements ITerminal, IDisposable, IInp return true; } + // If ctrl+c or enter is being sent, clear out the textarea. This is done so that screen readers + // will announce deleted characters. This will not work 100% of the time but it should cover + // most scenarios. + if (result.key === C0.ETX || result.key === C0.CR) { + this.textarea.value = ''; + } + this._keyDownHandled = true; this._onKey.fire({ key: result.key, domEvent: event }); this.showCursor();