From e8d99d50a64dea97b71c864b4663faa160be1f4e Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 30 Jan 2026 06:03:16 -0800 Subject: [PATCH 1/4] Remove vs dependency in common Fixes #5631 --- addons/addon-webgl/src/DevicePixelObserver.ts | 2 +- addons/addon-webgl/src/GlyphRenderer.ts | 2 +- addons/addon-webgl/src/RectangleRenderer.ts | 2 +- addons/addon-webgl/src/TextureAtlas.ts | 2 +- addons/addon-webgl/src/Types.ts | 2 +- addons/addon-webgl/src/WebglAddon.ts | 4 +- addons/addon-webgl/src/WebglRenderer.ts | 4 +- .../src/renderLayer/BaseRenderLayer.ts | 2 +- headless/package.json | 14 +-- src/browser/AccessibilityManager.ts | 2 +- src/browser/CoreBrowserTerminal.ts | 4 +- src/browser/Linkifier.ts | 4 +- src/browser/TestUtils.test.ts | 2 +- src/browser/Types.ts | 2 +- src/browser/Viewport.ts | 4 +- .../decorations/BufferDecorationRenderer.ts | 2 +- .../decorations/OverviewRulerRenderer.ts | 2 +- src/browser/public/Terminal.ts | 4 +- src/browser/renderer/dom/DomRenderer.ts | 4 +- src/browser/renderer/shared/Types.ts | 2 +- src/browser/services/CharSizeService.ts | 4 +- src/browser/services/CoreBrowserService.ts | 4 +- src/browser/services/LinkProviderService.ts | 2 +- src/browser/services/RenderService.ts | 4 +- src/browser/services/SelectionService.ts | 4 +- src/browser/services/Services.ts | 2 +- src/browser/services/ThemeService.ts | 4 +- src/common/CircularList.ts | 4 +- src/common/CoreTerminal.ts | 4 +- src/common/Event.ts | 105 ++++++++++++++++++ src/common/InputHandler.ts | 4 +- src/common/Lifecycle.ts | 100 +++++++++++++++++ src/common/TestUtils.test.ts | 2 +- src/common/Types.ts | 2 +- src/common/buffer/BufferSet.ts | 4 +- src/common/buffer/Marker.ts | 4 +- src/common/buffer/Types.ts | 2 +- src/common/input/WriteBuffer.ts | 4 +- src/common/parser/EscapeSequenceParser.ts | 2 +- src/common/public/BufferNamespaceApi.ts | 4 +- src/common/services/BufferService.ts | 4 +- src/common/services/CoreMouseService.ts | 4 +- src/common/services/CoreService.ts | 4 +- src/common/services/DecorationService.test.ts | 4 +- src/common/services/DecorationService.ts | 4 +- src/common/services/LogService.ts | 2 +- src/common/services/OptionsService.ts | 4 +- src/common/services/Services.ts | 2 +- src/common/services/UnicodeService.ts | 2 +- src/common/tsconfig.json | 5 +- src/headless/Terminal.ts | 2 +- src/headless/public/Terminal.ts | 4 +- 52 files changed, 286 insertions(+), 86 deletions(-) create mode 100644 src/common/Event.ts create mode 100644 src/common/Lifecycle.ts diff --git a/addons/addon-webgl/src/DevicePixelObserver.ts b/addons/addon-webgl/src/DevicePixelObserver.ts index 33d733ef..dcd8de0a 100644 --- a/addons/addon-webgl/src/DevicePixelObserver.ts +++ b/addons/addon-webgl/src/DevicePixelObserver.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { toDisposable, IDisposable } from 'vs/base/common/lifecycle'; +import { toDisposable, IDisposable } from 'common/Lifecycle'; export function observeDevicePixelDimensions(element: HTMLElement, parentWindow: Window & typeof globalThis, callback: (deviceWidth: number, deviceHeight: number) => void): IDisposable { // Observe any resizes to the element and extract the actual pixel size of the element if the diff --git a/addons/addon-webgl/src/GlyphRenderer.ts b/addons/addon-webgl/src/GlyphRenderer.ts index 6b359d4b..f5be446f 100644 --- a/addons/addon-webgl/src/GlyphRenderer.ts +++ b/addons/addon-webgl/src/GlyphRenderer.ts @@ -5,7 +5,7 @@ import { TextureAtlas } from './TextureAtlas'; import { IRenderDimensions } from 'browser/renderer/shared/Types'; import { NULL_CELL_CODE } from 'common/buffer/Constants'; -import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, toDisposable } from 'common/Lifecycle'; import { Terminal } from '@xterm/xterm'; import { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject, type IRasterizedGlyph, type ITextureAtlas } from './Types'; import { createProgram, GLTexture, PROJECTION_MATRIX } from './WebglUtils'; diff --git a/addons/addon-webgl/src/RectangleRenderer.ts b/addons/addon-webgl/src/RectangleRenderer.ts index 8ace9076..d22068ba 100644 --- a/addons/addon-webgl/src/RectangleRenderer.ts +++ b/addons/addon-webgl/src/RectangleRenderer.ts @@ -7,7 +7,7 @@ import { IRenderDimensions } from 'browser/renderer/shared/Types'; import { IThemeService } from 'browser/services/Services'; import { ReadonlyColorSet } from 'browser/Types'; import { Attributes, FgFlags } from 'common/buffer/Constants'; -import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, toDisposable } from 'common/Lifecycle'; import { IColor } from 'common/Types'; import { Terminal } from '@xterm/xterm'; import { RENDER_MODEL_BG_OFFSET, RENDER_MODEL_FG_OFFSET, RENDER_MODEL_INDICIES_PER_CELL } from './RenderModel'; diff --git a/addons/addon-webgl/src/TextureAtlas.ts b/addons/addon-webgl/src/TextureAtlas.ts index 182dda59..2c6ed2ad 100644 --- a/addons/addon-webgl/src/TextureAtlas.ts +++ b/addons/addon-webgl/src/TextureAtlas.ts @@ -15,7 +15,7 @@ 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'; +import { Emitter } from 'common/Event'; /** * A shared object which is used to draw nothing for a particular cell. diff --git a/addons/addon-webgl/src/Types.ts b/addons/addon-webgl/src/Types.ts index e030e579..3e734a0d 100644 --- a/addons/addon-webgl/src/Types.ts +++ b/addons/addon-webgl/src/Types.ts @@ -7,7 +7,7 @@ import { FontWeight } from '@xterm/xterm'; import { IColorSet } from 'browser/Types'; import { ISelectionRenderModel } from 'browser/renderer/shared/Types'; import { CursorInactiveStyle, CursorStyle, type IDisposable } from 'common/Types'; -import type { Event } from 'vs/base/common/event'; +import type { Event } from 'common/Event'; export interface IRenderModel { cells: Uint32Array; diff --git a/addons/addon-webgl/src/WebglAddon.ts b/addons/addon-webgl/src/WebglAddon.ts index 72e0835e..0bc24c90 100644 --- a/addons/addon-webgl/src/WebglAddon.ts +++ b/addons/addon-webgl/src/WebglAddon.ts @@ -7,13 +7,13 @@ import type { ITerminalAddon, Terminal } from '@xterm/xterm'; import type { IWebglAddonOptions, WebglAddon as IWebglApi } from '@xterm/addon-webgl'; import { ICharacterJoinerService, ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services'; import { ITerminal } from 'browser/Types'; -import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; +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, Event } from 'vs/base/common/event'; +import { Emitter, Event } from 'common/Event'; export class WebglAddon extends Disposable implements ITerminalAddon , IWebglApi { private _terminal?: Terminal; diff --git a/addons/addon-webgl/src/WebglRenderer.ts b/addons/addon-webgl/src/WebglRenderer.ts index 345437d5..1bdde448 100644 --- a/addons/addon-webgl/src/WebglRenderer.ts +++ b/addons/addon-webgl/src/WebglRenderer.ts @@ -22,9 +22,9 @@ import { COMBINED_CHAR_BIT_MASK, RENDER_MODEL_BG_OFFSET, RENDER_MODEL_EXT_OFFSET import { IWebGL2RenderingContext, type ITextureAtlas } from './Types'; import { LinkRenderLayer } from './renderLayer/LinkRenderLayer'; import { IRenderLayer } from './renderLayer/Types'; -import { Emitter, Event } from 'vs/base/common/event'; +import { Emitter, Event } from 'common/Event'; import { addDisposableListener } from 'vs/base/browser/dom'; -import { combinedDisposable, Disposable, MutableDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { combinedDisposable, Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle'; import { createRenderDimensions } from 'browser/renderer/shared/RendererUtils'; export class WebglRenderer extends Disposable implements IRenderer { diff --git a/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts b/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts index 85b170e7..5b116153 100644 --- a/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts +++ b/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts @@ -7,7 +7,7 @@ import { ReadonlyColorSet } from 'browser/Types'; import { acquireTextureAtlas } from '../CharAtlasCache'; import { IRenderDimensions } from 'browser/renderer/shared/Types'; import { ICoreBrowserService, IThemeService } from 'browser/services/Services'; -import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, toDisposable } from 'common/Lifecycle'; import { CellData } from 'common/buffer/CellData'; import { IOptionsService } from 'common/services/Services'; import { Terminal } from '@xterm/xterm'; diff --git a/headless/package.json b/headless/package.json index b8e71974..fda5eae6 100644 --- a/headless/package.json +++ b/headless/package.json @@ -1,17 +1,15 @@ { "name": "@xterm/headless", "description": "A headless terminal component that runs in Node.js", - "version": "5.5.0", + "version": "6.0.0", "main": "lib-headless/xterm-headless.js", - "module": "lib-headless/xterm-headless.mjs", + "module": "lib/xterm.mjs", "types": "typings/xterm-headless.d.ts", - "exports": { - "types": "./typings/xterm-headless.d.ts", - "import": "./lib-headless/xterm-headless.mjs", - "require": "./lib-headless/xterm-headless.js" - }, "repository": "https://github.com/xtermjs/xterm.js", "license": "MIT", + "workspaces": [ + "addons/*" + ], "keywords": [ "cli", "command-line", @@ -27,4 +25,4 @@ "webgl", "xterm" ] -} +} \ No newline at end of file diff --git a/src/browser/AccessibilityManager.ts b/src/browser/AccessibilityManager.ts index f5784230..e202b819 100644 --- a/src/browser/AccessibilityManager.ts +++ b/src/browser/AccessibilityManager.ts @@ -6,7 +6,7 @@ import * as Strings from 'browser/LocalizableStrings'; import { ITerminal, IRenderDebouncer } from 'browser/Types'; import { TimeBasedDebouncer } from 'browser/TimeBasedDebouncer'; -import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, toDisposable } from 'common/Lifecycle'; import { ICoreBrowserService, IRenderService } from 'browser/services/Services'; import { IBuffer } from 'common/buffer/Types'; import { IInstantiationService } from 'common/services/Services'; diff --git a/src/browser/CoreBrowserTerminal.ts b/src/browser/CoreBrowserTerminal.ts index c26e6705..f743bd00 100644 --- a/src/browser/CoreBrowserTerminal.ts +++ b/src/browser/CoreBrowserTerminal.ts @@ -55,9 +55,9 @@ import { IDecorationService } from 'common/services/Services'; import { WindowsOptionsReportType } from '../common/InputHandler'; import { AccessibilityManager } from './AccessibilityManager'; import { Linkifier } from './Linkifier'; -import { Emitter, Event } from 'vs/base/common/event'; +import { Emitter, Event } from 'common/Event'; import { addDisposableListener } from 'vs/base/browser/dom'; -import { MutableDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { MutableDisposable, toDisposable } from 'common/Lifecycle'; export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { public textarea: HTMLTextAreaElement | undefined; diff --git a/src/browser/Linkifier.ts b/src/browser/Linkifier.ts index c5c31d62..d579b7fe 100644 --- a/src/browser/Linkifier.ts +++ b/src/browser/Linkifier.ts @@ -4,11 +4,11 @@ */ import { IBufferCellPosition, ILink, ILinkDecorations, ILinkWithState, ILinkifier2, ILinkifierEvent } from 'browser/Types'; -import { Disposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, dispose, 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'; +import { Emitter } from 'common/Event'; import { addDisposableListener } from 'vs/base/browser/dom'; export class Linkifier extends Disposable implements ILinkifier2 { diff --git a/src/browser/TestUtils.test.ts b/src/browser/TestUtils.test.ts index 5777d147..2d83ae53 100644 --- a/src/browser/TestUtils.test.ts +++ b/src/browser/TestUtils.test.ts @@ -18,7 +18,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, type Event } from 'vs/base/common/event'; +import { Emitter, type Event } from 'common/Event'; export class TestTerminal extends CoreBrowserTerminal { public get curAttrData(): IAttributeData { return (this as any)._inputHandler._curAttrData; } diff --git a/src/browser/Types.ts b/src/browser/Types.ts index 77f6a61c..5c840bff 100644 --- a/src/browser/Types.ts +++ b/src/browser/Types.ts @@ -7,7 +7,7 @@ import { CharData, IColor, ICoreTerminal, ITerminalOptions } from 'common/Types' import { IBuffer } from 'common/buffer/Types'; import { IDisposable, IRenderDimensions as IRenderDimensionsApi, Terminal as ITerminalApi } from '@xterm/xterm'; import { channels, css } from 'common/Color'; -import type { Event } from 'vs/base/common/event'; +import type { Event } from 'common/Event'; /** * A portion of the public API that are implemented identially internally and simply passed through. diff --git a/src/browser/Viewport.ts b/src/browser/Viewport.ts index a550f8b4..33442976 100644 --- a/src/browser/Viewport.ts +++ b/src/browser/Viewport.ts @@ -5,13 +5,13 @@ import { ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services'; import { ViewportConstants } from 'browser/shared/Constants'; -import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, toDisposable } from 'common/Lifecycle'; import { IBufferService, ICoreMouseService, IOptionsService } from 'common/services/Services'; import { CoreMouseEventType } from 'common/Types'; import { addDisposableListener, 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, Event } from 'vs/base/common/event'; +import { Emitter, Event } from 'common/Event'; import { Scrollable, ScrollbarVisibility, type ScrollEvent } from 'vs/base/common/scrollable'; import { Gesture, EventType as GestureEventType, type GestureEvent } from 'vs/base/browser/touch'; diff --git a/src/browser/decorations/BufferDecorationRenderer.ts b/src/browser/decorations/BufferDecorationRenderer.ts index 7b9a3fde..e374af26 100644 --- a/src/browser/decorations/BufferDecorationRenderer.ts +++ b/src/browser/decorations/BufferDecorationRenderer.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { ICoreBrowserService, IRenderService } from 'browser/services/Services'; -import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, toDisposable } from 'common/Lifecycle'; import { IBufferService, IDecorationService, IInternalDecoration } from 'common/services/Services'; export class BufferDecorationRenderer extends Disposable { diff --git a/src/browser/decorations/OverviewRulerRenderer.ts b/src/browser/decorations/OverviewRulerRenderer.ts index c8efb2a5..ea36cf76 100644 --- a/src/browser/decorations/OverviewRulerRenderer.ts +++ b/src/browser/decorations/OverviewRulerRenderer.ts @@ -5,7 +5,7 @@ import { ColorZoneStore, IColorZone, IColorZoneStore } from 'browser/decorations/ColorZoneStore'; import { ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services'; -import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, toDisposable } from 'common/Lifecycle'; import { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services'; const enum Constants { diff --git a/src/browser/public/Terminal.ts b/src/browser/public/Terminal.ts index 442f8b6a..16006905 100644 --- a/src/browser/public/Terminal.ts +++ b/src/browser/public/Terminal.ts @@ -6,14 +6,14 @@ import * as Strings from 'browser/LocalizableStrings'; import { CoreBrowserTerminal as TerminalCore } from 'browser/CoreBrowserTerminal'; import { IBufferRange, ITerminal } from 'browser/Types'; -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable } from 'common/Lifecycle'; import { ITerminalOptions } from 'common/Types'; import { AddonManager } from 'common/public/AddonManager'; import { BufferNamespaceApi } from 'common/public/BufferNamespaceApi'; import { ParserApi } from 'common/public/ParserApi'; import { UnicodeApi } from 'common/public/UnicodeApi'; import { IBufferNamespace as IBufferNamespaceApi, IDecoration, IDecorationOptions, IDisposable, ILinkProvider, ILocalizableStrings, IMarker, IModes, IParser, IRenderDimensions, ITerminalAddon, Terminal as ITerminalApi, ITerminalInitOnlyOptions, IUnicodeHandling } from '@xterm/xterm'; -import type { Event } from 'vs/base/common/event'; +import type { Event } from 'common/Event'; /** * The set of options that only have an effect when set in the Terminal constructor. diff --git a/src/browser/renderer/dom/DomRenderer.ts b/src/browser/renderer/dom/DomRenderer.ts index 4349b222..c564ca4a 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 { Disposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, toDisposable } from 'common/Lifecycle'; import { IBufferService, ICoreService, IInstantiationService, IOptionsService } from 'common/services/Services'; -import { Emitter } from 'vs/base/common/event'; +import { Emitter } from 'common/Event'; import { addDisposableListener } from 'vs/base/browser/dom'; diff --git a/src/browser/renderer/shared/Types.ts b/src/browser/renderer/shared/Types.ts index de913e9b..05f462a7 100644 --- a/src/browser/renderer/shared/Types.ts +++ b/src/browser/renderer/shared/Types.ts @@ -6,7 +6,7 @@ import { Terminal } from '@xterm/xterm'; import { ITerminal } from 'browser/Types'; import { IDisposable } from 'common/Types'; -import type { Event } from 'vs/base/common/event'; +import type { Event } from 'common/Event'; export interface IDimensions { width: number; diff --git a/src/browser/services/CharSizeService.ts b/src/browser/services/CharSizeService.ts index 5d231055..6baf9b50 100644 --- a/src/browser/services/CharSizeService.ts +++ b/src/browser/services/CharSizeService.ts @@ -5,8 +5,8 @@ import { IOptionsService } from 'common/services/Services'; import { ICharSizeService } from 'browser/services/Services'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { Emitter } from 'vs/base/common/event'; +import { Disposable } from 'common/Lifecycle'; +import { Emitter } from 'common/Event'; export class CharSizeService extends Disposable implements ICharSizeService { public serviceBrand: undefined; diff --git a/src/browser/services/CoreBrowserService.ts b/src/browser/services/CoreBrowserService.ts index d8ea0a64..562793f2 100644 --- a/src/browser/services/CoreBrowserService.ts +++ b/src/browser/services/CoreBrowserService.ts @@ -4,9 +4,9 @@ */ import { ICoreBrowserService } from './Services'; -import { Emitter, Event } from 'vs/base/common/event'; +import { Emitter, Event } from 'common/Event'; import { addDisposableListener } from 'vs/base/browser/dom'; -import { Disposable, MutableDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle'; export class CoreBrowserService extends Disposable implements ICoreBrowserService { public serviceBrand: undefined; diff --git a/src/browser/services/LinkProviderService.ts b/src/browser/services/LinkProviderService.ts index a8687e59..7a7b530d 100644 --- a/src/browser/services/LinkProviderService.ts +++ b/src/browser/services/LinkProviderService.ts @@ -1,5 +1,5 @@ import { ILinkProvider, ILinkProviderService } from 'browser/services/Services'; -import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, toDisposable } from 'common/Lifecycle'; import { IDisposable } from 'common/Types'; export class LinkProviderService extends Disposable implements ILinkProviderService { diff --git a/src/browser/services/RenderService.ts b/src/browser/services/RenderService.ts index f2a60512..1cced406 100644 --- a/src/browser/services/RenderService.ts +++ b/src/browser/services/RenderService.ts @@ -7,10 +7,10 @@ import { RenderDebouncer } from 'browser/RenderDebouncer'; import { IRenderDebouncerWithCallback } from 'browser/Types'; import { IRenderDimensions, IRenderer } from 'browser/renderer/shared/Types'; import { ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services'; -import { Disposable, MutableDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle'; import { DebouncedIdleTask } from 'common/TaskQueue'; import { IBufferService, ICoreService, IDecorationService, IOptionsService } from 'common/services/Services'; -import { Emitter } from 'vs/base/common/event'; +import { Emitter } from 'common/Event'; interface ISelectionState { start: [number, number] | undefined; diff --git a/src/browser/services/SelectionService.ts b/src/browser/services/SelectionService.ts index 6abd5fb9..95fa88cd 100644 --- a/src/browser/services/SelectionService.ts +++ b/src/browser/services/SelectionService.ts @@ -9,14 +9,14 @@ 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 { Disposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, toDisposable } from 'common/Lifecycle'; import * as Browser from 'common/Platform'; import { IBufferLine, IDisposable } from 'common/Types'; 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'; +import { Emitter } from 'common/Event'; /** * The number of pixels the mouse needs to be above or below the viewport in diff --git a/src/browser/services/Services.ts b/src/browser/services/Services.ts index 535afa64..af9211df 100644 --- a/src/browser/services/Services.ts +++ b/src/browser/services/Services.ts @@ -8,7 +8,7 @@ import { IColorSet, ILink, ReadonlyColorSet } from 'browser/Types'; import { ISelectionRedrawRequestEvent as ISelectionRequestRedrawEvent, ISelectionRequestScrollLinesEvent } from 'browser/selection/Types'; import { createDecorator } from 'common/services/ServiceRegistry'; import { AllColorIndex, IDisposable, IKeyboardResult } from 'common/Types'; -import type { Event } from 'vs/base/common/event'; +import type { Event } from 'common/Event'; export const ICharSizeService = createDecorator('CharSizeService'); export interface ICharSizeService { diff --git a/src/browser/services/ThemeService.ts b/src/browser/services/ThemeService.ts index cd85e0ff..f2b23f3c 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 { Disposable } from 'vs/base/common/lifecycle'; +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'; +import { Emitter } from 'common/Event'; interface IRestoreColorSet { foreground: IColor; diff --git a/src/common/CircularList.ts b/src/common/CircularList.ts index a46faca3..3663bfc1 100644 --- a/src/common/CircularList.ts +++ b/src/common/CircularList.ts @@ -4,8 +4,8 @@ */ import { ICircularList } from 'common/Types'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { Emitter } from 'vs/base/common/event'; +import { Disposable } from 'common/Lifecycle'; +import { Emitter } from 'common/Event'; export interface IInsertEvent { index: number; diff --git a/src/common/CoreTerminal.ts b/src/common/CoreTerminal.ts index dd312af1..cff8558e 100644 --- a/src/common/CoreTerminal.ts +++ b/src/common/CoreTerminal.ts @@ -37,8 +37,8 @@ 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, Event } from 'vs/base/common/event'; -import { Disposable, MutableDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Emitter, Event } from 'common/Event'; +import { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle'; // Only trigger this warning a single time per session let hasWriteSyncWarnHappened = false; diff --git a/src/common/Event.ts b/src/common/Event.ts new file mode 100644 index 00000000..2239725c --- /dev/null +++ b/src/common/Event.ts @@ -0,0 +1,105 @@ +/** + * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved. + * @license MIT + * + * Minimal event utilities for xterm.js core. + * Simplified from VS Code's event.ts - no leak detection/profiling. + */ + +import { IDisposable, DisposableStore, toDisposable } from 'common/Lifecycle'; + +export interface Event { + (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable; +} + +export class Emitter { + private _listeners: Array<{ fn: (e: T) => any; thisArgs: any }> = []; + private _disposed = false; + private _event: Event | undefined; + + public get event(): Event { + if (!this._event) { + this._event = (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => { + if (this._disposed) { + return toDisposable(() => {}); + } + + const entry = { fn: listener, thisArgs }; + this._listeners.push(entry); + + const result = toDisposable(() => { + const idx = this._listeners.indexOf(entry); + if (idx !== -1) { + this._listeners.splice(idx, 1); + } + }); + + if (disposables) { + if (Array.isArray(disposables)) { + disposables.push(result); + } else { + disposables.add(result); + } + } + + return result; + }; + } + return this._event; + } + + public fire(event: T): void { + if (this._disposed) { + return; + } + // Snapshot listeners to allow modifications during iteration + const listeners = this._listeners.slice(); + for (const { fn, thisArgs } of listeners) { + fn.call(thisArgs, event); + } + } + + public dispose(): void { + if (this._disposed) { + return; + } + this._disposed = true; + this._listeners.length = 0; + } +} + +export namespace Event { + export function forward(from: Event, to: Emitter): IDisposable { + return from(e => to.fire(e)); + } + + export function map(event: Event, map: (i: I) => O): Event { + return (listener: (e: O) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => { + return event(i => listener.call(thisArgs, map(i)), undefined, disposables); + }; + } + + export function any(...events: Event[]): Event; + export function any(...events: Event[]): Event; + export function any(...events: Event[]): Event { + return (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => { + const store = new DisposableStore(); + for (const event of events) { + store.add(event(e => listener.call(thisArgs, e))); + } + if (disposables) { + if (Array.isArray(disposables)) { + disposables.push(store); + } else { + disposables.add(store); + } + } + return store; + }; + } + + export function runAndSubscribe(event: Event, handler: (e: T | undefined) => void): IDisposable { + handler(undefined); + return event(e => handler(e)); + } +} diff --git a/src/common/InputHandler.ts b/src/common/InputHandler.ts index b2b75143..71e0a1c6 100644 --- a/src/common/InputHandler.ts +++ b/src/common/InputHandler.ts @@ -8,7 +8,7 @@ import { IInputHandler, IAttributeData, IDisposable, IWindowOptions, IColorEvent import { C0, C1 } from 'common/data/EscapeSequences'; import { CHARSETS, DEFAULT_CHARSET } from 'common/data/Charsets'; import { EscapeSequenceParser } from 'common/parser/EscapeSequenceParser'; -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable } from 'common/Lifecycle'; import { StringToUtf32, stringFromCodePoint, Utf8ToUtf32 } from 'common/input/TextDecoder'; import { BufferLine, DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine'; import { IParsingState, IEscapeSequenceParser, IParams, IFunctionIdentifier } from 'common/parser/Types'; @@ -21,7 +21,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'; +import { Emitter } from 'common/Event'; import { XTERM_VERSION } from 'common/Version'; /** diff --git a/src/common/Lifecycle.ts b/src/common/Lifecycle.ts new file mode 100644 index 00000000..8d7001cd --- /dev/null +++ b/src/common/Lifecycle.ts @@ -0,0 +1,100 @@ +/** + * Copyright (c) 2024-2026 The xterm.js authors. All rights reserved. + * @license MIT + * + * Minimal lifecycle utilities for xterm.js core. + * Simplified from VS Code's lifecycle.ts - no tracking/leak detection. + */ + +export interface IDisposable { + dispose(): void; +} + +export function toDisposable(fn: () => void): IDisposable { + return { dispose: fn }; +} + +export function dispose(disposables: T | T[] | undefined): void { + if (!disposables) { + return; + } + if (Array.isArray(disposables)) { + for (const d of disposables) { + d.dispose(); + } + } else { + disposables.dispose(); + } +} + +export function combinedDisposable(...disposables: IDisposable[]): IDisposable { + return toDisposable(() => dispose(disposables)); +} + +export class DisposableStore implements IDisposable { + private readonly _disposables = new Set(); + private _isDisposed = false; + + public get isDisposed(): boolean { + return this._isDisposed; + } + + public add(o: T): T { + if (this._isDisposed) { + o.dispose(); + } else { + this._disposables.add(o); + } + return o; + } + + public dispose(): void { + if (this._isDisposed) { + return; + } + this._isDisposed = true; + for (const d of this._disposables) { + d.dispose(); + } + this._disposables.clear(); + } +} + +export abstract class Disposable implements IDisposable { + protected readonly _store = new DisposableStore(); + + public dispose(): void { + this._store.dispose(); + } + + protected _register(o: T): T { + return this._store.add(o); + } +} + +export class MutableDisposable implements IDisposable { + private _value: T | undefined; + private _isDisposed = false; + + public get value(): T | undefined { + return this._isDisposed ? undefined : this._value; + } + + public set value(value: T | undefined) { + if (this._isDisposed || value === this._value) { + return; + } + this._value?.dispose(); + this._value = value; + } + + public clear(): void { + this.value = undefined; + } + + public dispose(): void { + this._isDisposed = true; + this._value?.dispose(); + this._value = undefined; + } +} diff --git a/src/common/TestUtils.test.ts b/src/common/TestUtils.test.ts index 2d44c32e..cbe4fe58 100644 --- a/src/common/TestUtils.test.ts +++ b/src/common/TestUtils.test.ts @@ -12,7 +12,7 @@ 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, type Event } from 'vs/base/common/event'; +import { Emitter, type Event } from 'common/Event'; export class MockBufferService implements IBufferService { public serviceBrand: any; diff --git a/src/common/Types.ts b/src/common/Types.ts index 269b30c8..aeeee5b2 100644 --- a/src/common/Types.ts +++ b/src/common/Types.ts @@ -9,7 +9,7 @@ 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, Event } from 'vs/base/common/event'; +import type { Emitter, Event } from 'common/Event'; export interface ICoreTerminal { coreMouseService: ICoreMouseService; diff --git a/src/common/buffer/BufferSet.ts b/src/common/buffer/BufferSet.ts index 8f3a6aec..d83d3925 100644 --- a/src/common/buffer/BufferSet.ts +++ b/src/common/buffer/BufferSet.ts @@ -3,12 +3,12 @@ * @license MIT */ -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable } from 'common/Lifecycle'; import { IAttributeData } from 'common/Types'; import { Buffer } from 'common/buffer/Buffer'; import { IBuffer, IBufferSet } from 'common/buffer/Types'; import { IBufferService, IOptionsService } from 'common/services/Services'; -import { Emitter } from 'vs/base/common/event'; +import { Emitter } from 'common/Event'; /** * The BufferSet represents the set of two buffers used by xterm terminals (normal and alt) and diff --git a/src/common/buffer/Marker.ts b/src/common/buffer/Marker.ts index a83cf876..59ad049b 100644 --- a/src/common/buffer/Marker.ts +++ b/src/common/buffer/Marker.ts @@ -4,8 +4,8 @@ */ import { IDisposable, IMarker } from 'common/Types'; -import { Emitter } from 'vs/base/common/event'; -import { dispose } from 'vs/base/common/lifecycle'; +import { Emitter } from 'common/Event'; +import { dispose } from 'common/Lifecycle'; export class Marker implements IMarker { private static _nextId = 1; diff --git a/src/common/buffer/Types.ts b/src/common/buffer/Types.ts index c6e7a53f..b6e83586 100644 --- a/src/common/buffer/Types.ts +++ b/src/common/buffer/Types.ts @@ -4,7 +4,7 @@ */ import { IAttributeData, ICircularList, IBufferLine, ICellData, IMarker, ICharset, IDisposable } from 'common/Types'; -import type { Event } from 'vs/base/common/event'; +import type { Event } from 'common/Event'; // BufferIndex denotes a position in the buffer: [rowIndex, colIndex] export type BufferIndex = [number, number]; diff --git a/src/common/input/WriteBuffer.ts b/src/common/input/WriteBuffer.ts index f6d83ba8..c9db076d 100644 --- a/src/common/input/WriteBuffer.ts +++ b/src/common/input/WriteBuffer.ts @@ -4,8 +4,8 @@ * @license MIT */ -import { Disposable } from 'vs/base/common/lifecycle'; -import { Emitter } from 'vs/base/common/event'; +import { Disposable } from 'common/Lifecycle'; +import { Emitter } from 'common/Event'; declare const setTimeout: (handler: () => void, timeout?: number) => void; diff --git a/src/common/parser/EscapeSequenceParser.ts b/src/common/parser/EscapeSequenceParser.ts index e13d67f3..77fd1283 100644 --- a/src/common/parser/EscapeSequenceParser.ts +++ b/src/common/parser/EscapeSequenceParser.ts @@ -5,7 +5,7 @@ import { IParsingState, IDcsHandler, IEscapeSequenceParser, IParams, IOscHandler, IHandlerCollection, CsiHandlerType, OscFallbackHandlerType, IOscParser, EscHandlerType, IDcsParser, DcsFallbackHandlerType, IFunctionIdentifier, ExecuteFallbackHandlerType, CsiFallbackHandlerType, EscFallbackHandlerType, PrintHandlerType, PrintFallbackHandlerType, ExecuteHandlerType, IParserStackState, ParserStackType, ResumableHandlersType } from 'common/parser/Types'; import { ParserState, ParserAction } from 'common/parser/Constants'; -import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, toDisposable } from 'common/Lifecycle'; import { IDisposable } from 'common/Types'; import { Params } from 'common/parser/Params'; import { OscParser } from 'common/parser/OscParser'; diff --git a/src/common/public/BufferNamespaceApi.ts b/src/common/public/BufferNamespaceApi.ts index e8508608..425b1798 100644 --- a/src/common/public/BufferNamespaceApi.ts +++ b/src/common/public/BufferNamespaceApi.ts @@ -6,8 +6,8 @@ import { IBuffer as IBufferApi, IBufferNamespace as IBufferNamespaceApi } from '@xterm/xterm'; import { BufferApiView } from 'common/public/BufferApiView'; import { ICoreTerminal } from 'common/Types'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { Emitter } from 'vs/base/common/event'; +import { Disposable } from 'common/Lifecycle'; +import { Emitter } from 'common/Event'; export class BufferNamespaceApi extends Disposable implements IBufferNamespaceApi { private _normal: BufferApiView; diff --git a/src/common/services/BufferService.ts b/src/common/services/BufferService.ts index 4cba3c15..2e6227fe 100644 --- a/src/common/services/BufferService.ts +++ b/src/common/services/BufferService.ts @@ -3,12 +3,12 @@ * @license MIT */ -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable } from 'common/Lifecycle'; import { IAttributeData, IBufferLine } from 'common/Types'; import { BufferSet } from 'common/buffer/BufferSet'; import { IBuffer, IBufferSet } from 'common/buffer/Types'; import { IBufferService, IOptionsService, type IBufferResizeEvent } from 'common/services/Services'; -import { Emitter } from 'vs/base/common/event'; +import { Emitter } from 'common/Event'; export const MINIMUM_COLS = 2; // Less than 2 can mess with wide chars export const MINIMUM_ROWS = 1; diff --git a/src/common/services/CoreMouseService.ts b/src/common/services/CoreMouseService.ts index a10ddafb..d569f046 100644 --- a/src/common/services/CoreMouseService.ts +++ b/src/common/services/CoreMouseService.ts @@ -4,8 +4,8 @@ */ import { IBufferService, ICoreService, ICoreMouseService, IOptionsService } from 'common/services/Services'; import { ICoreMouseProtocol, ICoreMouseEvent, CoreMouseEncoding, CoreMouseEventType, CoreMouseButton, CoreMouseAction } from 'common/Types'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { Emitter } from 'vs/base/common/event'; +import { Disposable } from 'common/Lifecycle'; +import { Emitter } from 'common/Event'; /** * Supported default protocols. diff --git a/src/common/services/CoreService.ts b/src/common/services/CoreService.ts index 9981ba21..f2a15d8e 100644 --- a/src/common/services/CoreService.ts +++ b/src/common/services/CoreService.ts @@ -4,10 +4,10 @@ */ import { clone } from 'common/Clone'; -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable } from 'common/Lifecycle'; import { IDecPrivateModes, IKittyKeyboardState, IModes } from 'common/Types'; import { IBufferService, ICoreService, ILogService, IOptionsService } from 'common/services/Services'; -import { Emitter } from 'vs/base/common/event'; +import { Emitter } from 'common/Event'; const DEFAULT_MODES: IModes = Object.freeze({ insertMode: false diff --git a/src/common/services/DecorationService.test.ts b/src/common/services/DecorationService.test.ts index d7e459e1..365be087 100644 --- a/src/common/services/DecorationService.test.ts +++ b/src/common/services/DecorationService.test.ts @@ -6,8 +6,8 @@ import { assert } from 'chai'; import { DecorationService } from './DecorationService'; import { IMarker } from 'common/Types'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { Emitter } from 'vs/base/common/event'; +import { Disposable } from 'common/Lifecycle'; +import { Emitter } from 'common/Event'; function createFakeMarker(line: number): IMarker { return Object.freeze(new class extends Disposable { diff --git a/src/common/services/DecorationService.ts b/src/common/services/DecorationService.ts index e3cafa8f..92e06089 100644 --- a/src/common/services/DecorationService.ts +++ b/src/common/services/DecorationService.ts @@ -4,12 +4,12 @@ */ import { css } from 'common/Color'; -import { Disposable, DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore, 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'; +import { Emitter } from 'common/Event'; // Work variables to avoid garbage collection let $xmin = 0; diff --git a/src/common/services/LogService.ts b/src/common/services/LogService.ts index 986ff628..12c5e3b0 100644 --- a/src/common/services/LogService.ts +++ b/src/common/services/LogService.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable } from 'common/Lifecycle'; import { ILogService, IOptionsService, LogLevelEnum } from 'common/services/Services'; type LogType = (message?: any, ...optionalParams: any[]) => void; diff --git a/src/common/services/OptionsService.ts b/src/common/services/OptionsService.ts index 4ae8bf96..2eab930f 100644 --- a/src/common/services/OptionsService.ts +++ b/src/common/services/OptionsService.ts @@ -3,11 +3,11 @@ * @license MIT */ -import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; +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'; +import { Emitter } from 'common/Event'; export const DEFAULT_OPTIONS: Readonly> = { cols: 80, diff --git a/src/common/services/Services.ts b/src/common/services/Services.ts index bbf36771..737dcd0d 100644 --- a/src/common/services/Services.ts +++ b/src/common/services/Services.ts @@ -7,7 +7,7 @@ import { IDecoration, IDecorationOptions, ILinkHandler, ILogger, IWindowsPty, ty import { CoreMouseEncoding, CoreMouseEventType, CursorInactiveStyle, CursorStyle, IAttributeData, ICharset, IColor, ICoreMouseEvent, ICoreMouseProtocol, IDecPrivateModes, IDisposable, IKittyKeyboardState, IModes, IOscLinkData, IWindowOptions } from 'common/Types'; import { IBuffer, IBufferSet } from 'common/buffer/Types'; import { createDecorator } from 'common/services/ServiceRegistry'; -import type { Emitter, Event } from 'vs/base/common/event'; +import type { Emitter, Event } from 'common/Event'; export const IBufferService = createDecorator('BufferService'); export interface IBufferService { diff --git a/src/common/services/UnicodeService.ts b/src/common/services/UnicodeService.ts index 12e4ec41..d0dd8584 100644 --- a/src/common/services/UnicodeService.ts +++ b/src/common/services/UnicodeService.ts @@ -5,7 +5,7 @@ import { UnicodeV6 } from 'common/input/UnicodeV6'; import { IUnicodeService, IUnicodeVersionProvider, UnicodeCharProperties, UnicodeCharWidth } from 'common/services/Services'; -import { Emitter } from 'vs/base/common/event'; +import { Emitter } from 'common/Event'; export class UnicodeService implements IUnicodeService { public serviceBrand: any; diff --git a/src/common/tsconfig.json b/src/common/tsconfig.json index e9b3673a..28f5205c 100644 --- a/src/common/tsconfig.json +++ b/src/common/tsconfig.json @@ -11,14 +11,11 @@ ], "baseUrl": "..", "paths": { - "vs/*": [ "./vs/*" ] + "common/*": [ "./common/*" ] } }, "include": [ "./**/*", "../../typings/xterm.d.ts" - ], - "references": [ - { "path": "../vs" } ] } diff --git a/src/headless/Terminal.ts b/src/headless/Terminal.ts index 1425699e..52618e86 100644 --- a/src/headless/Terminal.ts +++ b/src/headless/Terminal.ts @@ -25,7 +25,7 @@ import { DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine'; import { IBuffer } from 'common/buffer/Types'; import { CoreTerminal } from 'common/CoreTerminal'; import { IMarker, ITerminalOptions } from 'common/Types'; -import { Emitter, Event } from 'vs/base/common/event'; +import { Emitter, Event } from 'common/Event'; export class Terminal extends CoreTerminal { private readonly _onBell = this._register(new Emitter()); diff --git a/src/headless/public/Terminal.ts b/src/headless/public/Terminal.ts index 18659b3c..17b143fa 100644 --- a/src/headless/public/Terminal.ts +++ b/src/headless/public/Terminal.ts @@ -10,8 +10,8 @@ import { IBufferNamespace as IBufferNamespaceApi, IMarker, IModes, IParser, ITer import { Terminal as TerminalCore } from 'headless/Terminal'; import { AddonManager } from 'common/public/AddonManager'; import { ITerminalOptions } from 'common/Types'; -import { Disposable } from 'vs/base/common/lifecycle'; -import type { Event } from 'vs/base/common/event'; +import { Disposable } from 'common/Lifecycle'; +import type { Event } from 'common/Event'; /** * The set of options that only have an effect when set in the Terminal constructor. */ From b58bd452afc88012471e62ff215dff5c046f5d2d Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 30 Jan 2026 06:07:30 -0800 Subject: [PATCH 2/4] Fix lint --- src/common/Event.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/common/Event.ts b/src/common/Event.ts index 2239725c..44146e76 100644 --- a/src/common/Event.ts +++ b/src/common/Event.ts @@ -8,16 +8,16 @@ import { IDisposable, DisposableStore, toDisposable } from 'common/Lifecycle'; -export interface Event { +export interface IEvent { (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable; } export class Emitter { - private _listeners: Array<{ fn: (e: T) => any; thisArgs: any }> = []; + private _listeners: { fn: (e: T) => any, thisArgs: any }[] = []; private _disposed = false; - private _event: Event | undefined; + private _event: IEvent | undefined; - public get event(): Event { + public get event(): IEvent { if (!this._event) { this._event = (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => { if (this._disposed) { @@ -69,19 +69,19 @@ export class Emitter { } export namespace Event { - export function forward(from: Event, to: Emitter): IDisposable { + export function forward(from: IEvent, to: Emitter): IDisposable { return from(e => to.fire(e)); } - export function map(event: Event, map: (i: I) => O): Event { + export function map(event: IEvent, map: (i: I) => O): IEvent { return (listener: (e: O) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => { return event(i => listener.call(thisArgs, map(i)), undefined, disposables); }; } - export function any(...events: Event[]): Event; - export function any(...events: Event[]): Event; - export function any(...events: Event[]): Event { + export function any(...events: IEvent[]): IEvent; + export function any(...events: IEvent[]): IEvent; + export function any(...events: IEvent[]): IEvent { return (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => { const store = new DisposableStore(); for (const event of events) { @@ -98,7 +98,7 @@ export namespace Event { }; } - export function runAndSubscribe(event: Event, handler: (e: T | undefined) => void): IDisposable { + export function runAndSubscribe(event: IEvent, handler: (e: T | undefined) => void): IDisposable { handler(undefined); return event(e => handler(e)); } From f80dbf3d03d1076b42c5a02c82253b93defdd29d Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 30 Jan 2026 06:21:15 -0800 Subject: [PATCH 3/4] Fix lint, split up namespace and interface --- addons/addon-webgl/src/Types.ts | 6 +-- addons/addon-webgl/src/WebglAddon.ts | 10 ++-- addons/addon-webgl/src/WebglRenderer.ts | 6 +-- src/browser/CoreBrowserTerminal.ts | 22 ++++----- src/browser/TestUtils.test.ts | 54 +++++++++++----------- src/browser/Types.ts | 20 ++++---- src/browser/Viewport.ts | 6 +-- src/browser/public/Terminal.ts | 28 +++++------ src/browser/renderer/shared/Types.ts | 4 +- src/browser/services/CoreBrowserService.ts | 4 +- src/browser/services/Services.ts | 26 +++++------ src/common/CoreTerminal.ts | 14 +++--- src/common/Event.ts | 2 +- src/common/TestUtils.test.ts | 20 ++++---- src/common/Types.ts | 12 ++--- src/common/buffer/Types.ts | 4 +- src/common/services/Services.ts | 24 +++++----- src/headless/Terminal.ts | 12 ++--- src/headless/public/Terminal.ts | 22 ++++----- 19 files changed, 148 insertions(+), 148 deletions(-) diff --git a/addons/addon-webgl/src/Types.ts b/addons/addon-webgl/src/Types.ts index 3e734a0d..67c9408d 100644 --- a/addons/addon-webgl/src/Types.ts +++ b/addons/addon-webgl/src/Types.ts @@ -7,7 +7,7 @@ import { FontWeight } from '@xterm/xterm'; import { IColorSet } from 'browser/Types'; import { ISelectionRenderModel } from 'browser/renderer/shared/Types'; import { CursorInactiveStyle, CursorStyle, type IDisposable } from 'common/Types'; -import type { Event } from 'common/Event'; +import type { IEvent } from 'common/Event'; export interface IRenderModel { cells: Uint32Array; @@ -58,8 +58,8 @@ export interface ICharAtlasConfig { export interface ITextureAtlas extends IDisposable { readonly pages: { canvas: HTMLCanvasElement, version: number }[]; - onAddTextureAtlasCanvas: Event; - onRemoveTextureAtlasCanvas: Event; + onAddTextureAtlasCanvas: IEvent; + onRemoveTextureAtlasCanvas: IEvent; /** * Warm up the texture atlas, adding common glyphs to avoid slowing early frame. diff --git a/addons/addon-webgl/src/WebglAddon.ts b/addons/addon-webgl/src/WebglAddon.ts index 0bc24c90..7dc3ed35 100644 --- a/addons/addon-webgl/src/WebglAddon.ts +++ b/addons/addon-webgl/src/WebglAddon.ts @@ -13,7 +13,7 @@ import { ICoreService, IDecorationService, ILogService, IOptionsService } from ' import { IWebGL2RenderingContext } from './Types'; import { WebglRenderer } from './WebglRenderer'; import { setTraceLogger } from 'common/services/LogService'; -import { Emitter, Event } from 'common/Event'; +import { Emitter, EventUtils } from 'common/Event'; export class WebglAddon extends Disposable implements ITerminalAddon , IWebglApi { private _terminal?: Terminal; @@ -85,10 +85,10 @@ export class WebglAddon extends Disposable implements ITerminalAddon , IWebglApi this._customGlyphs, this._preserveDrawingBuffer )); - this._register(Event.forward(this._renderer.onContextLoss, this._onContextLoss)); - this._register(Event.forward(this._renderer.onChangeTextureAtlas, this._onChangeTextureAtlas)); - this._register(Event.forward(this._renderer.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas)); - this._register(Event.forward(this._renderer.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas)); + this._register(EventUtils.forward(this._renderer.onContextLoss, this._onContextLoss)); + this._register(EventUtils.forward(this._renderer.onChangeTextureAtlas, this._onChangeTextureAtlas)); + this._register(EventUtils.forward(this._renderer.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas)); + this._register(EventUtils.forward(this._renderer.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas)); renderService.setRenderer(this._renderer); this._register(toDisposable(() => { diff --git a/addons/addon-webgl/src/WebglRenderer.ts b/addons/addon-webgl/src/WebglRenderer.ts index 1bdde448..05af6527 100644 --- a/addons/addon-webgl/src/WebglRenderer.ts +++ b/addons/addon-webgl/src/WebglRenderer.ts @@ -22,7 +22,7 @@ import { COMBINED_CHAR_BIT_MASK, RENDER_MODEL_BG_OFFSET, RENDER_MODEL_EXT_OFFSET import { IWebGL2RenderingContext, type ITextureAtlas } from './Types'; import { LinkRenderLayer } from './renderLayer/LinkRenderLayer'; import { IRenderLayer } from './renderLayer/Types'; -import { Emitter, Event } from 'common/Event'; +import { Emitter, EventUtils } from 'common/Event'; import { addDisposableListener } from 'vs/base/browser/dom'; import { combinedDisposable, Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle'; import { createRenderDimensions } from 'browser/renderer/shared/RendererUtils'; @@ -290,8 +290,8 @@ export class WebglRenderer extends Disposable implements IRenderer { if (this._charAtlas !== atlas) { this._onChangeTextureAtlas.fire(atlas.pages[0].canvas); this._charAtlasDisposable.value = combinedDisposable( - Event.forward(atlas.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas), - Event.forward(atlas.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas) + EventUtils.forward(atlas.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas), + EventUtils.forward(atlas.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas) ); } this._charAtlas = atlas; diff --git a/src/browser/CoreBrowserTerminal.ts b/src/browser/CoreBrowserTerminal.ts index f743bd00..869a545a 100644 --- a/src/browser/CoreBrowserTerminal.ts +++ b/src/browser/CoreBrowserTerminal.ts @@ -55,7 +55,7 @@ import { IDecorationService } from 'common/services/Services'; import { WindowsOptionsReportType } from '../common/InputHandler'; import { AccessibilityManager } from './AccessibilityManager'; import { Linkifier } from './Linkifier'; -import { Emitter, Event } from 'common/Event'; +import { Emitter, EventUtils, type IEvent } from 'common/Event'; import { addDisposableListener } from 'vs/base/browser/dom'; import { MutableDisposable, toDisposable } from 'common/Lifecycle'; @@ -135,15 +135,15 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { public readonly onBell = this._onBell.event; private _onFocus = this._register(new Emitter()); - public get onFocus(): Event { return this._onFocus.event; } + public get onFocus(): IEvent { return this._onFocus.event; } private _onBlur = this._register(new Emitter()); - public get onBlur(): Event { return this._onBlur.event; } + public get onBlur(): IEvent { return this._onBlur.event; } private _onA11yCharEmitter = this._register(new Emitter()); - public get onA11yChar(): Event { return this._onA11yCharEmitter.event; } + public get onA11yChar(): IEvent { return this._onA11yCharEmitter.event; } private _onA11yTabEmitter = this._register(new Emitter()); - public get onA11yTab(): Event { return this._onA11yTabEmitter.event; } + public get onA11yTab(): IEvent { return this._onA11yTabEmitter.event; } private _onWillOpen = this._register(new Emitter()); - public get onWillOpen(): Event { return this._onWillOpen.event; } + public get onWillOpen(): IEvent { return this._onWillOpen.event; } private readonly _onDimensionsChange = this._register(new Emitter()); public readonly onDimensionsChange = this._onDimensionsChange.event; @@ -187,10 +187,10 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { this._register(this._inputHandler.onRequestReset(() => this.reset())); this._register(this._inputHandler.onRequestWindowsOptionsReport(type => this._reportWindowsOptions(type))); this._register(this._inputHandler.onColor((event) => this._handleColorEvent(event))); - this._register(Event.forward(this._inputHandler.onCursorMove, this._onCursorMove)); - this._register(Event.forward(this._inputHandler.onTitleChange, this._onTitleChange)); - this._register(Event.forward(this._inputHandler.onA11yChar, this._onA11yCharEmitter)); - this._register(Event.forward(this._inputHandler.onA11yTab, this._onA11yTabEmitter)); + this._register(EventUtils.forward(this._inputHandler.onCursorMove, this._onCursorMove)); + this._register(EventUtils.forward(this._inputHandler.onTitleChange, this._onTitleChange)); + this._register(EventUtils.forward(this._inputHandler.onA11yChar, this._onA11yCharEmitter)); + this._register(EventUtils.forward(this._inputHandler.onA11yTab, this._onA11yTabEmitter)); // Setup listeners this._register(this._bufferService.onResize(e => this._afterResize(e.cols, e.rows))); @@ -566,7 +566,7 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { this.textarea!.focus(); this.textarea!.select(); })); - this._register(Event.any( + this._register(EventUtils.any( this._onScroll.event, this._inputHandler.onScroll )(() => { diff --git a/src/browser/TestUtils.test.ts b/src/browser/TestUtils.test.ts index 2d83ae53..76163bad 100644 --- a/src/browser/TestUtils.test.ts +++ b/src/browser/TestUtils.test.ts @@ -18,7 +18,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, type Event } from 'common/Event'; +import { Emitter, type IEvent } from 'common/Event'; export class TestTerminal extends CoreBrowserTerminal { public get curAttrData(): IAttributeData { return (this as any)._inputHandler._curAttrData; } @@ -30,24 +30,24 @@ export class TestTerminal extends CoreBrowserTerminal { } export class MockTerminal implements ITerminal { - public onBlur!: Event; - public onFocus!: Event; - public onA11yChar!: Event; - public onWriteParsed!: Event; - public onA11yTab!: Event; - public onCursorMove!: Event; - public onLineFeed!: Event; - public onSelectionChange!: Event; - public onData!: Event; - public onBinary!: Event; - public onTitleChange!: Event; - public onBell!: Event; - public onScroll!: Event; - public onWillOpen!: Event; - public onKey!: Event<{ key: string, domEvent: KeyboardEvent }>; - public onRender!: Event<{ start: number, end: number }>; - public onResize!: Event<{ cols: number, rows: number }>; - public onDimensionsChange!: Event; + public onBlur!: IEvent; + public onFocus!: IEvent; + public onA11yChar!: IEvent; + public onWriteParsed!: IEvent; + public onA11yTab!: IEvent; + public onCursorMove!: IEvent; + public onLineFeed!: IEvent; + public onSelectionChange!: IEvent; + public onData!: IEvent; + public onBinary!: IEvent; + public onTitleChange!: IEvent; + public onBell!: IEvent; + public onScroll!: IEvent; + public onWillOpen!: IEvent; + public onKey!: IEvent<{ key: string, domEvent: KeyboardEvent }>; + public onRender!: IEvent<{ start: number, end: number }>; + public onResize!: IEvent<{ cols: number, rows: number }>; + public onDimensionsChange!: IEvent; public dimensions: IRenderDimensionsApi | undefined; public markers!: IMarker[]; public linkifier: ILinkifier2 | undefined; @@ -273,9 +273,9 @@ export class MockBuffer implements IBuffer { } export class MockRenderer implements IRenderer { - public onRequestRedraw!: Event; - public onCanvasResize!: Event<{ width: number, height: number }>; - public onRender!: Event<{ start: number, end: number }>; + public onRequestRedraw!: IEvent; + public onCanvasResize!: IEvent<{ width: number, height: number }>; + public onRender!: IEvent<{ start: number, end: number }>; public dispose(): void { throw new Error('Method not implemented.'); } @@ -378,7 +378,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: Event = new Emitter().event; + public onCharSizeChange: IEvent = new Emitter().event; constructor(public width: number, public height: number) {} public measure(): void {} } @@ -396,10 +396,10 @@ export class MockMouseService implements IMouseService { export class MockRenderService implements IRenderService { public serviceBrand: undefined; - public onDimensionsChange: Event = new Emitter().event; - public onRenderedViewportChange: Event<{ start: number, end: number }> = new Emitter<{ start: number, end: number }>().event; - public onRender: Event<{ start: number, end: number }> = new Emitter<{ start: number, end: number }>().event; - public onRefreshRequest: Event<{ start: number, end: number}> = new Emitter<{ start: number, end: number }>().event; + public onDimensionsChange: IEvent = new Emitter().event; + public onRenderedViewportChange: IEvent<{ start: number, end: number }> = new Emitter<{ start: number, end: number }>().event; + public onRender: IEvent<{ start: number, end: number }> = new Emitter<{ start: number, end: number }>().event; + public onRefreshRequest: IEvent<{ start: number, end: number}> = new Emitter<{ start: number, end: number }>().event; public dimensions: IRenderDimensions = createRenderDimensions(); public refreshRows(start: number, end: number): void { throw new Error('Method not implemented.'); diff --git a/src/browser/Types.ts b/src/browser/Types.ts index 5c840bff..f54e488c 100644 --- a/src/browser/Types.ts +++ b/src/browser/Types.ts @@ -7,7 +7,7 @@ import { CharData, IColor, ICoreTerminal, ITerminalOptions } from 'common/Types' import { IBuffer } from 'common/buffer/Types'; import { IDisposable, IRenderDimensions as IRenderDimensionsApi, Terminal as ITerminalApi } from '@xterm/xterm'; import { channels, css } from 'common/Color'; -import type { Event } from 'common/Event'; +import type { IEvent } from 'common/Event'; /** * A portion of the public API that are implemented identially internally and simply passed through. @@ -23,12 +23,12 @@ export interface ITerminal extends InternalPassthroughApis, ICoreTerminal { readonly dimensions: IRenderDimensionsApi | undefined; - onBlur: Event; - onFocus: Event; - onDimensionsChange: Event; - onA11yChar: Event; - onA11yTab: Event; - onWillOpen: Event; + onBlur: IEvent; + onFocus: IEvent; + onDimensionsChange: IEvent; + onA11yChar: IEvent; + onA11yTab: IEvent; + onWillOpen: IEvent; cancel(ev: MouseEvent | WheelEvent | KeyboardEvent | InputEvent, force?: boolean): boolean | void; } @@ -101,7 +101,7 @@ export interface IPartialColorSet { export interface IViewport extends IDisposable { scrollBarWidth: number; - readonly onRequestScrollLines: Event<{ amount: number, suppressScrollEvent: boolean }>; + readonly onRequestScrollLines: IEvent<{ amount: number, suppressScrollEvent: boolean }>; syncScrollArea(immediate?: boolean, force?: boolean): void; getLinesScrolled(ev: WheelEvent): number; getBufferElements(startLine: number, endLine?: number): { bufferElements: HTMLElement[], cursorElement?: HTMLElement }; @@ -131,8 +131,8 @@ export interface ILinkWithState { } export interface ILinkifier2 extends IDisposable { - onShowLinkUnderline: Event; - onHideLinkUnderline: Event; + onShowLinkUnderline: IEvent; + onHideLinkUnderline: IEvent; readonly currentLink: ILinkWithState | undefined; } diff --git a/src/browser/Viewport.ts b/src/browser/Viewport.ts index 33442976..2e1d8861 100644 --- a/src/browser/Viewport.ts +++ b/src/browser/Viewport.ts @@ -11,7 +11,7 @@ import { CoreMouseEventType } from 'common/Types'; import { addDisposableListener, 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, Event } from 'common/Event'; +import { Emitter, EventUtils } from 'common/Event'; import { Scrollable, ScrollbarVisibility, type ScrollEvent } from 'vs/base/common/scrollable'; import { Gesture, EventType as GestureEventType, type GestureEvent } from 'vs/base/browser/touch'; @@ -71,7 +71,7 @@ export class Viewport extends Disposable { })); this._scrollableElement.setScrollDimensions({ height: 0, scrollHeight: 0 }); - this._register(Event.runAndSubscribe(themeService.onChangeColors, () => { + this._register(EventUtils.runAndSubscribe(themeService.onChangeColors, () => { element.style.backgroundColor = themeService.colors.background.css; this._scrollableElement.getDomNode().style.backgroundColor = themeService.colors.background.css; })); @@ -81,7 +81,7 @@ export class Viewport extends Disposable { this._styleElement = coreBrowserService.mainDocument.createElement('style'); screenElement.appendChild(this._styleElement); this._register(toDisposable(() => this._styleElement.remove())); - this._register(Event.runAndSubscribe(themeService.onChangeColors, () => { + this._register(EventUtils.runAndSubscribe(themeService.onChangeColors, () => { this._styleElement.textContent = [ `.xterm .xterm-scrollable-element > .scrollbar > .slider {`, ` background: ${themeService.colors.scrollbarSliderBackground.css};`, diff --git a/src/browser/public/Terminal.ts b/src/browser/public/Terminal.ts index 16006905..6b4cdee2 100644 --- a/src/browser/public/Terminal.ts +++ b/src/browser/public/Terminal.ts @@ -13,7 +13,7 @@ import { BufferNamespaceApi } from 'common/public/BufferNamespaceApi'; import { ParserApi } from 'common/public/ParserApi'; import { UnicodeApi } from 'common/public/UnicodeApi'; import { IBufferNamespace as IBufferNamespaceApi, IDecoration, IDecorationOptions, IDisposable, ILinkProvider, ILocalizableStrings, IMarker, IModes, IParser, IRenderDimensions, ITerminalAddon, Terminal as ITerminalApi, ITerminalInitOnlyOptions, IUnicodeHandling } from '@xterm/xterm'; -import type { Event } from 'common/Event'; +import type { IEvent } from 'common/Event'; /** * The set of options that only have an effect when set in the Terminal constructor. @@ -68,19 +68,19 @@ export class Terminal extends Disposable implements ITerminalApi { } } - public get onBell(): Event { return this._core.onBell; } - public get onBinary(): Event { return this._core.onBinary; } - public get onCursorMove(): Event { return this._core.onCursorMove; } - public get onData(): Event { return this._core.onData; } - public get onKey(): Event<{ key: string, domEvent: KeyboardEvent }> { return this._core.onKey; } - public get onLineFeed(): Event { return this._core.onLineFeed; } - public get onRender(): Event<{ start: number, end: number }> { return this._core.onRender; } - public get onResize(): Event<{ cols: number, rows: number }> { return this._core.onResize; } - public get onScroll(): Event { return this._core.onScroll; } - public get onSelectionChange(): Event { return this._core.onSelectionChange; } - public get onTitleChange(): Event { return this._core.onTitleChange; } - public get onWriteParsed(): Event { return this._core.onWriteParsed; } - public get onDimensionsChange(): Event { return this._core.onDimensionsChange; } + public get onBell(): IEvent { return this._core.onBell; } + public get onBinary(): IEvent { return this._core.onBinary; } + public get onCursorMove(): IEvent { return this._core.onCursorMove; } + public get onData(): IEvent { return this._core.onData; } + public get onKey(): IEvent<{ key: string, domEvent: KeyboardEvent }> { return this._core.onKey; } + public get onLineFeed(): IEvent { return this._core.onLineFeed; } + public get onRender(): IEvent<{ start: number, end: number }> { return this._core.onRender; } + public get onResize(): IEvent<{ cols: number, rows: number }> { return this._core.onResize; } + public get onScroll(): IEvent { return this._core.onScroll; } + public get onSelectionChange(): IEvent { return this._core.onSelectionChange; } + public get onTitleChange(): IEvent { return this._core.onTitleChange; } + public get onWriteParsed(): IEvent { return this._core.onWriteParsed; } + public get onDimensionsChange(): IEvent { return this._core.onDimensionsChange; } public get element(): HTMLElement | undefined { return this._core.element; } public get parser(): IParser { diff --git a/src/browser/renderer/shared/Types.ts b/src/browser/renderer/shared/Types.ts index 05f462a7..f86cd4fe 100644 --- a/src/browser/renderer/shared/Types.ts +++ b/src/browser/renderer/shared/Types.ts @@ -6,7 +6,7 @@ import { Terminal } from '@xterm/xterm'; import { ITerminal } from 'browser/Types'; import { IDisposable } from 'common/Types'; -import type { Event } from 'common/Event'; +import type { IEvent } from 'common/Event'; export interface IDimensions { width: number; @@ -57,7 +57,7 @@ export interface IRenderer extends IDisposable { * Fires when the renderer is requesting to be redrawn on the next animation * frame but is _not_ a result of content changing (eg. selection changes). */ - readonly onRequestRedraw: Event; + readonly onRequestRedraw: IEvent; dispose(): void; handleDevicePixelRatioChange(): void; diff --git a/src/browser/services/CoreBrowserService.ts b/src/browser/services/CoreBrowserService.ts index 562793f2..4e5d8b71 100644 --- a/src/browser/services/CoreBrowserService.ts +++ b/src/browser/services/CoreBrowserService.ts @@ -4,7 +4,7 @@ */ import { ICoreBrowserService } from './Services'; -import { Emitter, Event } from 'common/Event'; +import { Emitter, EventUtils } from 'common/Event'; import { addDisposableListener } from 'vs/base/browser/dom'; import { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle'; @@ -29,7 +29,7 @@ export class CoreBrowserService extends Disposable implements ICoreBrowserServic // Monitor device pixel ratio this._register(this.onWindowChange(w => this._screenDprMonitor.setWindow(w))); - this._register(Event.forward(this._screenDprMonitor.onDprChange, this._onDprChange)); + this._register(EventUtils.forward(this._screenDprMonitor.onDprChange, this._onDprChange)); this._register(addDisposableListener(this._textarea, 'focus', () => this._isFocused = true)); this._register(addDisposableListener(this._textarea, 'blur', () => this._isFocused = false)); diff --git a/src/browser/services/Services.ts b/src/browser/services/Services.ts index af9211df..1c82b28b 100644 --- a/src/browser/services/Services.ts +++ b/src/browser/services/Services.ts @@ -8,7 +8,7 @@ import { IColorSet, ILink, ReadonlyColorSet } from 'browser/Types'; import { ISelectionRedrawRequestEvent as ISelectionRequestRedrawEvent, ISelectionRequestScrollLinesEvent } from 'browser/selection/Types'; import { createDecorator } from 'common/services/ServiceRegistry'; import { AllColorIndex, IDisposable, IKeyboardResult } from 'common/Types'; -import type { Event } from 'common/Event'; +import type { IEvent } from 'common/Event'; export const ICharSizeService = createDecorator('CharSizeService'); export interface ICharSizeService { @@ -18,7 +18,7 @@ export interface ICharSizeService { readonly height: number; readonly hasValidSize: boolean; - readonly onCharSizeChange: Event; + readonly onCharSizeChange: IEvent; measure(): void; } @@ -29,8 +29,8 @@ export interface ICoreBrowserService { readonly isFocused: boolean; - readonly onDprChange: Event; - readonly onWindowChange: Event; + readonly onDprChange: IEvent; + readonly onWindowChange: IEvent; /** * Gets or sets the parent window that the terminal is rendered into. DOM and rendering APIs (e.g. @@ -61,17 +61,17 @@ export const IRenderService = createDecorator('RenderService'); export interface IRenderService extends IDisposable { serviceBrand: undefined; - onDimensionsChange: Event; + onDimensionsChange: IEvent; /** * Fires when buffer changes are rendered. This does not fire when only cursor * or selections are rendered. */ - onRenderedViewportChange: Event<{ start: number, end: number }>; + onRenderedViewportChange: IEvent<{ start: number, end: number }>; /** * Fires on render */ - onRender: Event<{ start: number, end: number }>; - onRefreshRequest: Event<{ start: number, end: number }>; + onRender: IEvent<{ start: number, end: number }>; + onRefreshRequest: IEvent<{ start: number, end: number }>; dimensions: IRenderDimensions; @@ -101,10 +101,10 @@ export interface ISelectionService { readonly selectionStart: [number, number] | undefined; readonly selectionEnd: [number, number] | undefined; - readonly onLinuxMouseSelection: Event; - readonly onRequestRedraw: Event; - readonly onRequestScrollLines: Event; - readonly onSelectionChange: Event; + readonly onLinuxMouseSelection: IEvent; + readonly onRequestRedraw: IEvent; + readonly onRequestScrollLines: IEvent; + readonly onSelectionChange: IEvent; disable(): void; enable(): void; @@ -136,7 +136,7 @@ export interface IThemeService { readonly colors: ReadonlyColorSet; - readonly onChangeColors: Event; + readonly onChangeColors: IEvent; restoreColor(slot?: AllColorIndex): void; /** diff --git a/src/common/CoreTerminal.ts b/src/common/CoreTerminal.ts index cff8558e..d630013c 100644 --- a/src/common/CoreTerminal.ts +++ b/src/common/CoreTerminal.ts @@ -37,7 +37,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, Event } from 'common/Event'; +import { Emitter, EventUtils, type IEvent } from 'common/Event'; import { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle'; // Only trigger this warning a single time per session @@ -78,7 +78,7 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal { */ protected _onScrollApi?: Emitter; protected _onScroll = this._register(new Emitter()); - public get onScroll(): Event { + public get onScroll(): IEvent { if (!this._onScrollApi) { this._onScrollApi = this._register(new Emitter()); this._onScroll.event(ev => { @@ -125,12 +125,12 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal { // Register input handler and handle/forward events this._inputHandler = this._register(new InputHandler(this._bufferService, this._charsetService, this.coreService, this._logService, this.optionsService, this._oscLinkService, this.coreMouseService, this.unicodeService)); - this._register(Event.forward(this._inputHandler.onLineFeed, this._onLineFeed)); + this._register(EventUtils.forward(this._inputHandler.onLineFeed, this._onLineFeed)); // Setup listeners - this._register(Event.forward(this._bufferService.onResize, this._onResize)); - this._register(Event.forward(this.coreService.onData, this._onData)); - this._register(Event.forward(this.coreService.onBinary, this._onBinary)); + this._register(EventUtils.forward(this._bufferService.onResize, this._onResize)); + this._register(EventUtils.forward(this.coreService.onData, this._onData)); + this._register(EventUtils.forward(this.coreService.onBinary, this._onBinary)); this._register(this.coreService.onRequestScrollToBottom(() => this.scrollToBottom(true))); this._register(this.coreService.onUserInput(() => this._writeBuffer.handleUserInput())); this._register(this.optionsService.onMultipleOptionChange(['windowsPty'], () => this._handleWindowsPtyOptionChange())); @@ -140,7 +140,7 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal { })); // Setup WriteBuffer this._writeBuffer = this._register(new WriteBuffer((data, promiseResult) => this._inputHandler.parse(data, promiseResult))); - this._register(Event.forward(this._writeBuffer.onWriteParsed, this._onWriteParsed)); + this._register(EventUtils.forward(this._writeBuffer.onWriteParsed, this._onWriteParsed)); } public write(data: string | Uint8Array, callback?: () => void): void { diff --git a/src/common/Event.ts b/src/common/Event.ts index 44146e76..9ea39b9c 100644 --- a/src/common/Event.ts +++ b/src/common/Event.ts @@ -68,7 +68,7 @@ export class Emitter { } } -export namespace Event { +export namespace EventUtils { export function forward(from: IEvent, to: Emitter): IDisposable { return from(e => to.fire(e)); } diff --git a/src/common/TestUtils.test.ts b/src/common/TestUtils.test.ts index cbe4fe58..137174e8 100644 --- a/src/common/TestUtils.test.ts +++ b/src/common/TestUtils.test.ts @@ -12,14 +12,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, type Event } from 'common/Event'; +import { Emitter, type IEvent } from '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: Event = new Emitter().event; - public onScroll: Event = new Emitter().event; + public onResize: IEvent = new Emitter().event; + public onScroll: IEvent = new Emitter().event; private readonly _onScroll = new Emitter(); public isUserScrolling: boolean = false; constructor( @@ -67,7 +67,7 @@ export class MockCoreMouseService implements ICoreMouseService { public addProtocol(name: string): void { } public reset(): void { } public triggerMouseEvent(event: ICoreMouseEvent): boolean { return false; } - public onProtocolChange: Event = new Emitter().event; + public onProtocolChange: IEvent = new Emitter().event; public explainEvents(events: CoreMouseEventType): { [event: string]: boolean } { throw new Error('Method not implemented.'); } @@ -122,10 +122,10 @@ export class MockCoreService implements ICoreService { mainStack: [] as number[], altStack: [] as number[] }; - public onData: Event = new Emitter().event; - public onUserInput: Event = new Emitter().event; - public onBinary: Event = new Emitter().event; - public onRequestScrollToBottom: Event = new Emitter().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 { } @@ -145,7 +145,7 @@ export class MockOptionsService implements IOptionsService { public serviceBrand: any; public readonly rawOptions: Required = clone(DEFAULT_OPTIONS); public options: Required = this.rawOptions; - public onOptionChange: Event = new Emitter().event; + public onOptionChange: IEvent = new Emitter().event; constructor(testOptions?: Partial) { if (testOptions) { for (const key of Object.keys(testOptions)) { @@ -197,7 +197,7 @@ export class MockUnicodeService implements IUnicodeService { } public versions: string[] = []; public activeVersion: string = ''; - public onChange: Event = new Emitter().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); diff --git a/src/common/Types.ts b/src/common/Types.ts index aeeee5b2..ec10ed55 100644 --- a/src/common/Types.ts +++ b/src/common/Types.ts @@ -9,7 +9,7 @@ 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, Event } from 'common/Event'; +import type { Emitter, IEvent } from 'common/Event'; export interface ICoreTerminal { coreMouseService: ICoreMouseService; @@ -68,11 +68,11 @@ export interface ICircularList { isFull: boolean; onDeleteEmitter: Emitter; - onDelete: Event; + onDelete: IEvent; onInsertEmitter: Emitter; - onInsert: Event; + onInsert: IEvent; onTrimEmitter: Emitter; - onTrim: Event; + onTrim: IEvent; get(index: number): T | undefined; set(index: number, value: T): void; @@ -258,7 +258,7 @@ export interface IMarker extends IDisposable { readonly id: number; readonly isDisposed: boolean; readonly line: number; - onDispose: Event; + onDispose: IEvent; } export interface IModes { insertMode: boolean; @@ -467,7 +467,7 @@ export type IColorEvent = (IColorReportRequest | IColorSetRequest | IColorRestor * Calls the parser and handles actions generated by the parser. */ export interface IInputHandler { - onTitleChange: Event; + onTitleChange: IEvent; parse(data: string | Uint8Array, promiseResult?: boolean): void | Promise; print(data: Uint32Array, start: number, end: number): void; diff --git a/src/common/buffer/Types.ts b/src/common/buffer/Types.ts index b6e83586..85dd68ee 100644 --- a/src/common/buffer/Types.ts +++ b/src/common/buffer/Types.ts @@ -4,7 +4,7 @@ */ import { IAttributeData, ICircularList, IBufferLine, ICellData, IMarker, ICharset, IDisposable } from 'common/Types'; -import type { Event } from 'common/Event'; +import type { IEvent } from 'common/Event'; // BufferIndex denotes a position in the buffer: [rowIndex, colIndex] export type BufferIndex = [number, number]; @@ -46,7 +46,7 @@ export interface IBufferSet extends IDisposable { normal: IBuffer; active: IBuffer; - onBufferActivate: Event<{ activeBuffer: IBuffer, inactiveBuffer: IBuffer }>; + onBufferActivate: IEvent<{ activeBuffer: IBuffer, inactiveBuffer: IBuffer }>; activateNormalBuffer(): void; activateAltBuffer(fillAttr?: IAttributeData): void; diff --git a/src/common/services/Services.ts b/src/common/services/Services.ts index 737dcd0d..30ad6048 100644 --- a/src/common/services/Services.ts +++ b/src/common/services/Services.ts @@ -7,7 +7,7 @@ import { IDecoration, IDecorationOptions, ILinkHandler, ILogger, IWindowsPty, ty import { CoreMouseEncoding, CoreMouseEventType, CursorInactiveStyle, CursorStyle, IAttributeData, ICharset, IColor, ICoreMouseEvent, ICoreMouseProtocol, IDecPrivateModes, IDisposable, IKittyKeyboardState, IModes, IOscLinkData, IWindowOptions } from 'common/Types'; import { IBuffer, IBufferSet } from 'common/buffer/Types'; import { createDecorator } from 'common/services/ServiceRegistry'; -import type { Emitter, Event } from 'common/Event'; +import type { Emitter, IEvent } from 'common/Event'; export const IBufferService = createDecorator('BufferService'); export interface IBufferService { @@ -18,8 +18,8 @@ export interface IBufferService { readonly buffer: IBuffer; readonly buffers: IBufferSet; isUserScrolling: boolean; - onResize: Event; - onScroll: Event; + onResize: IEvent; + onScroll: IEvent; scroll(eraseAttr: IAttributeData, isWrapped?: boolean): void; scrollLines(disp: number, suppressScrollEvent?: boolean): void; resize(cols: number, rows: number): void; @@ -59,7 +59,7 @@ export interface ICoreMouseService { /** * Event to announce changes in mouse tracking. */ - onProtocolChange: Event; + onProtocolChange: IEvent; /** * Human readable version of mouse events. @@ -87,10 +87,10 @@ export interface ICoreService { readonly decPrivateModes: IDecPrivateModes; readonly kittyKeyboard: IKittyKeyboardState; - readonly onData: Event; - readonly onUserInput: Event; - readonly onBinary: Event; - readonly onRequestScrollToBottom: Event; + readonly onData: IEvent; + readonly onUserInput: IEvent; + readonly onBinary: IEvent; + readonly onRequestScrollToBottom: IEvent; reset(): void; @@ -201,7 +201,7 @@ export interface IOptionsService { /** * Adds an event listener for when any option changes. */ - readonly onOptionChange: Event; + readonly onOptionChange: IEvent; /** * Adds an event listener for when a specific option changes, this is a convenience method that is @@ -364,7 +364,7 @@ export interface IUnicodeService { /** Currently active version. */ activeVersion: string; /** Event triggered, when activate version changed. */ - readonly onChange: Event; + readonly onChange: IEvent; /** * Unicode version dependent @@ -389,8 +389,8 @@ export const IDecorationService = createDecorator('Decoratio export interface IDecorationService extends IDisposable { serviceBrand: undefined; readonly decorations: IterableIterator; - readonly onDecorationRegistered: Event; - readonly onDecorationRemoved: Event; + readonly onDecorationRegistered: IEvent; + readonly onDecorationRemoved: IEvent; registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined; reset(): void; /** diff --git a/src/headless/Terminal.ts b/src/headless/Terminal.ts index 52618e86..cc8b152b 100644 --- a/src/headless/Terminal.ts +++ b/src/headless/Terminal.ts @@ -25,7 +25,7 @@ import { DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine'; import { IBuffer } from 'common/buffer/Types'; import { CoreTerminal } from 'common/CoreTerminal'; import { IMarker, ITerminalOptions } from 'common/Types'; -import { Emitter, Event } from 'common/Event'; +import { Emitter, EventUtils } from 'common/Event'; export class Terminal extends CoreTerminal { private readonly _onBell = this._register(new Emitter()); @@ -49,11 +49,11 @@ export class Terminal extends CoreTerminal { // Setup InputHandler listeners this._register(this._inputHandler.onRequestBell(() => this.bell())); this._register(this._inputHandler.onRequestReset(() => this.reset())); - this._register(Event.forward(this._inputHandler.onCursorMove, this._onCursorMove)); - this._register(Event.forward(this._inputHandler.onTitleChange, this._onTitleChange)); - this._register(Event.forward(this._inputHandler.onA11yChar, this._onA11yCharEmitter)); - this._register(Event.forward(this._inputHandler.onA11yTab, this._onA11yTabEmitter)); - this._register(Event.forward(Event.map(this._inputHandler.onRequestRefreshRows, e => ({ start: e?.start ?? 0, end: e?.end ?? this.rows - 1 })), this._onRender)); + this._register(EventUtils.forward(this._inputHandler.onCursorMove, this._onCursorMove)); + this._register(EventUtils.forward(this._inputHandler.onTitleChange, this._onTitleChange)); + this._register(EventUtils.forward(this._inputHandler.onA11yChar, this._onA11yCharEmitter)); + this._register(EventUtils.forward(this._inputHandler.onA11yTab, this._onA11yTabEmitter)); + this._register(EventUtils.forward(EventUtils.map(this._inputHandler.onRequestRefreshRows, e => ({ start: e?.start ?? 0, end: e?.end ?? this.rows - 1 })), this._onRender)); } /** diff --git a/src/headless/public/Terminal.ts b/src/headless/public/Terminal.ts index 17b143fa..cdb94180 100644 --- a/src/headless/public/Terminal.ts +++ b/src/headless/public/Terminal.ts @@ -11,7 +11,7 @@ import { Terminal as TerminalCore } from 'headless/Terminal'; import { AddonManager } from 'common/public/AddonManager'; import { ITerminalOptions } from 'common/Types'; import { Disposable } from 'common/Lifecycle'; -import type { Event } from 'common/Event'; +import type { IEvent } from 'common/Event'; /** * The set of options that only have an effect when set in the Terminal constructor. */ @@ -72,16 +72,16 @@ export class Terminal extends Disposable implements ITerminalApi { } } - public get onBell(): Event { return this._core.onBell; } - public get onBinary(): Event { return this._core.onBinary; } - public get onCursorMove(): Event { return this._core.onCursorMove; } - public get onData(): Event { return this._core.onData; } - public get onLineFeed(): Event { return this._core.onLineFeed; } - public get onRender(): Event<{ start: number, end: number }> { return this._core.onRender; } - public get onResize(): Event<{ cols: number, rows: number }> { return this._core.onResize; } - public get onScroll(): Event { return this._core.onScroll; } - public get onTitleChange(): Event { return this._core.onTitleChange; } - public get onWriteParsed(): Event { return this._core.onWriteParsed; } + public get onBell(): IEvent { return this._core.onBell; } + public get onBinary(): IEvent { return this._core.onBinary; } + public get onCursorMove(): IEvent { return this._core.onCursorMove; } + public get onData(): IEvent { return this._core.onData; } + public get onLineFeed(): IEvent { return this._core.onLineFeed; } + public get onRender(): IEvent<{ start: number, end: number }> { return this._core.onRender; } + public get onResize(): IEvent<{ cols: number, rows: number }> { return this._core.onResize; } + public get onScroll(): IEvent { return this._core.onScroll; } + public get onTitleChange(): IEvent { return this._core.onTitleChange; } + public get onWriteParsed(): IEvent { return this._core.onWriteParsed; } public get parser(): IParser { if (!this._parser) { From b04d816d8a2c31b318c6e040c177b4ec1cb6f17f Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 30 Jan 2026 06:32:49 -0800 Subject: [PATCH 4/4] Undo changes to headless/package.json --- headless/package.json | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/headless/package.json b/headless/package.json index fda5eae6..6ca8d387 100644 --- a/headless/package.json +++ b/headless/package.json @@ -3,13 +3,15 @@ "description": "A headless terminal component that runs in Node.js", "version": "6.0.0", "main": "lib-headless/xterm-headless.js", - "module": "lib/xterm.mjs", + "module": "lib-headless/xterm-headless.mjs", "types": "typings/xterm-headless.d.ts", + "exports": { + "types": "./typings/xterm-headless.d.ts", + "import": "./lib-headless/xterm-headless.mjs", + "require": "./lib-headless/xterm-headless.js" + }, "repository": "https://github.com/xtermjs/xterm.js", "license": "MIT", - "workspaces": [ - "addons/*" - ], "keywords": [ "cli", "command-line", @@ -25,4 +27,4 @@ "webgl", "xterm" ] -} \ No newline at end of file +}