diff --git a/addons/xterm-addon-webgl/src/WebglAddon.ts b/addons/xterm-addon-webgl/src/WebglAddon.ts index 0586e6ff..0f00c100 100644 --- a/addons/xterm-addon-webgl/src/WebglAddon.ts +++ b/addons/xterm-addon-webgl/src/WebglAddon.ts @@ -16,9 +16,9 @@ export class WebglAddon extends Disposable implements ITerminalAddon { private _terminal?: Terminal; private _renderer?: WebglRenderer; - private readonly _onChangeTextureAtlas = new EventEmitter(); + private readonly _onChangeTextureAtlas = this.register(new EventEmitter()); public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event; - private readonly _onContextLoss = new EventEmitter(); + private readonly _onContextLoss = this.register(new EventEmitter()); public readonly onContextLoss = this._onContextLoss.event; constructor( diff --git a/addons/xterm-addon-webgl/src/WebglRenderer.ts b/addons/xterm-addon-webgl/src/WebglRenderer.ts index 6f213527..a554085e 100644 --- a/addons/xterm-addon-webgl/src/WebglRenderer.ts +++ b/addons/xterm-addon-webgl/src/WebglRenderer.ts @@ -46,11 +46,11 @@ export class WebglRenderer extends Disposable implements IRenderer { private _isAttached: boolean; private _contextRestorationTimeout: number | undefined; - private readonly _onChangeTextureAtlas = new EventEmitter(); + private readonly _onChangeTextureAtlas = this.register(new EventEmitter()); public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event; - private readonly _onRequestRedraw = new EventEmitter(); + private readonly _onRequestRedraw = this.register(new EventEmitter()); public readonly onRequestRedraw = this._onRequestRedraw.event; - private readonly _onContextLoss = new EventEmitter(); + private readonly _onContextLoss = this.register(new EventEmitter()); public readonly onContextLoss = this._onContextLoss.event; constructor( diff --git a/src/browser/Terminal.ts b/src/browser/Terminal.ts index 27a22fe6..fef92d3d 100644 --- a/src/browser/Terminal.ts +++ b/src/browser/Terminal.ts @@ -123,28 +123,28 @@ export class Terminal extends CoreTerminal implements ITerminal { private _colorManager: ColorManager | undefined; private _theme: ITheme | undefined; - private readonly _onCursorMove = new EventEmitter(); + private readonly _onCursorMove = this.register(new EventEmitter()); public readonly onCursorMove = this._onCursorMove.event; - private readonly _onKey = new EventEmitter<{ key: string, domEvent: KeyboardEvent }>(); + private readonly _onKey = this.register(new EventEmitter<{ key: string, domEvent: KeyboardEvent }>()); public readonly onKey = this._onKey.event; - private readonly _onRender = new EventEmitter<{ start: number, end: number }>(); + private readonly _onRender = this.register(new EventEmitter<{ start: number, end: number }>()); public readonly onRender = this._onRender.event; - private readonly _onSelectionChange = new EventEmitter(); + private readonly _onSelectionChange = this.register(new EventEmitter()); public readonly onSelectionChange = this._onSelectionChange.event; - private readonly _onTitleChange = new EventEmitter(); + private readonly _onTitleChange = this.register(new EventEmitter()); public readonly onTitleChange = this._onTitleChange.event; - private readonly _onBell = new EventEmitter(); + private readonly _onBell = this.register(new EventEmitter()); public readonly onBell = this._onBell.event; - private _onFocus = new EventEmitter(); + private _onFocus = this.register(new EventEmitter()); public get onFocus(): IEvent { return this._onFocus.event; } - private _onBlur = new EventEmitter(); + private _onBlur = this.register(new EventEmitter()); public get onBlur(): IEvent { return this._onBlur.event; } - private _onA11yCharEmitter = new EventEmitter(); + private _onA11yCharEmitter = this.register(new EventEmitter()); public get onA11yChar(): IEvent { return this._onA11yCharEmitter.event; } - private _onA11yTabEmitter = new EventEmitter(); + private _onA11yTabEmitter = this.register(new EventEmitter()); public get onA11yTab(): IEvent { return this._onA11yTabEmitter.event; } - private _onWillOpen = new EventEmitter(); + private _onWillOpen = this.register(new EventEmitter()); public get onWillOpen(): IEvent { return this._onWillOpen.event; } /** diff --git a/src/browser/renderer/dom/DomRenderer.ts b/src/browser/renderer/dom/DomRenderer.ts index e40c44d7..b474bc7a 100644 --- a/src/browser/renderer/dom/DomRenderer.ts +++ b/src/browser/renderer/dom/DomRenderer.ts @@ -40,7 +40,7 @@ export class DomRenderer extends Disposable implements IRenderer { public dimensions: IRenderDimensions; - public readonly onRequestRedraw = new EventEmitter().event; + public readonly onRequestRedraw = this.register(new EventEmitter()).event; constructor( private _colors: IColorSet, diff --git a/src/browser/services/CharSizeService.ts b/src/browser/services/CharSizeService.ts index 7062deec..80116f00 100644 --- a/src/browser/services/CharSizeService.ts +++ b/src/browser/services/CharSizeService.ts @@ -16,7 +16,7 @@ export class CharSizeService implements ICharSizeService { public get hasValidSize(): boolean { return this.width > 0 && this.height > 0; } - private readonly _onCharSizeChange = new EventEmitter(); + private readonly _onCharSizeChange = this.register(new EventEmitter()); public readonly onCharSizeChange = this._onCharSizeChange.event; constructor( diff --git a/src/browser/services/RenderService.ts b/src/browser/services/RenderService.ts index b79b0910..a063b37f 100644 --- a/src/browser/services/RenderService.ts +++ b/src/browser/services/RenderService.ts @@ -40,13 +40,13 @@ export class RenderService extends Disposable implements IRenderService { columnSelectMode: false }; - private readonly _onDimensionsChange = new EventEmitter(); + private readonly _onDimensionsChange = this.register(new EventEmitter()); public readonly onDimensionsChange = this._onDimensionsChange.event; - private readonly _onRenderedViewportChange = new EventEmitter<{ start: number, end: number }>(); + private readonly _onRenderedViewportChange = this.register(new EventEmitter<{ start: number, end: number }>()); public readonly onRenderedViewportChange = this._onRenderedViewportChange.event; - private readonly _onRender = new EventEmitter<{ start: number, end: number }>(); + private readonly _onRender = this.register(new EventEmitter<{ start: number, end: number }>()); public readonly onRender = this._onRender.event; - private readonly _onRefreshRequest = new EventEmitter<{ start: number, end: number }>(); + private readonly _onRefreshRequest = this.register(new EventEmitter<{ start: number, end: number }>()); public readonly onRefreshRequest = this._onRefreshRequest.event; public get dimensions(): IRenderDimensions { return this._renderer!.dimensions; } diff --git a/src/common/CircularList.ts b/src/common/CircularList.ts index 599db1ab..b7e1e075 100644 --- a/src/common/CircularList.ts +++ b/src/common/CircularList.ts @@ -5,6 +5,7 @@ import { ICircularList } from 'common/Types'; import { EventEmitter, IEvent } from 'common/EventEmitter'; +import { Disposable } from 'common/Lifecycle'; export interface IInsertEvent { index: number; @@ -20,21 +21,22 @@ export interface IDeleteEvent { * Represents a circular list; a list with a maximum size that wraps around when push is called, * overriding values at the start of the list. */ -export class CircularList implements ICircularList { +export class CircularList extends Disposable implements ICircularList { protected _array: (T | undefined)[]; private _startIndex: number; private _length: number; - public readonly onDeleteEmitter = new EventEmitter(); + public readonly onDeleteEmitter = this.register(new EventEmitter()); public readonly onDelete = this.onDeleteEmitter.event; - public readonly onInsertEmitter = new EventEmitter(); + public readonly onInsertEmitter = this.register(new EventEmitter()); public readonly onInsert = this.onInsertEmitter.event; - public readonly onTrimEmitter = new EventEmitter(); + public readonly onTrimEmitter = this.register(new EventEmitter()); public readonly onTrim = this.onTrimEmitter.event; constructor( private _maxLength: number ) { + super(); this._array = new Array(this._maxLength); this._startIndex = 0; this._length = 0; diff --git a/src/common/CoreTerminal.ts b/src/common/CoreTerminal.ts index bc065dda..ea2528db 100644 --- a/src/common/CoreTerminal.ts +++ b/src/common/CoreTerminal.ts @@ -59,15 +59,15 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal { private _writeBuffer: WriteBuffer; private _windowsMode: IDisposable | undefined; - private readonly _onBinary = new EventEmitter(); + private readonly _onBinary = this.register(new EventEmitter()); public readonly onBinary = this._onBinary.event; - private readonly _onData = new EventEmitter(); + private readonly _onData = this.register(new EventEmitter()); public readonly onData = this._onData.event; - protected _onLineFeed = new EventEmitter(); + protected _onLineFeed = this.register(new EventEmitter()); public readonly onLineFeed = this._onLineFeed.event; - private readonly _onResize = new EventEmitter<{ cols: number, rows: number }>(); + private readonly _onResize = this.register(new EventEmitter<{ cols: number, rows: number }>()); public readonly onResize = this._onResize.event; - protected readonly _onWriteParsed = new EventEmitter(); + protected readonly _onWriteParsed = this.register(new EventEmitter()); public readonly onWriteParsed = this._onWriteParsed.event; /** @@ -75,13 +75,13 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal { * it's filtered out. */ protected _onScrollApi?: EventEmitter; - protected _onScroll = new EventEmitter(); + protected _onScroll = this.register(new EventEmitter()); public get onScroll(): IEvent { if (!this._onScrollApi) { - this._onScrollApi = new EventEmitter(); - this.register(this._onScroll.event(ev => { + this._onScrollApi = this.register(new EventEmitter()); + this._onScroll.event(ev => { this._onScrollApi?.fire(ev.position); - })); + }); } return this._onScrollApi.event; } @@ -103,17 +103,17 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal { // Setup and initialize services this._instantiationService = new InstantiationService(); - this.optionsService = new OptionsService(options); + this.optionsService = this.register(new OptionsService(options)); this._instantiationService.setService(IOptionsService, this.optionsService); this._bufferService = this.register(this._instantiationService.createInstance(BufferService)); this._instantiationService.setService(IBufferService, this._bufferService); - this._logService = this._instantiationService.createInstance(LogService); + this._logService = this.register(this._instantiationService.createInstance(LogService)); this._instantiationService.setService(ILogService, this._logService); this.coreService = this.register(this._instantiationService.createInstance(CoreService, () => this.scrollToBottom())); this._instantiationService.setService(ICoreService, this.coreService); - this.coreMouseService = this._instantiationService.createInstance(CoreMouseService); + this.coreMouseService = this.register(this._instantiationService.createInstance(CoreMouseService)); this._instantiationService.setService(ICoreMouseService, this.coreMouseService); - this.unicodeService = this._instantiationService.createInstance(UnicodeService); + this.unicodeService = this.register(this._instantiationService.createInstance(UnicodeService)); this._instantiationService.setService(IUnicodeService, this.unicodeService); this._charsetService = this._instantiationService.createInstance(CharsetService); this._instantiationService.setService(ICharsetService, this._charsetService); @@ -121,7 +121,7 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal { this._instantiationService.setService(IOscLinkService, this._oscLinkService); // Register input handler and handle/forward events - this._inputHandler = new InputHandler(this._bufferService, this._charsetService, this.coreService, this._logService, this.optionsService, this._oscLinkService, this.coreMouseService, this.unicodeService); + this._inputHandler = this.register(new InputHandler(this._bufferService, this._charsetService, this.coreService, this._logService, this.optionsService, this._oscLinkService, this.coreMouseService, this.unicodeService)); this.register(forwardEvent(this._inputHandler.onLineFeed, this._onLineFeed)); this.register(this._inputHandler); @@ -141,7 +141,7 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal { })); // Setup WriteBuffer - this._writeBuffer = new WriteBuffer((data, promiseResult) => this._inputHandler.parse(data, promiseResult)); + this._writeBuffer = this.register(new WriteBuffer((data, promiseResult) => this._inputHandler.parse(data, promiseResult))); this.register(forwardEvent(this._writeBuffer.onWriteParsed, this._onWriteParsed)); this.register(toDisposable(() => { diff --git a/src/common/InputHandler.ts b/src/common/InputHandler.ts index 22c2b352..b91b446c 100644 --- a/src/common/InputHandler.ts +++ b/src/common/InputHandler.ts @@ -132,32 +132,32 @@ export class InputHandler extends Disposable implements IInputHandler { private _activeBuffer: IBuffer; - private readonly _onRequestBell = new EventEmitter(); + private readonly _onRequestBell = this.register(new EventEmitter()); public readonly onRequestBell = this._onRequestBell.event; - private readonly _onRequestRefreshRows = new EventEmitter(); + private readonly _onRequestRefreshRows = this.register(new EventEmitter()); public readonly onRequestRefreshRows = this._onRequestRefreshRows.event; - private readonly _onRequestReset = new EventEmitter(); + private readonly _onRequestReset = this.register(new EventEmitter()); public readonly onRequestReset = this._onRequestReset.event; - private readonly _onRequestSendFocus = new EventEmitter(); + private readonly _onRequestSendFocus = this.register(new EventEmitter()); public readonly onRequestSendFocus = this._onRequestSendFocus.event; - private readonly _onRequestSyncScrollBar = new EventEmitter(); + private readonly _onRequestSyncScrollBar = this.register(new EventEmitter()); public readonly onRequestSyncScrollBar = this._onRequestSyncScrollBar.event; - private readonly _onRequestWindowsOptionsReport = new EventEmitter(); + private readonly _onRequestWindowsOptionsReport = this.register(new EventEmitter()); public readonly onRequestWindowsOptionsReport = this._onRequestWindowsOptionsReport.event; - private readonly _onA11yChar = new EventEmitter(); + private readonly _onA11yChar = this.register(new EventEmitter()); public readonly onA11yChar = this._onA11yChar.event; - private readonly _onA11yTab = new EventEmitter(); + private readonly _onA11yTab = this.register(new EventEmitter()); public readonly onA11yTab = this._onA11yTab.event; - private readonly _onCursorMove = new EventEmitter(); + private readonly _onCursorMove = this.register(new EventEmitter()); public readonly onCursorMove = this._onCursorMove.event; - private readonly _onLineFeed = new EventEmitter(); + private readonly _onLineFeed = this.register(new EventEmitter()); public readonly onLineFeed = this._onLineFeed.event; - private readonly _onScroll = new EventEmitter(); + private readonly _onScroll = this.register(new EventEmitter()); public readonly onScroll = this._onScroll.event; - private readonly _onTitleChange = new EventEmitter(); + private readonly _onTitleChange = this.register(new EventEmitter()); public readonly onTitleChange = this._onTitleChange.event; - private readonly _onColor = new EventEmitter(); + private readonly _onColor = this.register(new EventEmitter()); public readonly onColor = this._onColor.event; private _parseStack: IParseStack = { diff --git a/src/common/buffer/Marker.ts b/src/common/buffer/Marker.ts index b01dde88..54bcb84f 100644 --- a/src/common/buffer/Marker.ts +++ b/src/common/buffer/Marker.ts @@ -13,10 +13,10 @@ export class Marker extends Disposable implements IMarker { private _id: number = Marker._nextId++; public get id(): number { return this._id; } - private readonly _onDispose = new EventEmitter(); + private readonly _onDispose = this.register(new EventEmitter()); public readonly onDispose = this._onDispose.event; - public get isDisposed(): boolean { return this._isDisposed; }; + public get isDisposed(): boolean { return this._isDisposed; } constructor( public line: number diff --git a/src/common/input/WriteBuffer.ts b/src/common/input/WriteBuffer.ts index cb40ffa1..68dbc6f7 100644 --- a/src/common/input/WriteBuffer.ts +++ b/src/common/input/WriteBuffer.ts @@ -5,6 +5,7 @@ */ import { EventEmitter, IEvent } from 'common/EventEmitter'; +import { Disposable } from 'common/Lifecycle'; declare const setTimeout: (handler: () => void, timeout?: number) => void; @@ -33,7 +34,7 @@ const WRITE_TIMEOUT_MS = 12; */ const WRITE_BUFFER_LENGTH_THRESHOLD = 50; -export class WriteBuffer { +export class WriteBuffer extends Disposable { private _writeBuffer: (string | Uint8Array)[] = []; private _callbacks: ((() => void) | undefined)[] = []; private _pendingData = 0; @@ -42,10 +43,12 @@ export class WriteBuffer { private _syncCalls = 0; private _didUserInput = false; - private readonly _onWriteParsed = new EventEmitter(); + private readonly _onWriteParsed = this.register(new EventEmitter()); public readonly onWriteParsed = this._onWriteParsed.event; - constructor(private _action: (data: string | Uint8Array, promiseResult?: boolean) => void | Promise) { } + constructor(private _action: (data: string | Uint8Array, promiseResult?: boolean) => void | Promise) { + super(); + } public handleUserInput(): void { this._didUserInput = true; diff --git a/src/common/public/BufferNamespaceApi.ts b/src/common/public/BufferNamespaceApi.ts index 033f5955..9e49ce2b 100644 --- a/src/common/public/BufferNamespaceApi.ts +++ b/src/common/public/BufferNamespaceApi.ts @@ -5,7 +5,7 @@ import { IBuffer as IBufferApi, IBufferNamespace as IBufferNamespaceApi } from 'xterm'; import { BufferApiView } from 'common/public/BufferApiView'; -import { IEvent, EventEmitter } from 'common/EventEmitter'; +import { EventEmitter } from 'common/EventEmitter'; import { ICoreTerminal } from 'common/Types'; export class BufferNamespaceApi implements IBufferNamespaceApi { diff --git a/src/common/services/BufferService.ts b/src/common/services/BufferService.ts index eaa355b2..f238206c 100644 --- a/src/common/services/BufferService.ts +++ b/src/common/services/BufferService.ts @@ -22,9 +22,9 @@ export class BufferService extends Disposable implements IBufferService { /** Whether the user is scrolling (locks the scroll position) */ public isUserScrolling: boolean = false; - private readonly _onResize = new EventEmitter<{ cols: number, rows: number }>(); + private readonly _onResize = this.register(new EventEmitter<{ cols: number, rows: number }>()); public readonly onResize = this._onResize.event; - private readonly _onScroll = new EventEmitter(); + private readonly _onScroll = this.register(new EventEmitter()); public readonly onScroll = this._onScroll.event; public get buffer(): IBuffer { return this.buffers.active; } diff --git a/src/common/services/CoreMouseService.ts b/src/common/services/CoreMouseService.ts index 8c2a24de..d955370e 100644 --- a/src/common/services/CoreMouseService.ts +++ b/src/common/services/CoreMouseService.ts @@ -5,6 +5,7 @@ import { IBufferService, ICoreService, ICoreMouseService } from 'common/services/Services'; import { EventEmitter, IEvent } from 'common/EventEmitter'; import { ICoreMouseProtocol, ICoreMouseEvent, CoreMouseEncoding, CoreMouseEventType, CoreMouseButton, CoreMouseAction } from 'common/Types'; +import { Disposable } from 'common/Lifecycle'; /** * Supported default protocols. @@ -165,20 +166,21 @@ const DEFAULT_ENCODINGS: { [key: string]: CoreMouseEncoding } = { * a tracking report to the backend based on protocol and encoding limitations. * To send a mouse event call `triggerMouseEvent`. */ -export class CoreMouseService implements ICoreMouseService { +export class CoreMouseService extends Disposable implements ICoreMouseService { private _protocols: { [name: string]: ICoreMouseProtocol } = {}; private _encodings: { [name: string]: CoreMouseEncoding } = {}; private _activeProtocol: string = ''; private _activeEncoding: string = ''; private _lastEvent: ICoreMouseEvent | null = null; - private readonly _onProtocolChange = new EventEmitter(); + private readonly _onProtocolChange = this.register(new EventEmitter()); public readonly onProtocolChange = this._onProtocolChange.event; constructor( @IBufferService private readonly _bufferService: IBufferService, @ICoreService private readonly _coreService: ICoreService ) { + super(); // register default protocols and encodings for (const name of Object.keys(DEFAULT_PROTOCOLS)) this.addProtocol(name, DEFAULT_PROTOCOLS[name]); for (const name of Object.keys(DEFAULT_ENCODINGS)) this.addEncoding(name, DEFAULT_ENCODINGS[name]); diff --git a/src/common/services/LogService.ts b/src/common/services/LogService.ts index d3566567..854f85de 100644 --- a/src/common/services/LogService.ts +++ b/src/common/services/LogService.ts @@ -3,6 +3,7 @@ * @license MIT */ +import { Disposable } from 'common/Lifecycle'; import { ILogService, IOptionsService, LogLevelEnum } from 'common/services/Services'; type LogType = (message?: any, ...optionalParams: any[]) => void; @@ -29,7 +30,7 @@ const optionsKeyToLogLevel: { [key: string]: LogLevelEnum } = { const LOG_PREFIX = 'xterm.js: '; -export class LogService implements ILogService { +export class LogService extends Disposable implements ILogService { public serviceBrand: any; public logLevel: LogLevelEnum = LogLevelEnum.OFF; @@ -37,12 +38,13 @@ export class LogService implements ILogService { constructor( @IOptionsService private readonly _optionsService: IOptionsService ) { + super(); this._updateLogLevel(); - this._optionsService.onOptionChange(key => { + this.register(this._optionsService.onOptionChange(key => { if (key === 'logLevel') { this._updateLogLevel(); } - }); + })); } private _updateLogLevel(): void { diff --git a/src/common/services/OptionsService.ts b/src/common/services/OptionsService.ts index 33aa3ee2..336591e5 100644 --- a/src/common/services/OptionsService.ts +++ b/src/common/services/OptionsService.ts @@ -7,6 +7,7 @@ import { IOptionsService, ITerminalOptions, FontWeight } from 'common/services/S import { EventEmitter, IEvent } from 'common/EventEmitter'; import { isMac } from 'common/Platform'; import { CursorStyle } from 'common/Types'; +import { Disposable } from 'common/Lifecycle'; export const DEFAULT_OPTIONS: Readonly> = { cols: 80, @@ -51,16 +52,17 @@ export const DEFAULT_OPTIONS: Readonly> = { const FONT_WEIGHT_OPTIONS: Extract[] = ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900']; -export class OptionsService implements IOptionsService { +export class OptionsService extends Disposable implements IOptionsService { public serviceBrand: any; public readonly rawOptions: Required; public options: Required; - private readonly _onOptionChange = new EventEmitter(); + private readonly _onOptionChange = this.register(new EventEmitter()); public readonly onOptionChange = this._onOptionChange.event; constructor(options: Partial) { + super(); // set the default value of each option const defaultOptions = { ...DEFAULT_OPTIONS }; for (const key in options) { diff --git a/src/common/services/UnicodeService.ts b/src/common/services/UnicodeService.ts index 239f4d62..44386e54 100644 --- a/src/common/services/UnicodeService.ts +++ b/src/common/services/UnicodeService.ts @@ -5,19 +5,21 @@ import { IUnicodeService, IUnicodeVersionProvider } from 'common/services/Services'; import { EventEmitter, IEvent } from 'common/EventEmitter'; import { UnicodeV6 } from 'common/input/UnicodeV6'; +import { Disposable } from 'common/Lifecycle'; -export class UnicodeService implements IUnicodeService { +export class UnicodeService extends Disposable implements IUnicodeService { public serviceBrand: any; private _providers: {[key: string]: IUnicodeVersionProvider} = Object.create(null); private _active: string = ''; private _activeProvider: IUnicodeVersionProvider; - private readonly _onChange = new EventEmitter(); + private readonly _onChange = super.register(new EventEmitter(); public readonly onChange = this._onChange.event; constructor() { + super(); const defaultProvider = new UnicodeV6(); this.register(defaultProvider); this._active = defaultProvider.version; diff --git a/src/headless/Terminal.ts b/src/headless/Terminal.ts index 39465205..f021c42b 100644 --- a/src/headless/Terminal.ts +++ b/src/headless/Terminal.ts @@ -32,15 +32,15 @@ export class Terminal extends CoreTerminal { // TODO: We should remove options once components adopt optionsService public get options(): Required { return this.optionsService.options; } - private readonly _onBell = new EventEmitter(); + private readonly _onBell = this.register(new EventEmitter()); public readonly onBell = this._onBell.event; - private readonly _onCursorMove = new EventEmitter(); + private readonly _onCursorMove = this.register(new EventEmitter()); public readonly onCursorMove = this._onCursorMove.event; - private readonly _onTitleChange = new EventEmitter(); + private readonly _onTitleChange = this.register(new EventEmitter()); public readonly onTitleChange = this._onTitleChange.event; - private readonly _onA11yCharEmitter = new EventEmitter(); + private readonly _onA11yCharEmitter = this.register(new EventEmitter()); public readonly onA11yChar = this._onA11yCharEmitter.event; - private readonly _onA11yTabEmitter = new EventEmitter(); + private readonly _onA11yTabEmitter = this.register(new EventEmitter()); public readonly onA11yTab = this._onA11yTabEmitter.event; /**