From 7b7b7a36db1b6d848ad9a41e5e242eecdb3cd43f Mon Sep 17 00:00:00 2001 From: Bruno Ribeiro Date: Sat, 3 Apr 2021 16:34:00 +0100 Subject: [PATCH] Fix #3014 - Add onBell event listener to allow embeders to hook into it --- src/browser/Terminal.test.ts | 6 ++++++ src/browser/Terminal.ts | 4 ++++ src/browser/TestUtils.test.ts | 1 + src/browser/Types.d.ts | 1 + src/browser/public/Terminal.ts | 1 + src/common/Types.d.ts | 1 + test/api/Terminal.api.ts | 10 ++++++++++ typings/xterm.d.ts | 6 ++++++ 8 files changed, 30 insertions(+) diff --git a/src/browser/Terminal.test.ts b/src/browser/Terminal.test.ts index b0075d88..74b1c975 100644 --- a/src/browser/Terminal.test.ts +++ b/src/browser/Terminal.test.ts @@ -131,6 +131,12 @@ describe('Terminal', () => { }); term.write('\x1b]2;title\x07'); }); + it('should fire the onBell event', (done) => { + term.onBell(e => { + done(); + }); + term.write('\a'); + }); }); describe('attachCustomKeyEventHandler', () => { diff --git a/src/browser/Terminal.ts b/src/browser/Terminal.ts index f14bffe0..d0807b4c 100644 --- a/src/browser/Terminal.ts +++ b/src/browser/Terminal.ts @@ -111,6 +111,8 @@ export class Terminal extends CoreTerminal implements ITerminal { public get onSelectionChange(): IEvent { return this._onSelectionChange.event; } private _onTitleChange = new EventEmitter(); public get onTitleChange(): IEvent { return this._onTitleChange.event; } + private _onBell = new EventEmitter(); + public get onBell (): IEvent { return this._onBell.event; } private _onFocus = new EventEmitter(); public get onFocus(): IEvent { return this._onFocus.event; } @@ -1141,6 +1143,8 @@ export class Terminal extends CoreTerminal implements ITerminal { this._soundService!.playBellSound(); } + this._onBell.fire(); + // if (this._visualBell()) { // this.element.classList.add('visual-bell-active'); // clearTimeout(this._visualBellTimer); diff --git a/src/browser/TestUtils.test.ts b/src/browser/TestUtils.test.ts index a2140aa5..35c81ad3 100644 --- a/src/browser/TestUtils.test.ts +++ b/src/browser/TestUtils.test.ts @@ -37,6 +37,7 @@ export class MockTerminal implements ITerminal { public onData!: IEvent; public onBinary!: IEvent; public onTitleChange!: IEvent; + public onBell!: IEvent; public onScroll!: IEvent; public onKey!: IEvent<{ key: string, domEvent: KeyboardEvent }>; public onRender!: IEvent<{ start: number, end: number }>; diff --git a/src/browser/Types.d.ts b/src/browser/Types.d.ts index f743934e..dea47468 100644 --- a/src/browser/Types.d.ts +++ b/src/browser/Types.d.ts @@ -47,6 +47,7 @@ export interface IPublicTerminal extends IDisposable { onRender: IEvent<{ start: number, end: number }>; onResize: IEvent<{ cols: number, rows: number }>; onTitleChange: IEvent; + onBell: IEvent; blur(): void; focus(): void; resize(columns: number, rows: number): void; diff --git a/src/browser/public/Terminal.ts b/src/browser/public/Terminal.ts index bd0b78f9..14606454 100644 --- a/src/browser/public/Terminal.ts +++ b/src/browser/public/Terminal.ts @@ -38,6 +38,7 @@ export class Terminal implements ITerminalApi { public get onData(): IEvent { return this._core.onData; } public get onBinary(): IEvent { return this._core.onBinary; } public get onTitleChange(): IEvent { return this._core.onTitleChange; } + public get onBell(): IEvent { return this._core.onBell; } public get onScroll(): IEvent { return this._core.onScroll; } public get onKey(): IEvent<{ key: string, domEvent: KeyboardEvent }> { return this._core.onKey; } public get onRender(): IEvent<{ start: number, end: number }> { return this._core.onRender; } diff --git a/src/common/Types.d.ts b/src/common/Types.d.ts index df299195..10b3afa4 100644 --- a/src/common/Types.d.ts +++ b/src/common/Types.d.ts @@ -357,6 +357,7 @@ export interface IAnsiColorChangeEvent { */ export interface IInputHandler { onTitleChange: IEvent; + onRequestBell: IEvent; parse(data: string | Uint8Array, promiseResult?: boolean): void | Promise; print(data: Uint32Array, start: number, end: number): void; diff --git a/test/api/Terminal.api.ts b/test/api/Terminal.api.ts index c5ce8f92..0fcb177d 100644 --- a/test/api/Terminal.api.ts +++ b/test/api/Terminal.api.ts @@ -410,6 +410,16 @@ describe('API Integration Tests', function(): void { await page.evaluate(`window.term.write('\\x1b]2;foo\\x9c')`); await pollFor(page, `window.calls`, ['foo']); }); + it('onBell', async () => { + await openTerminal(page); + await page.evaluate(` + window.calls = []; + window.term.onBell(e => window.calls.push(e)); + `); + await pollFor(page, `window.calls`, []); + await page.evaluate(`window.term.write('\\a')`); + await pollFor(page, `window.calls`, ['foo']); + }); }); describe('buffer', () => { diff --git a/typings/xterm.d.ts b/typings/xterm.d.ts index cab9bdcc..3fd4ba2d 100644 --- a/typings/xterm.d.ts +++ b/typings/xterm.d.ts @@ -708,6 +708,12 @@ declare module 'xterm' { * @returns an `IDisposable` to stop listening. */ onTitleChange: IEvent; + + /** + * Adds an event listener for when the bell sound. + * @returns an `IDisposable` to stop listening. + */ + onBell: IEvent; /** * Unfocus the terminal.