From 7b7b7a36db1b6d848ad9a41e5e242eecdb3cd43f Mon Sep 17 00:00:00 2001 From: Bruno Ribeiro Date: Sat, 3 Apr 2021 16:34:00 +0100 Subject: [PATCH 1/5] 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. From 3d29357d1da4828ffd11eb5d7a196f74e5e1442e Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 6 Apr 2021 05:34:20 -0700 Subject: [PATCH 2/5] Fix test/lint --- src/browser/Terminal.test.ts | 4 ++-- src/browser/Terminal.ts | 2 +- src/common/Types.d.ts | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/browser/Terminal.test.ts b/src/browser/Terminal.test.ts index 74b1c975..140ec6e5 100644 --- a/src/browser/Terminal.test.ts +++ b/src/browser/Terminal.test.ts @@ -132,10 +132,10 @@ describe('Terminal', () => { term.write('\x1b]2;title\x07'); }); it('should fire the onBell event', (done) => { - term.onBell(e => { + term.onBell(e => { done(); }); - term.write('\a'); + term.write('\x07'); }); }); diff --git a/src/browser/Terminal.ts b/src/browser/Terminal.ts index e490d8c2..6400743c 100644 --- a/src/browser/Terminal.ts +++ b/src/browser/Terminal.ts @@ -1155,7 +1155,7 @@ export class Terminal extends CoreTerminal implements ITerminal { } this._onBell.fire(); - + // if (this._visualBell()) { // this.element.classList.add('visual-bell-active'); // clearTimeout(this._visualBellTimer); diff --git a/src/common/Types.d.ts b/src/common/Types.d.ts index 10b3afa4..df299195 100644 --- a/src/common/Types.d.ts +++ b/src/common/Types.d.ts @@ -357,7 +357,6 @@ 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; From 19716957e4b8abcaf232a87f445cb015749f1c83 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 6 Apr 2021 05:40:29 -0700 Subject: [PATCH 3/5] Fix api test --- test/api/Terminal.api.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/api/Terminal.api.ts b/test/api/Terminal.api.ts index 0fcb177d..8af6842c 100644 --- a/test/api/Terminal.api.ts +++ b/test/api/Terminal.api.ts @@ -297,7 +297,7 @@ describe('API Integration Tests', function(): void { }); }); - describe('Events', () => { + describe.only('Events', () => { it('onCursorMove', async () => { await openTerminal(page); await page.evaluate(` @@ -414,11 +414,11 @@ describe('API Integration Tests', function(): void { await openTerminal(page); await page.evaluate(` window.calls = []; - window.term.onBell(e => window.calls.push(e)); + window.term.onBell(() => window.calls.push(true)); `); await pollFor(page, `window.calls`, []); - await page.evaluate(`window.term.write('\\a')`); - await pollFor(page, `window.calls`, ['foo']); + await page.evaluate(`window.term.write('\\x07')`); + await pollFor(page, `window.calls`, [true]); }); }); From 826493161a174e044c2f40baf5dee442c2a49a45 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 6 Apr 2021 05:40:56 -0700 Subject: [PATCH 4/5] Api polish --- typings/xterm.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/typings/xterm.d.ts b/typings/xterm.d.ts index 3fd4ba2d..b1995bb2 100644 --- a/typings/xterm.d.ts +++ b/typings/xterm.d.ts @@ -708,9 +708,9 @@ declare module 'xterm' { * @returns an `IDisposable` to stop listening. */ onTitleChange: IEvent; - + /** - * Adds an event listener for when the bell sound. + * Adds an event listener for when the bell is triggered. * @returns an `IDisposable` to stop listening. */ onBell: IEvent; From 2556137b517d3d6714a998eb2cb05891aeec3126 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 6 Apr 2021 05:44:36 -0700 Subject: [PATCH 5/5] Remove only --- test/api/Terminal.api.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/api/Terminal.api.ts b/test/api/Terminal.api.ts index 8af6842c..2f388deb 100644 --- a/test/api/Terminal.api.ts +++ b/test/api/Terminal.api.ts @@ -297,7 +297,7 @@ describe('API Integration Tests', function(): void { }); }); - describe.only('Events', () => { + describe('Events', () => { it('onCursorMove', async () => { await openTerminal(page); await page.evaluate(`