From 9187cd3d0a82e430968ea138713e8a766abb0ee1 Mon Sep 17 00:00:00 2001
From: Daniel Imms <2193314+Tyriar@users.noreply.github.com>
Date: Sun, 14 Jul 2024 07:41:38 -0700
Subject: [PATCH 01/15] Add load test for long lines
---
demo/client.ts | 34 ++++++++++++++++++++++++++++++++++
demo/index.html | 1 +
2 files changed, 35 insertions(+)
diff --git a/demo/client.ts b/demo/client.ts
index 57208184..c2b5ee3c 100644
--- a/demo/client.ts
+++ b/demo/client.ts
@@ -235,6 +235,7 @@ if (document.location.pathname === '/test') {
document.getElementById('htmlserialize').addEventListener('click', htmlSerializeButtonHandler);
document.getElementById('custom-glyph').addEventListener('click', writeCustomGlyphHandler);
document.getElementById('load-test').addEventListener('click', loadTest);
+ document.getElementById('load-test-long-lines').addEventListener('click', loadTestLongLines);
document.getElementById('print-cjk').addEventListener('click', addCjk);
document.getElementById('print-cjk-sgr').addEventListener('click', addCjkRandomSgr);
document.getElementById('powerline-symbol-test').addEventListener('click', powerlineSymbolTest);
@@ -840,6 +841,39 @@ function loadTest(): void {
});
}
+function loadTestLongLines(): void {
+ const rendererName = addons.webgl.instance ? 'webgl' : !!addons.canvas.instance ? 'canvas' : 'dom';
+ const testData = [];
+ let byteCount = 0;
+ for (let i = 0; i < 50; i++) {
+ const count = 1 + Math.floor(Math.random() * 500);
+ byteCount += count + 2;
+ const data = new Uint8Array(count + 2);
+ data[0] = 0x0A; // \n
+ for (let i = 1; i < count + 1; i++) {
+ data[i] = 0x61 + Math.floor(Math.random() * (0x7A - 0x61));
+ }
+ // End each line with \r so the cursor remains constant, this is what ls/tree do and improves
+ // performance significantly due to the cursor DOM element not needing to change
+ data[data.length - 1] = 0x0D; // \r
+ testData.push(data);
+ }
+ const start = performance.now();
+ for (let i = 0; i < 1024 * 50; i++) {
+ for (const d of testData) {
+ term.write(d);
+ }
+ }
+ // Wait for all data to be parsed before evaluating time
+ term.write('', () => {
+ const time = Math.round(performance.now() - start);
+ const mbs = ((byteCount / 1024) * (1 / (time / 1000))).toFixed(2);
+ term.write(`\n\r\nWrote ${byteCount}kB in ${time}ms (${mbs}MB/s) using the (${rendererName} renderer)`);
+ // Send ^C to get a new prompt
+ term._core._onData.fire('\x03');
+ });
+}
+
function powerlineSymbolTest(): void {
function s(char: string): string {
return `${char} \x1b[7m${char}\x1b[0m `;
diff --git a/demo/index.html b/demo/index.html
index 238c9886..06451847 100644
--- a/demo/index.html
+++ b/demo/index.html
@@ -86,6 +86,7 @@
Performance
+
From 90ff6f3d062e52dd92e5684c37050ee7106eb147 Mon Sep 17 00:00:00 2001
From: Daniel Imms <2193314+Tyriar@users.noreply.github.com>
Date: Sun, 14 Jul 2024 07:41:56 -0700
Subject: [PATCH 02/15] Migrate most EventEmitter to base/ Emitter
---
addons/addon-canvas/src/BaseRenderLayer.ts | 5 ++--
addons/addon-canvas/src/CanvasAddon.ts | 7 +++---
addons/addon-canvas/src/CanvasRenderer.ts | 9 ++++---
addons/addon-canvas/src/tsconfig.json | 6 +++++
addons/addon-webgl/src/WebglAddon.ts | 11 ++++----
addons/addon-webgl/src/WebglRenderer.ts | 13 +++++-----
addons/addon-webgl/src/tsconfig.json | 6 +++++
src/browser/CoreBrowserTerminal.ts | 19 +++++++-------
src/browser/Linkifier.ts | 6 ++---
src/browser/TestUtils.test.ts | 17 +++++++------
src/browser/Viewport.ts | 5 ++--
src/browser/renderer/dom/DomRenderer.ts | 4 +--
src/browser/renderer/shared/TextureAtlas.ts | 6 ++---
src/browser/services/CharSizeService.ts | 4 +--
src/browser/services/CoreBrowserService.ts | 9 ++++---
src/browser/services/RenderService.ts | 3 ++-
src/browser/services/SelectionService.ts | 10 ++++----
src/browser/services/ThemeService.ts | 4 +--
src/common/CircularList.ts | 8 +++---
src/common/CoreTerminal.ts | 11 ++++----
src/common/EventEmitter.test.ts | 6 ++---
src/common/EventEmitter.ts | 6 +++--
src/common/InputHandler.ts | 25 ++++++++++---------
src/common/TestUtils.test.ts | 21 ++++++++--------
src/common/Types.ts | 9 ++++---
src/common/buffer/Buffer.ts | 4 +++
src/common/buffer/Marker.ts | 4 +--
src/common/input/WriteBuffer.ts | 4 +--
src/common/public/BufferNamespaceApi.ts | 4 +--
src/common/services/BufferService.ts | 3 ++-
src/common/services/CoreMouseService.ts | 4 +--
src/common/services/CoreService.ts | 10 ++++----
src/common/services/DecorationService.test.ts | 4 +--
src/common/services/DecorationService.ts | 10 ++++----
src/common/services/OptionsService.ts | 4 +--
src/common/services/Services.ts | 5 ++--
src/common/services/UnicodeService.ts | 4 +--
src/common/tsconfig.json | 8 +++++-
src/headless/Terminal.ts | 13 +++++-----
39 files changed, 176 insertions(+), 135 deletions(-)
diff --git a/addons/addon-canvas/src/BaseRenderLayer.ts b/addons/addon-canvas/src/BaseRenderLayer.ts
index cd3cfa1f..8e1991dd 100644
--- a/addons/addon-canvas/src/BaseRenderLayer.ts
+++ b/addons/addon-canvas/src/BaseRenderLayer.ts
@@ -12,7 +12,7 @@ import { allowRescaling, throwIfFalsy } from 'browser/renderer/shared/RendererUt
import { createSelectionRenderModel } from 'browser/renderer/shared/SelectionRenderModel';
import { IRasterizedGlyph, IRenderDimensions, ISelectionRenderModel, ITextureAtlas } from 'browser/renderer/shared/Types';
import { ICoreBrowserService, IThemeService } from 'browser/services/Services';
-import { EventEmitter, forwardEvent } from 'common/EventEmitter';
+import { forwardEvent } from 'common/EventEmitter';
import { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle';
import { isSafari } from 'common/Platform';
import { ICellData } from 'common/Types';
@@ -21,6 +21,7 @@ import { WHITESPACE_CELL_CODE } from 'common/buffer/Constants';
import { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services';
import { Terminal } from '@xterm/xterm';
import { IRenderLayer } from './Types';
+import { Emitter } from 'vs/base/common/event';
export abstract class BaseRenderLayer extends Disposable implements IRenderLayer {
private _canvas: HTMLCanvasElement;
@@ -42,7 +43,7 @@ export abstract class BaseRenderLayer extends Disposable implements IRenderLayer
public get canvas(): HTMLCanvasElement { return this._canvas; }
public get cacheCanvas(): HTMLCanvasElement { return this._charAtlas?.pages[0].canvas!; }
- private readonly _onAddTextureAtlasCanvas = this.register(new EventEmitter());
+ private readonly _onAddTextureAtlasCanvas = this.register(new Emitter());
public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;
constructor(
diff --git a/addons/addon-canvas/src/CanvasAddon.ts b/addons/addon-canvas/src/CanvasAddon.ts
index 4d32b021..9668d361 100644
--- a/addons/addon-canvas/src/CanvasAddon.ts
+++ b/addons/addon-canvas/src/CanvasAddon.ts
@@ -7,19 +7,20 @@ import type { ITerminalAddon, Terminal } from '@xterm/xterm';
import type { CanvasAddon as ICanvasApi } from '@xterm/addon-canvas';
import { ICharacterJoinerService, ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services';
import { ITerminal } from 'browser/Types';
-import { EventEmitter, forwardEvent } from 'common/EventEmitter';
+import { forwardEvent } from 'common/EventEmitter';
import { Disposable, toDisposable } from 'common/Lifecycle';
import { setTraceLogger } from 'common/services/LogService';
import { IBufferService, IDecorationService, ILogService } from 'common/services/Services';
import { CanvasRenderer } from './CanvasRenderer';
+import { Emitter } from '../../../src/vs/base/common/event';
export class CanvasAddon extends Disposable implements ITerminalAddon , ICanvasApi {
private _terminal?: Terminal;
private _renderer?: CanvasRenderer;
- private readonly _onChangeTextureAtlas = this.register(new EventEmitter());
+ private readonly _onChangeTextureAtlas = this.register(new Emitter());
public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event;
- private readonly _onAddTextureAtlasCanvas = this.register(new EventEmitter());
+ private readonly _onAddTextureAtlasCanvas = this.register(new Emitter());
public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;
public get textureAtlas(): HTMLCanvasElement | undefined {
diff --git a/addons/addon-canvas/src/CanvasRenderer.ts b/addons/addon-canvas/src/CanvasRenderer.ts
index 148ae736..4d240b43 100644
--- a/addons/addon-canvas/src/CanvasRenderer.ts
+++ b/addons/addon-canvas/src/CanvasRenderer.ts
@@ -9,7 +9,7 @@ import { observeDevicePixelDimensions } from 'browser/renderer/shared/DevicePixe
import { createRenderDimensions } from 'browser/renderer/shared/RendererUtils';
import { IRenderDimensions, IRenderer, IRequestRedrawEvent } from 'browser/renderer/shared/Types';
import { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'browser/services/Services';
-import { EventEmitter, forwardEvent } from 'common/EventEmitter';
+import { forwardEvent } from 'common/EventEmitter';
import { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle';
import { IBufferService, ICoreService, IDecorationService, IOptionsService } from 'common/services/Services';
import { Terminal } from '@xterm/xterm';
@@ -18,6 +18,7 @@ import { LinkRenderLayer } from './LinkRenderLayer';
import { SelectionRenderLayer } from './SelectionRenderLayer';
import { TextRenderLayer } from './TextRenderLayer';
import { IRenderLayer } from './Types';
+import { Emitter } from 'vs/base/common/event';
export class CanvasRenderer extends Disposable implements IRenderer {
private _renderLayers: IRenderLayer[];
@@ -26,11 +27,11 @@ export class CanvasRenderer extends Disposable implements IRenderer {
public dimensions: IRenderDimensions;
- private readonly _onRequestRedraw = this.register(new EventEmitter());
+ private readonly _onRequestRedraw = this.register(new Emitter());
public readonly onRequestRedraw = this._onRequestRedraw.event;
- private readonly _onChangeTextureAtlas = this.register(new EventEmitter());
+ private readonly _onChangeTextureAtlas = this.register(new Emitter());
public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event;
- private readonly _onAddTextureAtlasCanvas = this.register(new EventEmitter());
+ private readonly _onAddTextureAtlasCanvas = this.register(new Emitter());
public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;
constructor(
diff --git a/addons/addon-canvas/src/tsconfig.json b/addons/addon-canvas/src/tsconfig.json
index 1ed8c2ac..093acefb 100644
--- a/addons/addon-canvas/src/tsconfig.json
+++ b/addons/addon-canvas/src/tsconfig.json
@@ -18,6 +18,9 @@
"browser/*": [
"../../../src/browser/*"
],
+ "vs/*": [
+ "../../../src/vs/*"
+ ],
"@xterm/addon-canvas": [
"../typings/addon-canvas.d.ts"
]
@@ -38,6 +41,9 @@
},
{
"path": "../../../src/browser"
+ },
+ {
+ "path": "../../../src/vs"
}
]
}
diff --git a/addons/addon-webgl/src/WebglAddon.ts b/addons/addon-webgl/src/WebglAddon.ts
index 2b3a7f96..61371358 100644
--- a/addons/addon-webgl/src/WebglAddon.ts
+++ b/addons/addon-webgl/src/WebglAddon.ts
@@ -7,25 +7,26 @@ import type { ITerminalAddon, Terminal } from '@xterm/xterm';
import type { WebglAddon as IWebglApi } from '@xterm/addon-webgl';
import { ICharacterJoinerService, ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services';
import { ITerminal } from 'browser/Types';
-import { EventEmitter, forwardEvent } from 'common/EventEmitter';
+import { forwardEvent } from 'common/EventEmitter';
import { Disposable, toDisposable } from 'common/Lifecycle';
import { getSafariVersion, isSafari } from 'common/Platform';
import { ICoreService, IDecorationService, ILogService, IOptionsService } from 'common/services/Services';
import { IWebGL2RenderingContext } from './Types';
import { WebglRenderer } from './WebglRenderer';
import { setTraceLogger } from 'common/services/LogService';
+import { Emitter } from '../../../src/vs/base/common/event';
export class WebglAddon extends Disposable implements ITerminalAddon , IWebglApi {
private _terminal?: Terminal;
private _renderer?: WebglRenderer;
- private readonly _onChangeTextureAtlas = this.register(new EventEmitter());
+ private readonly _onChangeTextureAtlas = this.register(new Emitter());
public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event;
- private readonly _onAddTextureAtlasCanvas = this.register(new EventEmitter());
+ private readonly _onAddTextureAtlasCanvas = this.register(new Emitter());
public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;
- private readonly _onRemoveTextureAtlasCanvas = this.register(new EventEmitter());
+ private readonly _onRemoveTextureAtlasCanvas = this.register(new Emitter());
public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;
- private readonly _onContextLoss = this.register(new EventEmitter());
+ private readonly _onContextLoss = this.register(new Emitter());
public readonly onContextLoss = this._onContextLoss.event;
constructor(
diff --git a/addons/addon-webgl/src/WebglRenderer.ts b/addons/addon-webgl/src/WebglRenderer.ts
index fa178652..3e0bf0c7 100644
--- a/addons/addon-webgl/src/WebglRenderer.ts
+++ b/addons/addon-webgl/src/WebglRenderer.ts
@@ -12,7 +12,7 @@ import { observeDevicePixelDimensions } from 'browser/renderer/shared/DevicePixe
import { createRenderDimensions } from 'browser/renderer/shared/RendererUtils';
import { IRenderDimensions, IRenderer, IRequestRedrawEvent, ITextureAtlas } from 'browser/renderer/shared/Types';
import { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'browser/services/Services';
-import { EventEmitter, forwardEvent } from 'common/EventEmitter';
+import { forwardEvent } from 'common/EventEmitter';
import { Disposable, MutableDisposable, getDisposeArrayDisposable, toDisposable } from 'common/Lifecycle';
import { CharData, IBufferLine, ICellData } from 'common/Types';
import { AttributeData } from 'common/buffer/AttributeData';
@@ -26,6 +26,7 @@ import { COMBINED_CHAR_BIT_MASK, RENDER_MODEL_BG_OFFSET, RENDER_MODEL_EXT_OFFSET
import { IWebGL2RenderingContext } from './Types';
import { LinkRenderLayer } from './renderLayer/LinkRenderLayer';
import { IRenderLayer } from './renderLayer/Types';
+import { Emitter } from '../../../src/vs/base/common/event';
export class WebglRenderer extends Disposable implements IRenderer {
private _renderLayers: IRenderLayer[];
@@ -51,15 +52,15 @@ export class WebglRenderer extends Disposable implements IRenderer {
private _isAttached: boolean;
private _contextRestorationTimeout: number | undefined;
- private readonly _onChangeTextureAtlas = this.register(new EventEmitter());
+ private readonly _onChangeTextureAtlas = this.register(new Emitter());
public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event;
- private readonly _onAddTextureAtlasCanvas = this.register(new EventEmitter());
+ private readonly _onAddTextureAtlasCanvas = this.register(new Emitter());
public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;
- private readonly _onRemoveTextureAtlasCanvas = this.register(new EventEmitter());
+ private readonly _onRemoveTextureAtlasCanvas = this.register(new Emitter());
public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;
- private readonly _onRequestRedraw = this.register(new EventEmitter());
+ private readonly _onRequestRedraw = this.register(new Emitter());
public readonly onRequestRedraw = this._onRequestRedraw.event;
- private readonly _onContextLoss = this.register(new EventEmitter());
+ private readonly _onContextLoss = this.register(new Emitter());
public readonly onContextLoss = this._onContextLoss.event;
constructor(
diff --git a/addons/addon-webgl/src/tsconfig.json b/addons/addon-webgl/src/tsconfig.json
index 924d3762..55d754d7 100644
--- a/addons/addon-webgl/src/tsconfig.json
+++ b/addons/addon-webgl/src/tsconfig.json
@@ -18,6 +18,9 @@
"browser/*": [
"../../../src/browser/*"
],
+ "vs/*": [
+ "../../../src/vs/*"
+ ],
"@xterm/addon-webgl": [
"../typings/addon-webgl.d.ts"
]
@@ -39,6 +42,9 @@
},
{
"path": "../../../src/browser"
+ },
+ {
+ "path": "../../../src/vs"
}
]
}
diff --git a/src/browser/CoreBrowserTerminal.ts b/src/browser/CoreBrowserTerminal.ts
index b9329bcf..8d2bfbd7 100644
--- a/src/browser/CoreBrowserTerminal.ts
+++ b/src/browser/CoreBrowserTerminal.ts
@@ -58,6 +58,7 @@ import { IDecorationService } from 'common/services/Services';
import { WindowsOptionsReportType } from '../common/InputHandler';
import { AccessibilityManager } from './AccessibilityManager';
import { Linkifier } from './Linkifier';
+import { Emitter } from 'vs/base/common/event';
export class CoreBrowserTerminal extends CoreTerminal implements ITerminal {
public textarea: HTMLTextAreaElement | undefined;
@@ -121,28 +122,28 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal {
private _compositionHelper: ICompositionHelper | undefined;
private _accessibilityManager: MutableDisposable = this.register(new MutableDisposable());
- private readonly _onCursorMove = this.register(new EventEmitter());
+ private readonly _onCursorMove = this.register(new Emitter());
public readonly onCursorMove = this._onCursorMove.event;
private readonly _onKey = this.register(new EventEmitter<{ key: string, domEvent: KeyboardEvent }>());
public readonly onKey = this._onKey.event;
private readonly _onRender = this.register(new EventEmitter<{ start: number, end: number }>());
public readonly onRender = this._onRender.event;
- private readonly _onSelectionChange = this.register(new EventEmitter());
+ private readonly _onSelectionChange = this.register(new Emitter());
public readonly onSelectionChange = this._onSelectionChange.event;
- private readonly _onTitleChange = this.register(new EventEmitter());
+ private readonly _onTitleChange = this.register(new Emitter());
public readonly onTitleChange = this._onTitleChange.event;
- private readonly _onBell = this.register(new EventEmitter());
+ private readonly _onBell = this.register(new Emitter());
public readonly onBell = this._onBell.event;
- private _onFocus = this.register(new EventEmitter());
+ private _onFocus = this.register(new Emitter());
public get onFocus(): IEvent { return this._onFocus.event; }
- private _onBlur = this.register(new EventEmitter());
+ private _onBlur = this.register(new Emitter());
public get onBlur(): IEvent { return this._onBlur.event; }
- private _onA11yCharEmitter = this.register(new EventEmitter());
+ private _onA11yCharEmitter = this.register(new Emitter());
public get onA11yChar(): IEvent { return this._onA11yCharEmitter.event; }
- private _onA11yTabEmitter = this.register(new EventEmitter());
+ private _onA11yTabEmitter = this.register(new Emitter());
public get onA11yTab(): IEvent { return this._onA11yTabEmitter.event; }
- private _onWillOpen = this.register(new EventEmitter());
+ private _onWillOpen = this.register(new Emitter());
public get onWillOpen(): IEvent { return this._onWillOpen.event; }
constructor(
diff --git a/src/browser/Linkifier.ts b/src/browser/Linkifier.ts
index ac37e42f..d01f0ebe 100644
--- a/src/browser/Linkifier.ts
+++ b/src/browser/Linkifier.ts
@@ -5,11 +5,11 @@
import { addDisposableDomListener } from 'browser/Lifecycle';
import { IBufferCellPosition, ILink, ILinkDecorations, ILinkWithState, ILinkifier2, ILinkifierEvent } from 'browser/Types';
-import { EventEmitter } from 'common/EventEmitter';
import { Disposable, disposeArray, getDisposeArrayDisposable, toDisposable } from 'common/Lifecycle';
import { IDisposable } from 'common/Types';
import { IBufferService } from 'common/services/Services';
import { ILinkProviderService, IMouseService, IRenderService } from './services/Services';
+import { Emitter } from 'vs/base/common/event';
export class Linkifier extends Disposable implements ILinkifier2 {
public get currentLink(): ILinkWithState | undefined { return this._currentLink; }
@@ -23,9 +23,9 @@ export class Linkifier extends Disposable implements ILinkifier2 {
private _activeProviderReplies: Map | undefined;
private _activeLine: number = -1;
- private readonly _onShowLinkUnderline = this.register(new EventEmitter());
+ private readonly _onShowLinkUnderline = this.register(new Emitter());
public readonly onShowLinkUnderline = this._onShowLinkUnderline.event;
- private readonly _onHideLinkUnderline = this.register(new EventEmitter());
+ private readonly _onHideLinkUnderline = this.register(new Emitter());
public readonly onHideLinkUnderline = this._onHideLinkUnderline.event;
constructor(
diff --git a/src/browser/TestUtils.test.ts b/src/browser/TestUtils.test.ts
index 45af130f..c2473449 100644
--- a/src/browser/TestUtils.test.ts
+++ b/src/browser/TestUtils.test.ts
@@ -19,6 +19,7 @@ import { AttributeData } from 'common/buffer/AttributeData';
import { ISelectionRedrawRequestEvent, ISelectionRequestScrollLinesEvent } from 'browser/selection/Types';
import { css } from 'common/Color';
import { createRenderDimensions } from 'browser/renderer/shared/RendererUtils';
+import { Emitter } from 'vs/base/common/event';
export class TestTerminal extends CoreBrowserTerminal {
public get curAttrData(): IAttributeData { return (this as any)._inputHandler._curAttrData; }
@@ -356,7 +357,7 @@ export class MockCompositionHelper implements ICompositionHelper {
}
export class MockCoreBrowserService implements ICoreBrowserService {
- public onDprChange = new EventEmitter().event;
+ public onDprChange = new Emitter().event;
public onWindowChange = new EventEmitter().event;
public serviceBrand: undefined;
public isFocused: boolean = true;
@@ -372,7 +373,7 @@ export class MockCoreBrowserService implements ICoreBrowserService {
export class MockCharSizeService implements ICharSizeService {
public serviceBrand: undefined;
public get hasValidSize(): boolean { return this.width > 0 && this.height > 0; }
- public onCharSizeChange: IEvent = new EventEmitter().event;
+ public onCharSizeChange: IEvent = new Emitter().event;
constructor(public width: number, public height: number) {}
public measure(): void {}
}
@@ -390,7 +391,7 @@ export class MockMouseService implements IMouseService {
export class MockRenderService implements IRenderService {
public serviceBrand: undefined;
- public onDimensionsChange: IEvent = new EventEmitter().event;
+ public onDimensionsChange: IEvent = new Emitter().event;
public onRenderedViewportChange: IEvent<{ start: number, end: number }, void> = new EventEmitter<{ start: number, end: number }>().event;
public onRender: IEvent<{ start: number, end: number }, void> = new EventEmitter<{ start: number, end: number }>().event;
public onRefreshRequest: IEvent<{ start: number, end: number}, void> = new EventEmitter<{ start: number, end: number }>().event;
@@ -464,10 +465,10 @@ export class MockSelectionService implements ISelectionService {
public hasSelection: boolean = false;
public selectionStart: [number, number] | undefined;
public selectionEnd: [number, number] | undefined;
- public onLinuxMouseSelection = new EventEmitter().event;
- public onRequestRedraw = new EventEmitter().event;
- public onRequestScrollLines = new EventEmitter().event;
- public onSelectionChange = new EventEmitter().event;
+ public onLinuxMouseSelection = new Emitter().event;
+ public onRequestRedraw = new Emitter().event;
+ public onRequestScrollLines = new Emitter().event;
+ public onSelectionChange = new Emitter().event;
public disable(): void {
throw new Error('Method not implemented.');
}
@@ -511,7 +512,7 @@ export class MockSelectionService implements ISelectionService {
export class MockThemeService implements IThemeService{
public serviceBrand: undefined;
- public onChangeColors = new EventEmitter().event;
+ public onChangeColors = new Emitter().event;
public restoreColor(slot?: ColorIndex | undefined): void {
throw new Error('Method not implemented.');
}
diff --git a/src/browser/Viewport.ts b/src/browser/Viewport.ts
index 64fcba2c..2e4db12c 100644
--- a/src/browser/Viewport.ts
+++ b/src/browser/Viewport.ts
@@ -5,18 +5,19 @@
import { ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services';
import { ViewportConstants } from 'browser/shared/Constants';
-import { EventEmitter, runAndSubscribe } from 'common/EventEmitter';
+import { runAndSubscribe } from 'common/EventEmitter';
import { Disposable, toDisposable } from 'common/Lifecycle';
import { IBufferService, ICoreMouseService, IOptionsService } from 'common/services/Services';
import { CoreMouseEventType } from 'common/Types';
import { scheduleAtNextAnimationFrame } from 'vs/base/browser/dom';
import { SmoothScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement';
import type { ScrollableElementChangeOptions } from 'vs/base/browser/ui/scrollbar/scrollableElementOptions';
+import { Emitter } from 'vs/base/common/event';
import { Scrollable, ScrollbarVisibility, type ScrollEvent } from 'vs/base/common/scrollable';
export class Viewport extends Disposable {
- protected _onRequestScrollLines = this.register(new EventEmitter());
+ protected _onRequestScrollLines = this.register(new Emitter());
public readonly onRequestScrollLines = this._onRequestScrollLines.event;
private _scrollableElement: SmoothScrollableElement;
diff --git a/src/browser/renderer/dom/DomRenderer.ts b/src/browser/renderer/dom/DomRenderer.ts
index 92d152f0..ce8721c0 100644
--- a/src/browser/renderer/dom/DomRenderer.ts
+++ b/src/browser/renderer/dom/DomRenderer.ts
@@ -12,9 +12,9 @@ import { IRenderDimensions, IRenderer, IRequestRedrawEvent, ISelectionRenderMode
import { ICharSizeService, ICoreBrowserService, IThemeService } from 'browser/services/Services';
import { ILinkifier2, ILinkifierEvent, ITerminal, ReadonlyColorSet } from 'browser/Types';
import { color } from 'common/Color';
-import { EventEmitter } from 'common/EventEmitter';
import { Disposable, toDisposable } from 'common/Lifecycle';
import { IBufferService, IInstantiationService, IOptionsService } from 'common/services/Services';
+import { Emitter } from 'vs/base/common/event';
const TERMINAL_CLASS_PREFIX = 'xterm-dom-renderer-owner-';
@@ -45,7 +45,7 @@ export class DomRenderer extends Disposable implements IRenderer {
public dimensions: IRenderDimensions;
- public readonly onRequestRedraw = this.register(new EventEmitter()).event;
+ public readonly onRequestRedraw = this.register(new Emitter()).event;
constructor(
private readonly _terminal: ITerminal,
diff --git a/src/browser/renderer/shared/TextureAtlas.ts b/src/browser/renderer/shared/TextureAtlas.ts
index af2cafb8..a86cd459 100644
--- a/src/browser/renderer/shared/TextureAtlas.ts
+++ b/src/browser/renderer/shared/TextureAtlas.ts
@@ -9,13 +9,13 @@ import { tryDrawCustomChar } from 'browser/renderer/shared/CustomGlyphs';
import { computeNextVariantOffset, treatGlyphAsBackgroundColor, isPowerlineGlyph, isRestrictedPowerlineGlyph, throwIfFalsy } from 'browser/renderer/shared/RendererUtils';
import { IBoundingBox, ICharAtlasConfig, IRasterizedGlyph, ITextureAtlas } from 'browser/renderer/shared/Types';
import { NULL_COLOR, channels, color, rgba } from 'common/Color';
-import { EventEmitter } from 'common/EventEmitter';
import { FourKeyMap } from 'common/MultiKeyMap';
import { IdleTaskQueue } from 'common/TaskQueue';
import { IColor } from 'common/Types';
import { AttributeData } from 'common/buffer/AttributeData';
import { Attributes, DEFAULT_COLOR, DEFAULT_EXT, UnderlineStyle } from 'common/buffer/Constants';
import { IUnicodeService } from 'common/services/Services';
+import { Emitter } from 'vs/base/common/event';
/**
* A shared object which is used to draw nothing for a particular cell.
@@ -79,9 +79,9 @@ export class TextureAtlas implements ITextureAtlas {
public static maxAtlasPages: number | undefined;
public static maxTextureSize: number | undefined;
- private readonly _onAddTextureAtlasCanvas = new EventEmitter();
+ private readonly _onAddTextureAtlasCanvas = new Emitter();
public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;
- private readonly _onRemoveTextureAtlasCanvas = new EventEmitter();
+ private readonly _onRemoveTextureAtlasCanvas = new Emitter();
public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;
constructor(
diff --git a/src/browser/services/CharSizeService.ts b/src/browser/services/CharSizeService.ts
index da14b67d..faf81d97 100644
--- a/src/browser/services/CharSizeService.ts
+++ b/src/browser/services/CharSizeService.ts
@@ -4,9 +4,9 @@
*/
import { IOptionsService } from 'common/services/Services';
-import { EventEmitter } from 'common/EventEmitter';
import { ICharSizeService } from 'browser/services/Services';
import { Disposable } from 'common/Lifecycle';
+import { Emitter } from 'vs/base/common/event';
export class CharSizeService extends Disposable implements ICharSizeService {
public serviceBrand: undefined;
@@ -17,7 +17,7 @@ export class CharSizeService extends Disposable implements ICharSizeService {
public get hasValidSize(): boolean { return this.width > 0 && this.height > 0; }
- private readonly _onCharSizeChange = this.register(new EventEmitter());
+ private readonly _onCharSizeChange = this.register(new Emitter());
public readonly onCharSizeChange = this._onCharSizeChange.event;
constructor(
diff --git a/src/browser/services/CoreBrowserService.ts b/src/browser/services/CoreBrowserService.ts
index a6c066b2..8156eb24 100644
--- a/src/browser/services/CoreBrowserService.ts
+++ b/src/browser/services/CoreBrowserService.ts
@@ -5,8 +5,9 @@
import { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle';
import { ICoreBrowserService } from './Services';
-import { EventEmitter, forwardEvent } from 'common/EventEmitter';
+import { forwardEvent } from 'common/EventEmitter';
import { addDisposableDomListener } from 'browser/Lifecycle';
+import { Emitter } from 'vs/base/common/event';
export class CoreBrowserService extends Disposable implements ICoreBrowserService {
public serviceBrand: undefined;
@@ -15,9 +16,9 @@ export class CoreBrowserService extends Disposable implements ICoreBrowserServic
private _cachedIsFocused: boolean | undefined = undefined;
private _screenDprMonitor = this.register(new ScreenDprMonitor(this._window));
- private readonly _onDprChange = this.register(new EventEmitter());
+ private readonly _onDprChange = this.register(new Emitter());
public readonly onDprChange = this._onDprChange.event;
- private readonly _onWindowChange = this.register(new EventEmitter());
+ private readonly _onWindowChange = this.register(new Emitter());
public readonly onWindowChange = this._onWindowChange.event;
constructor(
@@ -80,7 +81,7 @@ class ScreenDprMonitor extends Disposable {
private _resolutionMediaMatchList: MediaQueryList | undefined;
private _windowResizeListener = this.register(new MutableDisposable());
- private readonly _onDprChange = this.register(new EventEmitter());
+ private readonly _onDprChange = this.register(new Emitter());
public readonly onDprChange = this._onDprChange.event;
constructor(private _parentWindow: Window) {
diff --git a/src/browser/services/RenderService.ts b/src/browser/services/RenderService.ts
index d4f2be46..2b6dd9a7 100644
--- a/src/browser/services/RenderService.ts
+++ b/src/browser/services/RenderService.ts
@@ -11,6 +11,7 @@ import { EventEmitter } from 'common/EventEmitter';
import { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle';
import { DebouncedIdleTask } from 'common/TaskQueue';
import { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services';
+import { Emitter } from 'vs/base/common/event';
interface ISelectionState {
start: [number, number] | undefined;
@@ -38,7 +39,7 @@ export class RenderService extends Disposable implements IRenderService {
columnSelectMode: false
};
- private readonly _onDimensionsChange = this.register(new EventEmitter());
+ private readonly _onDimensionsChange = this.register(new Emitter());
public readonly onDimensionsChange = this._onDimensionsChange.event;
private readonly _onRenderedViewportChange = this.register(new EventEmitter<{ start: number, end: number }>());
public readonly onRenderedViewportChange = this._onRenderedViewportChange.event;
diff --git a/src/browser/services/SelectionService.ts b/src/browser/services/SelectionService.ts
index e134802e..df309599 100644
--- a/src/browser/services/SelectionService.ts
+++ b/src/browser/services/SelectionService.ts
@@ -9,7 +9,6 @@ import { moveToCellSequence } from 'browser/input/MoveToCell';
import { SelectionModel } from 'browser/selection/SelectionModel';
import { ISelectionRedrawRequestEvent, ISelectionRequestScrollLinesEvent } from 'browser/selection/Types';
import { ICoreBrowserService, IMouseService, IRenderService, ISelectionService } from 'browser/services/Services';
-import { EventEmitter } from 'common/EventEmitter';
import { Disposable, toDisposable } from 'common/Lifecycle';
import * as Browser from 'common/Platform';
import { IBufferLine, IDisposable } from 'common/Types';
@@ -17,6 +16,7 @@ import { getRangeLength } from 'common/buffer/BufferRange';
import { CellData } from 'common/buffer/CellData';
import { IBuffer } from 'common/buffer/Types';
import { IBufferService, ICoreService, IOptionsService } from 'common/services/Services';
+import { Emitter } from 'vs/base/common/event';
/**
* The number of pixels the mouse needs to be above or below the viewport in
@@ -111,13 +111,13 @@ export class SelectionService extends Disposable implements ISelectionService {
private _oldSelectionStart: [number, number] | undefined = undefined;
private _oldSelectionEnd: [number, number] | undefined = undefined;
- private readonly _onLinuxMouseSelection = this.register(new EventEmitter());
+ private readonly _onLinuxMouseSelection = this.register(new Emitter());
public readonly onLinuxMouseSelection = this._onLinuxMouseSelection.event;
- private readonly _onRedrawRequest = this.register(new EventEmitter());
+ private readonly _onRedrawRequest = this.register(new Emitter());
public readonly onRequestRedraw = this._onRedrawRequest.event;
- private readonly _onSelectionChange = this.register(new EventEmitter());
+ private readonly _onSelectionChange = this.register(new Emitter());
public readonly onSelectionChange = this._onSelectionChange.event;
- private readonly _onRequestScrollLines = this.register(new EventEmitter());
+ private readonly _onRequestScrollLines = this.register(new Emitter());
public readonly onRequestScrollLines = this._onRequestScrollLines.event;
constructor(
diff --git a/src/browser/services/ThemeService.ts b/src/browser/services/ThemeService.ts
index 3e6dd481..ce6633c5 100644
--- a/src/browser/services/ThemeService.ts
+++ b/src/browser/services/ThemeService.ts
@@ -7,10 +7,10 @@ import { ColorContrastCache } from 'browser/ColorContrastCache';
import { IThemeService } from 'browser/services/Services';
import { DEFAULT_ANSI_COLORS, IColorContrastCache, IColorSet, ReadonlyColorSet } from 'browser/Types';
import { color, css, NULL_COLOR } from 'common/Color';
-import { EventEmitter } from 'common/EventEmitter';
import { Disposable } from 'common/Lifecycle';
import { IOptionsService, ITheme } from 'common/services/Services';
import { AllColorIndex, IColor, SpecialColorIndex } from 'common/Types';
+import { Emitter } from 'vs/base/common/event';
interface IRestoreColorSet {
foreground: IColor;
@@ -40,7 +40,7 @@ export class ThemeService extends Disposable implements IThemeService {
public get colors(): ReadonlyColorSet { return this._colors; }
- private readonly _onChangeColors = this.register(new EventEmitter());
+ private readonly _onChangeColors = this.register(new Emitter());
public readonly onChangeColors = this._onChangeColors.event;
constructor(
diff --git a/src/common/CircularList.ts b/src/common/CircularList.ts
index 622a1eff..94351034 100644
--- a/src/common/CircularList.ts
+++ b/src/common/CircularList.ts
@@ -4,8 +4,8 @@
*/
import { ICircularList } from 'common/Types';
-import { EventEmitter } from 'common/EventEmitter';
import { Disposable } from 'common/Lifecycle';
+import { Emitter } from 'vs/base/common/event';
export interface IInsertEvent {
index: number;
@@ -26,11 +26,11 @@ export class CircularList extends Disposable implements ICircularList {
private _startIndex: number;
private _length: number;
- public readonly onDeleteEmitter = this.register(new EventEmitter());
+ public readonly onDeleteEmitter = this.register(new Emitter());
public readonly onDelete = this.onDeleteEmitter.event;
- public readonly onInsertEmitter = this.register(new EventEmitter());
+ public readonly onInsertEmitter = this.register(new Emitter());
public readonly onInsert = this.onInsertEmitter.event;
- public readonly onTrimEmitter = this.register(new EventEmitter());
+ public readonly onTrimEmitter = this.register(new Emitter());
public readonly onTrim = this.onTrimEmitter.event;
constructor(
diff --git a/src/common/CoreTerminal.ts b/src/common/CoreTerminal.ts
index 132be05b..5aba90ca 100644
--- a/src/common/CoreTerminal.ts
+++ b/src/common/CoreTerminal.ts
@@ -39,6 +39,7 @@ import { IBufferSet } from 'common/buffer/Types';
import { InputHandler } from 'common/InputHandler';
import { WriteBuffer } from 'common/input/WriteBuffer';
import { OscLinkService } from 'common/services/OscLinkService';
+import { Emitter } from 'vs/base/common/event';
// Only trigger this warning a single time per session
let hasWriteSyncWarnHappened = false;
@@ -59,15 +60,15 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal {
private _writeBuffer: WriteBuffer;
private _windowsWrappingHeuristics = this.register(new MutableDisposable());
- private readonly _onBinary = this.register(new EventEmitter());
+ private readonly _onBinary = this.register(new Emitter());
public readonly onBinary = this._onBinary.event;
- private readonly _onData = this.register(new EventEmitter());
+ private readonly _onData = this.register(new Emitter());
public readonly onData = this._onData.event;
- protected _onLineFeed = this.register(new EventEmitter());
+ protected _onLineFeed = this.register(new Emitter());
public readonly onLineFeed = this._onLineFeed.event;
- private readonly _onResize = this.register(new EventEmitter<{ cols: number, rows: number }>());
+ private readonly _onResize = this.register(new Emitter<{ cols: number, rows: number }>());
public readonly onResize = this._onResize.event;
- protected readonly _onWriteParsed = this.register(new EventEmitter());
+ protected readonly _onWriteParsed = this.register(new Emitter());
public readonly onWriteParsed = this._onWriteParsed.event;
/**
diff --git a/src/common/EventEmitter.test.ts b/src/common/EventEmitter.test.ts
index e9013a99..25db647c 100644
--- a/src/common/EventEmitter.test.ts
+++ b/src/common/EventEmitter.test.ts
@@ -4,12 +4,12 @@
*/
import { assert } from 'chai';
-import { EventEmitter } from 'common/EventEmitter';
+import { Emitter } from 'vs/base/common/event';
describe('EventEmitter', () => {
it('should fire listeners multiple times', () => {
const order: string[] = [];
- const emitter = new EventEmitter();
+ const emitter = new Emitter();
emitter.event(data => order.push(data + 'a'));
emitter.event(data => order.push(data + 'b'));
emitter.fire(1);
@@ -19,7 +19,7 @@ describe('EventEmitter', () => {
it('should not fire listeners once disposed', () => {
const order: string[] = [];
- const emitter = new EventEmitter();
+ const emitter = new Emitter();
emitter.event(data => order.push(data + 'a'));
const disposeB = emitter.event(data => order.push(data + 'b'));
emitter.event(data => order.push(data + 'c'));
diff --git a/src/common/EventEmitter.ts b/src/common/EventEmitter.ts
index 06ddf7fb..953ded2e 100644
--- a/src/common/EventEmitter.ts
+++ b/src/common/EventEmitter.ts
@@ -4,6 +4,7 @@
*/
import { IDisposable } from 'common/Types';
+import type { Emitter, Event } from 'vs/base/common/event';
interface IListener {
(arg1: T, arg2: U): void;
@@ -18,7 +19,7 @@ export interface IEventEmitter {
fire(arg1: T, arg2: U): void;
dispose(): void;
}
-
+/** @deprecated Use vs/base/common/events version */
export class EventEmitter implements IEventEmitter {
private _listeners: Set> = new Set();
private _event?: IEvent;
@@ -63,10 +64,11 @@ export class EventEmitter implements IEventEmitter {
}
}
-export function forwardEvent(from: IEvent, to: IEventEmitter): IDisposable {
+export function forwardEvent(from: IEvent | Event, to: Emitter): IDisposable {
return from(e => to.fire(e));
}
+/** @deprecated Use vs/base/common/events version */
export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => any): IDisposable {
handler(undefined);
return event(e => handler(e));
diff --git a/src/common/InputHandler.ts b/src/common/InputHandler.ts
index bef0eaa7..df1cdc9d 100644
--- a/src/common/InputHandler.ts
+++ b/src/common/InputHandler.ts
@@ -22,6 +22,7 @@ import { OscHandler } from 'common/parser/OscParser';
import { DcsHandler } from 'common/parser/DcsParser';
import { IBuffer } from 'common/buffer/Types';
import { parseColor } from 'common/input/XParseColor';
+import { Emitter } from 'vs/base/common/event';
/**
* Map collect to glevel. Used in `selectCharset`.
@@ -132,32 +133,32 @@ export class InputHandler extends Disposable implements IInputHandler {
private _activeBuffer: IBuffer;
- private readonly _onRequestBell = this.register(new EventEmitter());
+ private readonly _onRequestBell = this.register(new Emitter());
public readonly onRequestBell = this._onRequestBell.event;
private readonly _onRequestRefreshRows = this.register(new EventEmitter());
public readonly onRequestRefreshRows = this._onRequestRefreshRows.event;
- private readonly _onRequestReset = this.register(new EventEmitter());
+ private readonly _onRequestReset = this.register(new Emitter());
public readonly onRequestReset = this._onRequestReset.event;
- private readonly _onRequestSendFocus = this.register(new EventEmitter());
+ private readonly _onRequestSendFocus = this.register(new Emitter());
public readonly onRequestSendFocus = this._onRequestSendFocus.event;
- private readonly _onRequestSyncScrollBar = this.register(new EventEmitter());
+ private readonly _onRequestSyncScrollBar = this.register(new Emitter());
public readonly onRequestSyncScrollBar = this._onRequestSyncScrollBar.event;
- private readonly _onRequestWindowsOptionsReport = this.register(new EventEmitter());
+ private readonly _onRequestWindowsOptionsReport = this.register(new Emitter());
public readonly onRequestWindowsOptionsReport = this._onRequestWindowsOptionsReport.event;
- private readonly _onA11yChar = this.register(new EventEmitter());
+ private readonly _onA11yChar = this.register(new Emitter());
public readonly onA11yChar = this._onA11yChar.event;
- private readonly _onA11yTab = this.register(new EventEmitter());
+ private readonly _onA11yTab = this.register(new Emitter());
public readonly onA11yTab = this._onA11yTab.event;
- private readonly _onCursorMove = this.register(new EventEmitter());
+ private readonly _onCursorMove = this.register(new Emitter());
public readonly onCursorMove = this._onCursorMove.event;
- private readonly _onLineFeed = this.register(new EventEmitter());
+ private readonly _onLineFeed = this.register(new Emitter());
public readonly onLineFeed = this._onLineFeed.event;
- private readonly _onScroll = this.register(new EventEmitter());
+ private readonly _onScroll = this.register(new Emitter());
public readonly onScroll = this._onScroll.event;
- private readonly _onTitleChange = this.register(new EventEmitter());
+ private readonly _onTitleChange = this.register(new Emitter());
public readonly onTitleChange = this._onTitleChange.event;
- private readonly _onColor = this.register(new EventEmitter());
+ private readonly _onColor = this.register(new Emitter());
public readonly onColor = this._onColor.event;
private _parseStack: IParseStack = {
diff --git a/src/common/TestUtils.test.ts b/src/common/TestUtils.test.ts
index fbf3ebcd..bd82a195 100644
--- a/src/common/TestUtils.test.ts
+++ b/src/common/TestUtils.test.ts
@@ -13,13 +13,14 @@ import { BufferSet } from 'common/buffer/BufferSet';
import { IDecPrivateModes, ICoreMouseEvent, CoreMouseEventType, ICharset, IModes, IAttributeData, IOscLinkData, IDisposable } from 'common/Types';
import { UnicodeV6 } from 'common/input/UnicodeV6';
import { IDecorationOptions, IDecoration } from '@xterm/xterm';
+import { Emitter } from 'vs/base/common/event';
export class MockBufferService implements IBufferService {
public serviceBrand: any;
public get buffer(): IBuffer { return this.buffers.active; }
public buffers: IBufferSet = {} as any;
public onResize: IEvent<{ cols: number, rows: number }> = new EventEmitter<{ cols: number, rows: number }>().event;
- public onScroll: IEvent = new EventEmitter().event;
+ public onScroll: IEvent = new Emitter().event;
public isUserScrolling: boolean = false;
constructor(
public cols: number,
@@ -62,7 +63,7 @@ export class MockCoreMouseService implements ICoreMouseService {
public addProtocol(name: string): void { }
public reset(): void { }
public triggerMouseEvent(event: ICoreMouseEvent): boolean { return false; }
- public onProtocolChange: IEvent = new EventEmitter().event;
+ public onProtocolChange: IEvent = new Emitter().event;
public explainEvents(events: CoreMouseEventType): { [event: string]: boolean } {
throw new Error('Method not implemented.');
}
@@ -94,10 +95,10 @@ export class MockCoreService implements ICoreService {
sendFocus: false,
wraparound: true
};
- public onData: IEvent = new EventEmitter().event;
- public onUserInput: IEvent = new EventEmitter().event;
- public onBinary: IEvent = new EventEmitter().event;
- public onRequestScrollToBottom: IEvent = new EventEmitter().event;
+ public onData: IEvent = new Emitter().event;
+ public onUserInput: IEvent = new Emitter().event;
+ public onBinary: IEvent = new Emitter().event;
+ public onRequestScrollToBottom: IEvent = new Emitter().event;
public reset(): void { }
public triggerDataEvent(data: string, wasUserInput?: boolean): void { }
public triggerBinaryEvent(data: string): void { }
@@ -117,7 +118,7 @@ export class MockOptionsService implements IOptionsService {
public serviceBrand: any;
public readonly rawOptions: Required = clone(DEFAULT_OPTIONS);
public options: Required = this.rawOptions;
- public onOptionChange: IEvent = new EventEmitter().event;
+ public onOptionChange: IEvent = new Emitter().event;
constructor(testOptions?: Partial) {
if (testOptions) {
for (const key of Object.keys(testOptions)) {
@@ -169,7 +170,7 @@ export class MockUnicodeService implements IUnicodeService {
}
public versions: string[] = [];
public activeVersion: string = '';
- public onChange: IEvent = new EventEmitter().event;
+ public onChange: IEvent = new Emitter().event;
public wcwidth = (codepoint: number): UnicodeCharWidth => this._provider.wcwidth(codepoint);
public charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties {
let width = this.wcwidth(codepoint);
@@ -192,8 +193,8 @@ export class MockUnicodeService implements IUnicodeService {
export class MockDecorationService implements IDecorationService {
public serviceBrand: any;
public get decorations(): IterableIterator { return [].values(); }
- public onDecorationRegistered = new EventEmitter().event;
- public onDecorationRemoved = new EventEmitter().event;
+ public onDecorationRegistered = new Emitter().event;
+ public onDecorationRemoved = new Emitter().event;
public registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined { return undefined; }
public reset(): void { }
public forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void { }
diff --git a/src/common/Types.ts b/src/common/Types.ts
index f98a7d3e..ad1a8d3f 100644
--- a/src/common/Types.ts
+++ b/src/common/Types.ts
@@ -4,12 +4,13 @@
*/
import { IDeleteEvent, IInsertEvent } from 'common/CircularList';
-import { IEvent, IEventEmitter } from 'common/EventEmitter';
+import { IEvent } from 'common/EventEmitter';
import { Attributes, UnderlineStyle } from 'common/buffer/Constants'; // eslint-disable-line no-unused-vars
import { IBufferSet } from 'common/buffer/Types';
import { IParams } from 'common/parser/Types';
import { ICoreMouseService, ICoreService, IOptionsService, IUnicodeService } from 'common/services/Services';
import { IFunctionIdentifier, ITerminalOptions as IPublicTerminalOptions } from '@xterm/xterm';
+import type { Emitter } from 'vs/base/common/event';
export interface ICoreTerminal {
coreMouseService: ICoreMouseService;
@@ -67,11 +68,11 @@ export interface ICircularList {
maxLength: number;
isFull: boolean;
- onDeleteEmitter: IEventEmitter;
+ onDeleteEmitter: Emitter;
onDelete: IEvent;
- onInsertEmitter: IEventEmitter;
+ onInsertEmitter: Emitter;
onInsert: IEvent;
- onTrimEmitter: IEventEmitter;
+ onTrimEmitter: Emitter;
onTrim: IEvent;
get(index: number): T | undefined;
diff --git a/src/common/buffer/Buffer.ts b/src/common/buffer/Buffer.ts
index 1d2922e8..d5e05731 100644
--- a/src/common/buffer/Buffer.ts
+++ b/src/common/buffer/Buffer.ts
@@ -161,6 +161,10 @@ export class Buffer implements IBuffer {
this.lines.maxLength = newMaxLength;
}
+ // if (this._cols > newCols) {
+ // console.log('increase!');
+ // }
+
// The following adjustments should only happen if the buffer has been
// initialized/filled.
if (this.lines.length > 0) {
diff --git a/src/common/buffer/Marker.ts b/src/common/buffer/Marker.ts
index 96df6366..efe12847 100644
--- a/src/common/buffer/Marker.ts
+++ b/src/common/buffer/Marker.ts
@@ -3,9 +3,9 @@
* @license MIT
*/
-import { EventEmitter } from 'common/EventEmitter';
import { disposeArray } from 'common/Lifecycle';
import { IDisposable, IMarker } from 'common/Types';
+import { Emitter } from 'vs/base/common/event';
export class Marker implements IMarker {
private static _nextId = 1;
@@ -16,7 +16,7 @@ export class Marker implements IMarker {
private readonly _id: number = Marker._nextId++;
public get id(): number { return this._id; }
- private readonly _onDispose = this.register(new EventEmitter());
+ private readonly _onDispose = this.register(new Emitter());
public readonly onDispose = this._onDispose.event;
constructor(
diff --git a/src/common/input/WriteBuffer.ts b/src/common/input/WriteBuffer.ts
index ac0730cb..0bbca86a 100644
--- a/src/common/input/WriteBuffer.ts
+++ b/src/common/input/WriteBuffer.ts
@@ -4,8 +4,8 @@
* @license MIT
*/
-import { EventEmitter } from 'common/EventEmitter';
import { Disposable } from 'common/Lifecycle';
+import { Emitter } from 'vs/base/common/event';
declare const setTimeout: (handler: () => void, timeout?: number) => void;
@@ -43,7 +43,7 @@ export class WriteBuffer extends Disposable {
private _syncCalls = 0;
private _didUserInput = false;
- private readonly _onWriteParsed = this.register(new EventEmitter());
+ private readonly _onWriteParsed = this.register(new Emitter());
public readonly onWriteParsed = this._onWriteParsed.event;
constructor(private _action: (data: string | Uint8Array, promiseResult?: boolean) => void | Promise) {
diff --git a/src/common/public/BufferNamespaceApi.ts b/src/common/public/BufferNamespaceApi.ts
index cef0ed16..b7098ea5 100644
--- a/src/common/public/BufferNamespaceApi.ts
+++ b/src/common/public/BufferNamespaceApi.ts
@@ -5,15 +5,15 @@
import { IBuffer as IBufferApi, IBufferNamespace as IBufferNamespaceApi } from '@xterm/xterm';
import { BufferApiView } from 'common/public/BufferApiView';
-import { EventEmitter } from 'common/EventEmitter';
import { ICoreTerminal } from 'common/Types';
import { Disposable } from 'common/Lifecycle';
+import { Emitter } from 'vs/base/common/event';
export class BufferNamespaceApi extends Disposable implements IBufferNamespaceApi {
private _normal: BufferApiView;
private _alternate: BufferApiView;
- private readonly _onBufferChange = this.register(new EventEmitter());
+ private readonly _onBufferChange = this.register(new Emitter());
public readonly onBufferChange = this._onBufferChange.event;
constructor(private _core: ICoreTerminal) {
diff --git a/src/common/services/BufferService.ts b/src/common/services/BufferService.ts
index 77af447a..aea08be9 100644
--- a/src/common/services/BufferService.ts
+++ b/src/common/services/BufferService.ts
@@ -9,6 +9,7 @@ import { IAttributeData, IBufferLine } from 'common/Types';
import { BufferSet } from 'common/buffer/BufferSet';
import { IBuffer, IBufferSet } from 'common/buffer/Types';
import { IBufferService, IOptionsService } from 'common/services/Services';
+import { Emitter } from 'vs/base/common/event';
export const MINIMUM_COLS = 2; // Less than 2 can mess with wide chars
export const MINIMUM_ROWS = 1;
@@ -24,7 +25,7 @@ export class BufferService extends Disposable implements IBufferService {
private readonly _onResize = this.register(new EventEmitter<{ cols: number, rows: number }>());
public readonly onResize = this._onResize.event;
- private readonly _onScroll = this.register(new EventEmitter());
+ private readonly _onScroll = this.register(new Emitter());
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 052353bc..66e7ae7c 100644
--- a/src/common/services/CoreMouseService.ts
+++ b/src/common/services/CoreMouseService.ts
@@ -3,9 +3,9 @@
* @license MIT
*/
import { IBufferService, ICoreService, ICoreMouseService } from 'common/services/Services';
-import { EventEmitter } from 'common/EventEmitter';
import { ICoreMouseProtocol, ICoreMouseEvent, CoreMouseEncoding, CoreMouseEventType, CoreMouseButton, CoreMouseAction } from 'common/Types';
import { Disposable } from 'common/Lifecycle';
+import { Emitter } from 'vs/base/common/event';
/**
* Supported default protocols.
@@ -175,7 +175,7 @@ export class CoreMouseService extends Disposable implements ICoreMouseService {
private _activeEncoding: string = '';
private _lastEvent: ICoreMouseEvent | null = null;
- private readonly _onProtocolChange = this.register(new EventEmitter());
+ private readonly _onProtocolChange = this.register(new Emitter());
public readonly onProtocolChange = this._onProtocolChange.event;
constructor(
diff --git a/src/common/services/CoreService.ts b/src/common/services/CoreService.ts
index 71985a17..2566aa40 100644
--- a/src/common/services/CoreService.ts
+++ b/src/common/services/CoreService.ts
@@ -4,10 +4,10 @@
*/
import { clone } from 'common/Clone';
-import { EventEmitter } from 'common/EventEmitter';
import { Disposable } from 'common/Lifecycle';
import { IDecPrivateModes, IModes } from 'common/Types';
import { IBufferService, ICoreService, ILogService, IOptionsService } from 'common/services/Services';
+import { Emitter } from 'vs/base/common/event';
const DEFAULT_MODES: IModes = Object.freeze({
insertMode: false
@@ -31,13 +31,13 @@ export class CoreService extends Disposable implements ICoreService {
public modes: IModes;
public decPrivateModes: IDecPrivateModes;
- private readonly _onData = this.register(new EventEmitter());
+ private readonly _onData = this.register(new Emitter());
public readonly onData = this._onData.event;
- private readonly _onUserInput = this.register(new EventEmitter());
+ private readonly _onUserInput = this.register(new Emitter());
public readonly onUserInput = this._onUserInput.event;
- private readonly _onBinary = this.register(new EventEmitter());
+ private readonly _onBinary = this.register(new Emitter());
public readonly onBinary = this._onBinary.event;
- private readonly _onRequestScrollToBottom = this.register(new EventEmitter());
+ private readonly _onRequestScrollToBottom = this.register(new Emitter());
public readonly onRequestScrollToBottom = this._onRequestScrollToBottom.event;
constructor(
diff --git a/src/common/services/DecorationService.test.ts b/src/common/services/DecorationService.test.ts
index a2cb56d2..7abcff5b 100644
--- a/src/common/services/DecorationService.test.ts
+++ b/src/common/services/DecorationService.test.ts
@@ -5,15 +5,15 @@
import { assert } from 'chai';
import { DecorationService } from './DecorationService';
-import { EventEmitter } from 'common/EventEmitter';
import { IMarker } from 'common/Types';
import { Disposable } from 'common/Lifecycle';
+import { Emitter } from 'vs/base/common/event';
const fakeMarker: IMarker = Object.freeze(new class extends Disposable {
public readonly id = 1;
public readonly line = 1;
public readonly isDisposed = false;
- public readonly onDispose = new EventEmitter().event;
+ public readonly onDispose = new Emitter().event;
}());
describe('DecorationService', () => {
diff --git a/src/common/services/DecorationService.ts b/src/common/services/DecorationService.ts
index c9be78af..23b3511e 100644
--- a/src/common/services/DecorationService.ts
+++ b/src/common/services/DecorationService.ts
@@ -4,12 +4,12 @@
*/
import { css } from 'common/Color';
-import { EventEmitter } from 'common/EventEmitter';
import { Disposable, toDisposable } from 'common/Lifecycle';
import { IDecorationService, IInternalDecoration } from 'common/services/Services';
import { SortedList } from 'common/SortedList';
import { IColor } from 'common/Types';
import { IDecoration, IDecorationOptions, IMarker } from '@xterm/xterm';
+import { Emitter } from 'vs/base/common/event';
// Work variables to avoid garbage collection
let $xmin = 0;
@@ -25,9 +25,9 @@ export class DecorationService extends Disposable implements IDecorationService
*/
private readonly _decorations: SortedList = new SortedList(e => e?.marker.line);
- private readonly _onDecorationRegistered = this.register(new EventEmitter());
+ private readonly _onDecorationRegistered = this.register(new Emitter());
public readonly onDecorationRegistered = this._onDecorationRegistered.event;
- private readonly _onDecorationRemoved = this.register(new EventEmitter());
+ private readonly _onDecorationRemoved = this.register(new Emitter());
public readonly onDecorationRemoved = this._onDecorationRemoved.event;
public get decorations(): IterableIterator { return this._decorations.values(); }
@@ -95,9 +95,9 @@ class Decoration extends Disposable implements IInternalDecoration {
public element: HTMLElement | undefined;
public get isDisposed(): boolean { return this._isDisposed; }
- public readonly onRenderEmitter = this.register(new EventEmitter());
+ public readonly onRenderEmitter = this.register(new Emitter());
public readonly onRender = this.onRenderEmitter.event;
- private readonly _onDispose = this.register(new EventEmitter());
+ private readonly _onDispose = this.register(new Emitter());
public readonly onDispose = this._onDispose.event;
private _cachedBg: IColor | undefined | null = null;
diff --git a/src/common/services/OptionsService.ts b/src/common/services/OptionsService.ts
index 0375f6ad..5a3da107 100644
--- a/src/common/services/OptionsService.ts
+++ b/src/common/services/OptionsService.ts
@@ -3,11 +3,11 @@
* @license MIT
*/
-import { EventEmitter } from 'common/EventEmitter';
import { Disposable, toDisposable } from 'common/Lifecycle';
import { isMac } from 'common/Platform';
import { CursorStyle, IDisposable } from 'common/Types';
import { FontWeight, IOptionsService, ITerminalOptions } from 'common/services/Services';
+import { Emitter } from 'vs/base/common/event';
export const DEFAULT_OPTIONS: Readonly> = {
cols: 80,
@@ -65,7 +65,7 @@ export class OptionsService extends Disposable implements IOptionsService {
public readonly rawOptions: Required;
public options: Required