From 32da1d81d5d5a4a877d0222216a190deb2ecb73d Mon Sep 17 00:00:00 2001 From: tisilent Date: Mon, 21 Aug 2023 19:09:02 +0800 Subject: [PATCH 01/73] Use variants for underline dotted. webgl --- .../xterm-addon-canvas/src/BaseRenderLayer.ts | 4 +- addons/xterm-addon-webgl/src/GlyphRenderer.ts | 10 ++-- addons/xterm-addon-webgl/src/WebglAddon.ts | 4 +- addons/xterm-addon-webgl/src/WebglRenderer.ts | 46 +++++++++++++-- src/browser/renderer/shared/TextureAtlas.ts | 59 +++++++++++++------ src/browser/renderer/shared/Types.d.ts | 6 +- src/common/MultiKeyMap.ts | 19 ++++++ src/common/buffer/Constants.ts | 9 ++- 8 files changed, 123 insertions(+), 34 deletions(-) diff --git a/addons/xterm-addon-canvas/src/BaseRenderLayer.ts b/addons/xterm-addon-canvas/src/BaseRenderLayer.ts index ff29bbf1..30f6263c 100644 --- a/addons/xterm-addon-canvas/src/BaseRenderLayer.ts +++ b/addons/xterm-addon-canvas/src/BaseRenderLayer.ts @@ -375,9 +375,9 @@ export abstract class BaseRenderLayer extends Disposable implements IRenderLayer let glyph: IRasterizedGlyph; if (chars && chars.length > 1) { - glyph = this._charAtlas.getRasterizedGlyphCombinedChar(chars, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, true); + glyph = this._charAtlas.getRasterizedGlyphCombinedChar(chars, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, 0, true); } else { - glyph = this._charAtlas.getRasterizedGlyph(cell.getCode() || WHITESPACE_CELL_CODE, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, true); + glyph = this._charAtlas.getRasterizedGlyph(cell.getCode() || WHITESPACE_CELL_CODE, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, 0, true); } if (!glyph.size.x || !glyph.size.y) { return; diff --git a/addons/xterm-addon-webgl/src/GlyphRenderer.ts b/addons/xterm-addon-webgl/src/GlyphRenderer.ts index 269d9374..09523a9e 100644 --- a/addons/xterm-addon-webgl/src/GlyphRenderer.ts +++ b/addons/xterm-addon-webgl/src/GlyphRenderer.ts @@ -215,15 +215,15 @@ export class GlyphRenderer extends Disposable { } @traceCall - public updateCell(x: number, y: number, code: number, bg: number, fg: number, ext: number, chars: string, lastBg: number): void { + public updateCell(x: number, y: number, code: number, bg: number, fg: number, ext: number, chars: string, lastBg: number, variantOffset: number): void { // Since this function is called for every cell (`rows*cols`), it must be very optimized. It // should not instantiate any variables unless a new glyph is drawn to the cache where the // slight slowdown is acceptable for the developer ergonomics provided as it's a once of for // each glyph. - this._updateCell(this._vertices.attributes, x, y, code, bg, fg, ext, chars, lastBg); + this._updateCell(this._vertices.attributes, x, y, code, bg, fg, ext, chars, lastBg, variantOffset); } - private _updateCell(array: Float32Array, x: number, y: number, code: number | undefined, bg: number, fg: number, ext: number, chars: string, lastBg: number): void { + private _updateCell(array: Float32Array, x: number, y: number, code: number | undefined, bg: number, fg: number, ext: number, chars: string, lastBg: number, variantOffset: number): void { $i = (y * this._terminal.cols + x) * INDICES_PER_CELL; // Exit early if this is a null character, allow space character to continue as it may have @@ -239,9 +239,9 @@ export class GlyphRenderer extends Disposable { // Get the glyph if (chars && chars.length > 1) { - $glyph = this._atlas.getRasterizedGlyphCombinedChar(chars, bg, fg, ext, false); + $glyph = this._atlas.getRasterizedGlyphCombinedChar(chars, bg, fg, ext, variantOffset, false); } else { - $glyph = this._atlas.getRasterizedGlyph(code, bg, fg, ext, false); + $glyph = this._atlas.getRasterizedGlyph(code, bg, fg, ext, variantOffset, false); } $leftCellPadding = Math.floor((this._dimensions.device.cell.width - this._dimensions.device.char.width) / 2); diff --git a/addons/xterm-addon-webgl/src/WebglAddon.ts b/addons/xterm-addon-webgl/src/WebglAddon.ts index 3e091f0b..9e961cc6 100644 --- a/addons/xterm-addon-webgl/src/WebglAddon.ts +++ b/addons/xterm-addon-webgl/src/WebglAddon.ts @@ -8,7 +8,7 @@ import { ITerminal } from 'browser/Types'; import { EventEmitter, 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 { ICoreService, IDecorationService, ILogService, IOptionsService, IUnicodeService } from 'common/services/Services'; import { ITerminalAddon, Terminal } from 'xterm'; import { WebglRenderer } from './WebglRenderer'; import { setTraceLogger } from 'common/services/LogService'; @@ -54,6 +54,7 @@ export class WebglAddon extends Disposable implements ITerminalAddon { const decorationService: IDecorationService = unsafeCore._decorationService; const logService: ILogService = unsafeCore._logService; const themeService: IThemeService = unsafeCore._themeService; + const unicodeService: IUnicodeService = unsafeCore.unicodeService; // Set trace logger just in case it hasn't been yet which could happen when the addon is // bundled separately to the core module @@ -68,6 +69,7 @@ export class WebglAddon extends Disposable implements ITerminalAddon { decorationService, optionsService, themeService, + unicodeService, this._preserveDrawingBuffer )); this.register(forwardEvent(this._renderer.onContextLoss, this._onContextLoss)); diff --git a/addons/xterm-addon-webgl/src/WebglRenderer.ts b/addons/xterm-addon-webgl/src/WebglRenderer.ts index ae770410..2091347c 100644 --- a/addons/xterm-addon-webgl/src/WebglRenderer.ts +++ b/addons/xterm-addon-webgl/src/WebglRenderer.ts @@ -14,10 +14,10 @@ import { ICharacterJoinerService, ICharSizeService, ICoreBrowserService, IThemeS import { ITerminal } from 'browser/Types'; import { AttributeData } from 'common/buffer/AttributeData'; import { CellData } from 'common/buffer/CellData'; -import { Attributes, Content, NULL_CELL_CHAR, NULL_CELL_CODE } from 'common/buffer/Constants'; +import { Attributes, Content, ExtFlags, NULL_CELL_CHAR, NULL_CELL_CODE, UnderlineStyle } from 'common/buffer/Constants'; import { EventEmitter, forwardEvent } from 'common/EventEmitter'; import { Disposable, MutableDisposable, getDisposeArrayDisposable, toDisposable } from 'common/Lifecycle'; -import { ICoreService, IDecorationService, ILogService, IOptionsService } from 'common/services/Services'; +import { ICoreService, IDecorationService, ILogService, IOptionsService, IUnicodeService } from 'common/services/Services'; import { CharData, IBufferLine, ICellData } from 'common/Types'; import { IDisposable, Terminal } from 'xterm'; import { GlyphRenderer } from './GlyphRenderer'; @@ -71,6 +71,7 @@ export class WebglRenderer extends Disposable implements IRenderer { private readonly _decorationService: IDecorationService, private readonly _optionsService: IOptionsService, private readonly _themeService: IThemeService, + private readonly _unicodeService: IUnicodeService, preserveDrawingBuffer?: boolean ) { super(); @@ -395,6 +396,7 @@ export class WebglRenderer extends Disposable implements IRenderer { let i: number; let x: number; let j: number; + let variantOffset: number = -1; start = clamp(start, terminal.rows - 1, 0); end = clamp(end, terminal.rows - 1, 0); @@ -409,11 +411,18 @@ export class WebglRenderer extends Disposable implements IRenderer { this._model.cursor = undefined; let modelUpdated = false; + const fontSize = this._optionsService.rawOptions.fontSize; + const drp = this._coreBrowserService.dpr; + const lineWidth = Math.max(1, Math.floor(fontSize * drp / 15)); + const deviceCellWidth = this._charAtlas?.getDeviceCellWidth(); + for (y = start; y <= end; y++) { row = y + terminal.buffer.ydisp; line = terminal.buffer.lines.get(row)!; this._model.lineLengths[y] = 0; joinedRanges = this._characterJoinerService.getJoinedCharacters(row); + // row start variant init + variantOffset = 0; for (x = 0; x < terminal.cols; x++) { lastBg = this._cellColorResolver.result.bg; line.loadCell(x, cell); @@ -447,6 +456,14 @@ export class WebglRenderer extends Disposable implements IRenderer { chars = cell.getChars(); code = cell.getCode(); + + let chWidth: number; + if (typeof code === 'number') { + chWidth = this._unicodeService.wcwidth(code); + } else { + chWidth = this._unicodeService.getStringCellWidth(code); + } + i = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL; // Load colors/resolve overrides into work colors @@ -480,13 +497,27 @@ export class WebglRenderer extends Disposable implements IRenderer { if (code !== NULL_CELL_CODE) { this._model.lineLengths[y] = x + 1; + } else { + if (cell.extended.underlineStyle !== UnderlineStyle.DOTTED) { + variantOffset = 0; + } } + this._cellColorResolver.result.ext &= ~ExtFlags.VARIANT_OFFSET; + this._cellColorResolver.result.ext |= (variantOffset << 29) & ExtFlags.VARIANT_OFFSET; + // Nothing has changed, no updates needed if (this._model.cells[i] === code && this._model.cells[i + RENDER_MODEL_BG_OFFSET] === this._cellColorResolver.result.bg && this._model.cells[i + RENDER_MODEL_FG_OFFSET] === this._cellColorResolver.result.fg && this._model.cells[i + RENDER_MODEL_EXT_OFFSET] === this._cellColorResolver.result.ext) { + if (cell.extended.underlineStyle === UnderlineStyle.DOTTED) { + if (code !== NULL_CELL_CODE) { + variantOffset = ((deviceCellWidth! * chWidth) - ((lineWidth * 2) - variantOffset)) % (lineWidth * 2); + } + } else { + variantOffset = 0; + } continue; } @@ -503,7 +534,14 @@ export class WebglRenderer extends Disposable implements IRenderer { this._model.cells[i + RENDER_MODEL_FG_OFFSET] = this._cellColorResolver.result.fg; this._model.cells[i + RENDER_MODEL_EXT_OFFSET] = this._cellColorResolver.result.ext; - this._glyphRenderer!.updateCell(x, y, code, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, chars, lastBg); + this._glyphRenderer!.updateCell(x, y, code, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, chars, lastBg, variantOffset); + if (cell.extended.underlineStyle === UnderlineStyle.DOTTED) { + if (code !== NULL_CELL_CODE) { + variantOffset = ((deviceCellWidth! * chWidth) - ((lineWidth * 2) - variantOffset)) % (lineWidth * 2); + } + } else { + variantOffset = 0; + } if (isJoined) { // Restore work cell @@ -512,7 +550,7 @@ export class WebglRenderer extends Disposable implements IRenderer { // Null out non-first cells for (x++; x < lastCharX; x++) { j = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL; - this._glyphRenderer!.updateCell(x, y, NULL_CELL_CODE, 0, 0, 0, NULL_CELL_CHAR, 0); + this._glyphRenderer!.updateCell(x, y, NULL_CELL_CODE, 0, 0, 0, NULL_CELL_CHAR, 0, 0); this._model.cells[j] = NULL_CELL_CODE; this._model.cells[j + RENDER_MODEL_BG_OFFSET] = this._cellColorResolver.result.bg; this._model.cells[j + RENDER_MODEL_FG_OFFSET] = this._cellColorResolver.result.fg; diff --git a/src/browser/renderer/shared/TextureAtlas.ts b/src/browser/renderer/shared/TextureAtlas.ts index 3ee21519..bc8fd2dc 100644 --- a/src/browser/renderer/shared/TextureAtlas.ts +++ b/src/browser/renderer/shared/TextureAtlas.ts @@ -11,7 +11,7 @@ import { color, NULL_COLOR, rgba } from 'common/Color'; import { tryDrawCustomChar } from 'browser/renderer/shared/CustomGlyphs'; import { excludeFromContrastRatioDemands, isPowerlineGlyph, isRestrictedPowerlineGlyph, throwIfFalsy } from 'browser/renderer/shared/RendererUtils'; import { IUnicodeService } from 'common/services/Services'; -import { FourKeyMap } from 'common/MultiKeyMap'; +import { FiveKeyMap } from 'common/MultiKeyMap'; import { IdleTaskQueue } from 'common/TaskQueue'; import { IBoundingBox, ICharAtlasConfig, IRasterizedGlyph, IRequestRedrawEvent, ITextureAtlas } from 'browser/renderer/shared/Types'; import { EventEmitter } from 'common/EventEmitter'; @@ -58,8 +58,8 @@ let $glyph = undefined; export class TextureAtlas implements ITextureAtlas { private _didWarmUp: boolean = false; - private _cacheMap: FourKeyMap = new FourKeyMap(); - private _cacheMapCombined: FourKeyMap = new FourKeyMap(); + private _cacheMap: FiveKeyMap = new FiveKeyMap(); + private _cacheMapCombined: FiveKeyMap = new FiveKeyMap(); // The texture that the atlas is drawn to private _pages: AtlasPage[] = []; @@ -121,9 +121,9 @@ export class TextureAtlas implements ITextureAtlas { const queue = new IdleTaskQueue(); for (let i = 33; i < 126; i++) { queue.enqueue(() => { - if (!this._cacheMap.get(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT)) { - const rasterizedGlyph = this._drawToCache(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT); - this._cacheMap.set(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT, rasterizedGlyph); + if (!this._cacheMap.get(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT, 1)) { + const rasterizedGlyph = this._drawToCache(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT, 0); + this._cacheMap.set(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT, 1, rasterizedGlyph); } }); } @@ -244,29 +244,30 @@ export class TextureAtlas implements ITextureAtlas { } } - public getRasterizedGlyphCombinedChar(chars: string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean): IRasterizedGlyph { - return this._getFromCacheMap(this._cacheMapCombined, chars, bg, fg, ext, restrictToCellHeight); + public getRasterizedGlyphCombinedChar(chars: string, bg: number, fg: number, ext: number, variantOffset: number, restrictToCellHeight: boolean): IRasterizedGlyph { + return this._getFromCacheMap(this._cacheMapCombined, chars, bg, fg, ext, variantOffset, restrictToCellHeight); } - public getRasterizedGlyph(code: number, bg: number, fg: number, ext: number, restrictToCellHeight: boolean): IRasterizedGlyph { - return this._getFromCacheMap(this._cacheMap, code, bg, fg, ext, restrictToCellHeight); + public getRasterizedGlyph(code: number, bg: number, fg: number, ext: number, variantOffset: number, restrictToCellHeight: boolean): IRasterizedGlyph { + return this._getFromCacheMap(this._cacheMap, code, bg, fg, ext, variantOffset, restrictToCellHeight); } /** * Gets the glyphs texture coords, drawing the texture if it's not already */ private _getFromCacheMap( - cacheMap: FourKeyMap, + cacheMap: FiveKeyMap, key: string | number, bg: number, fg: number, ext: number, + variantOffset: number, restrictToCellHeight: boolean = false ): IRasterizedGlyph { - $glyph = cacheMap.get(key, bg, fg, ext); + $glyph = cacheMap.get(key, bg, fg, ext, variantOffset); if (!$glyph) { - $glyph = this._drawToCache(key, bg, fg, ext, restrictToCellHeight); - cacheMap.set(key, bg, fg, ext, $glyph); + $glyph = this._drawToCache(key, bg, fg, ext, variantOffset, restrictToCellHeight); + cacheMap.set(key, bg, fg, ext, variantOffset, $glyph); } return $glyph; } @@ -427,7 +428,7 @@ export class TextureAtlas implements ITextureAtlas { } @traceCall - private _drawToCache(codeOrChars: number | string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean = false): IRasterizedGlyph { + private _drawToCache(codeOrChars: number | string, bg: number, fg: number, ext: number,variantOffset: number = 0, restrictToCellHeight: boolean = false): IRasterizedGlyph { const chars = typeof codeOrChars === 'number' ? String.fromCharCode(codeOrChars) : codeOrChars; // Uncomment for debugging @@ -547,6 +548,7 @@ export class TextureAtlas implements ITextureAtlas { const yTop = Math.ceil(padding + this._config.deviceCharHeight) - yOffset - (restrictToCellHeight ? lineWidth * 2 : 0); const yMid = yTop + lineWidth; const yBot = yTop + lineWidth * 2; + let nextOffset = variantOffset; for (let i = 0; i < chWidth; i++) { this._tmpCtx.save(); @@ -596,9 +598,26 @@ export class TextureAtlas implements ITextureAtlas { ); break; case UnderlineStyle.DOTTED: - this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]); - this._tmpCtx.moveTo(xChLeft, yTop); - this._tmpCtx.lineTo(xChRight, yTop); + const offsetWidth = nextOffset >= lineWidth ? lineWidth * 2 - nextOffset : lineWidth - nextOffset; + if (offsetWidth === 0) { + this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]); + this._tmpCtx.moveTo(xChLeft, yTop); + this._tmpCtx.lineTo(xChRight, yTop); + } else { + const isFull = nextOffset >= lineWidth ? false : true; + if (isFull === false) { + this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]); + this._tmpCtx.moveTo(xChLeft + offsetWidth, yTop); + this._tmpCtx.lineTo(xChRight, yTop); + } else { + this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]); + this._tmpCtx.moveTo(xChLeft, yTop); + this._tmpCtx.lineTo(xChLeft + offsetWidth, yTop); + this._tmpCtx.moveTo(xChLeft + offsetWidth + lineWidth, yTop); + this._tmpCtx.lineTo(xChRight, yTop); + } + } + nextOffset = (xChRight - xChLeft - ((lineWidth * 2) - nextOffset)) % (Math.round(lineWidth) * 2); break; case UnderlineStyle.DASHED: this._tmpCtx.setLineDash([this._config.devicePixelRatio * 4, this._config.devicePixelRatio * 3]); @@ -940,6 +959,10 @@ export class TextureAtlas implements ITextureAtlas { } }; } + + public getDeviceCellWidth(): number { + return this._config.deviceCellWidth; + } } class AtlasPage { diff --git a/src/browser/renderer/shared/Types.d.ts b/src/browser/renderer/shared/Types.d.ts index a7e55e72..be910e37 100644 --- a/src/browser/renderer/shared/Types.d.ts +++ b/src/browser/renderer/shared/Types.d.ts @@ -103,12 +103,14 @@ export interface ITextureAtlas extends IDisposable { */ beginFrame(): boolean; + getDeviceCellWidth(): number; + /** * Clear all glyphs from the texture atlas. */ clearTexture(): void; - getRasterizedGlyph(code: number, bg: number, fg: number, ext: number, restrictToCellHeight: boolean): IRasterizedGlyph; - getRasterizedGlyphCombinedChar(chars: string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean): IRasterizedGlyph; + getRasterizedGlyph(code: number, bg: number, fg: number, ext: number, variantOffset: number, restrictToCellHeight: boolean): IRasterizedGlyph; + getRasterizedGlyphCombinedChar(chars: string, bg: number, fg: number, ext: number, variantOffset: number, restrictToCellHeight: boolean): IRasterizedGlyph; } /** diff --git a/src/common/MultiKeyMap.ts b/src/common/MultiKeyMap.ts index 6287a8f2..edd5abb5 100644 --- a/src/common/MultiKeyMap.ts +++ b/src/common/MultiKeyMap.ts @@ -40,3 +40,22 @@ export class FourKeyMap { + private _data: { [bg: string | number]: FourKeyMap | undefined } = {}; + + public set(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, five: TFive, value: TValue): void { + if (!this._data[first]) { + this._data[first] = new FourKeyMap(); + } + this._data[first as string | number]!.set(second, third, fourth, five, value); + } + + public get(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, five: TFive): TValue | undefined { + return this._data[first as string | number] ? this._data[first as string | number]?.get(second, third, fourth, five) : undefined; + } + + public clear(): void { + this._data = {}; + } +} diff --git a/src/common/buffer/Constants.ts b/src/common/buffer/Constants.ts index f6a31be7..3bfd850a 100644 --- a/src/common/buffer/Constants.ts +++ b/src/common/buffer/Constants.ts @@ -134,9 +134,14 @@ export const enum BgFlags { export const enum ExtFlags { /** - * bit 27..32 (upper 3 unused) + * bit 27..29 */ - UNDERLINE_STYLE = 0x1C000000 + UNDERLINE_STYLE = 0x1C000000, + + /** + * bit 30..32 + */ + VARIANT_OFFSET = 0xE0000000 } export const enum UnderlineStyle { From cb175e513dd7afdef70f1d2879afb915eabfdb1f Mon Sep 17 00:00:00 2001 From: tisilent Date: Mon, 21 Aug 2023 19:45:38 +0800 Subject: [PATCH 02/73] Variants to Canvas. --- .../xterm-addon-canvas/src/BaseRenderLayer.ts | 6 +-- addons/xterm-addon-canvas/src/CanvasAddon.ts | 5 ++- .../xterm-addon-canvas/src/CanvasRenderer.ts | 7 ++-- .../xterm-addon-canvas/src/TextRenderLayer.ts | 38 ++++++++++++++++--- 4 files changed, 43 insertions(+), 13 deletions(-) diff --git a/addons/xterm-addon-canvas/src/BaseRenderLayer.ts b/addons/xterm-addon-canvas/src/BaseRenderLayer.ts index 30f6263c..4622ab42 100644 --- a/addons/xterm-addon-canvas/src/BaseRenderLayer.ts +++ b/addons/xterm-addon-canvas/src/BaseRenderLayer.ts @@ -365,7 +365,7 @@ export abstract class BaseRenderLayer extends Disposable implements IRenderLayer * Draws one or more characters at a cell. If possible this will draw using * the character atlas to reduce draw time. */ - protected _drawChars(cell: ICellData, x: number, y: number): void { + protected _drawChars(cell: ICellData, x: number, y: number, variantOffset: number = 0): void { const chars = cell.getChars(); this._cellColorResolver.resolve(cell, x, this._bufferService.buffer.ydisp + y); @@ -375,9 +375,9 @@ export abstract class BaseRenderLayer extends Disposable implements IRenderLayer let glyph: IRasterizedGlyph; if (chars && chars.length > 1) { - glyph = this._charAtlas.getRasterizedGlyphCombinedChar(chars, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, 0, true); + glyph = this._charAtlas.getRasterizedGlyphCombinedChar(chars, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, variantOffset, true); } else { - glyph = this._charAtlas.getRasterizedGlyph(cell.getCode() || WHITESPACE_CELL_CODE, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, 0, true); + glyph = this._charAtlas.getRasterizedGlyph(cell.getCode() || WHITESPACE_CELL_CODE, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, variantOffset, true); } if (!glyph.size.x || !glyph.size.y) { return; diff --git a/addons/xterm-addon-canvas/src/CanvasAddon.ts b/addons/xterm-addon-canvas/src/CanvasAddon.ts index d6136174..f796cedc 100644 --- a/addons/xterm-addon-canvas/src/CanvasAddon.ts +++ b/addons/xterm-addon-canvas/src/CanvasAddon.ts @@ -6,7 +6,7 @@ import { ICharacterJoinerService, ICharSizeService, ICoreBrowserService, IRenderService, ISelectionService, IThemeService } from 'browser/services/Services'; import { ITerminal } from 'browser/Types'; import { CanvasRenderer } from './CanvasRenderer'; -import { IBufferService, ICoreService, IDecorationService, IOptionsService } from 'common/services/Services'; +import { IBufferService, ICoreService, IDecorationService, IOptionsService, IUnicodeService } from 'common/services/Services'; import { ITerminalAddon, Terminal } from 'xterm'; import { EventEmitter, forwardEvent } from 'common/EventEmitter'; import { Disposable, toDisposable } from 'common/Lifecycle'; @@ -45,8 +45,9 @@ export class CanvasAddon extends Disposable implements ITerminalAddon { const coreBrowserService: ICoreBrowserService = unsafeCore._coreBrowserService; const decorationService: IDecorationService = unsafeCore._decorationService; const themeService: IThemeService = unsafeCore._themeService; + const unicodeService: IUnicodeService = unsafeCore.unicodeService; - this._renderer = new CanvasRenderer(terminal, screenElement, linkifier, bufferService, charSizeService, optionsService, characterJoinerService, coreService, coreBrowserService, decorationService, themeService); + this._renderer = new CanvasRenderer(terminal, screenElement, linkifier, bufferService, charSizeService, optionsService, characterJoinerService, coreService, coreBrowserService, decorationService, themeService, unicodeService); this.register(forwardEvent(this._renderer.onChangeTextureAtlas, this._onChangeTextureAtlas)); this.register(forwardEvent(this._renderer.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas)); renderService.setRenderer(this._renderer); diff --git a/addons/xterm-addon-canvas/src/CanvasRenderer.ts b/addons/xterm-addon-canvas/src/CanvasRenderer.ts index 2109654e..bc65c31f 100644 --- a/addons/xterm-addon-canvas/src/CanvasRenderer.ts +++ b/addons/xterm-addon-canvas/src/CanvasRenderer.ts @@ -11,7 +11,7 @@ import { ICharacterJoinerService, ICharSizeService, ICoreBrowserService, ISelect import { ILinkifier2 } from 'browser/Types'; import { EventEmitter, forwardEvent } from 'common/EventEmitter'; import { Disposable, toDisposable } from 'common/Lifecycle'; -import { IBufferService, ICoreService, IDecorationService, IOptionsService } from 'common/services/Services'; +import { IBufferService, ICoreService, IDecorationService, IOptionsService, IUnicodeService } from 'common/services/Services'; import { Terminal } from 'xterm'; import { CursorRenderLayer } from './CursorRenderLayer'; import { LinkRenderLayer } from './LinkRenderLayer'; @@ -43,12 +43,13 @@ export class CanvasRenderer extends Disposable implements IRenderer { coreService: ICoreService, private readonly _coreBrowserService: ICoreBrowserService, decorationService: IDecorationService, - private readonly _themeService: IThemeService + private readonly _themeService: IThemeService, + private readonly _unicodeService: IUnicodeService ) { super(); const allowTransparency = this._optionsService.rawOptions.allowTransparency; this._renderLayers = [ - new TextRenderLayer(this._terminal, this._screenElement, 0, allowTransparency, this._bufferService, this._optionsService, characterJoinerService, decorationService, this._coreBrowserService, _themeService), + new TextRenderLayer(this._terminal, this._screenElement, 0, allowTransparency, this._bufferService, this._optionsService, characterJoinerService, decorationService, this._coreBrowserService, _themeService, _unicodeService), new SelectionRenderLayer(this._terminal, this._screenElement, 1, this._bufferService, this._coreBrowserService, decorationService, this._optionsService, _themeService), new LinkRenderLayer(this._terminal, this._screenElement, 2, linkifier2, this._bufferService, this._optionsService, decorationService, this._coreBrowserService, _themeService), new CursorRenderLayer(this._terminal, this._screenElement, 3, this._onRequestRedraw, this._bufferService, this._optionsService, coreService, this._coreBrowserService, decorationService, _themeService) diff --git a/addons/xterm-addon-canvas/src/TextRenderLayer.ts b/addons/xterm-addon-canvas/src/TextRenderLayer.ts index 0066cc7d..802b514b 100644 --- a/addons/xterm-addon-canvas/src/TextRenderLayer.ts +++ b/addons/xterm-addon-canvas/src/TextRenderLayer.ts @@ -11,7 +11,7 @@ import { AttributeData } from 'common/buffer/AttributeData'; import { NULL_CELL_CODE, Content, UnderlineStyle } from 'common/buffer/Constants'; import { IColorSet, ReadonlyColorSet } from 'browser/Types'; import { CellData } from 'common/buffer/CellData'; -import { IOptionsService, IBufferService, IDecorationService } from 'common/services/Services'; +import { IOptionsService, IBufferService, IDecorationService, IUnicodeService } from 'common/services/Services'; import { ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { JoinedCellData } from 'browser/services/CharacterJoinerService'; import { color, css } from 'common/Color'; @@ -41,7 +41,8 @@ export class TextRenderLayer extends BaseRenderLayer { private readonly _characterJoinerService: ICharacterJoinerService, decorationService: IDecorationService, coreBrowserService: ICoreBrowserService, - themeService: IThemeService + themeService: IThemeService, + private readonly _unicodeService: IUnicodeService ) { super(terminal, container, 'text', zIndex, alpha, themeService, bufferService, optionsService, decorationService, coreBrowserService); this._state = new GridCache(); @@ -74,13 +75,20 @@ export class TextRenderLayer extends BaseRenderLayer { callback: ( cell: ICellData, x: number, - y: number + y: number, + variantOffset: number ) => void ): void { + const fontSize = this._optionsService.rawOptions.fontSize; + const drp = this._coreBrowserService.dpr; + const lineWidth = Math.max(1, Math.floor(fontSize * drp / 15)); + const deviceCellWidth = this._charAtlas?.getDeviceCellWidth(); + let variantOffset: number = -1; for (let y = firstRow; y <= lastRow; y++) { const row = y + this._bufferService.buffer.ydisp; const line = this._bufferService.buffer.lines.get(row); const joinedRanges = this._characterJoinerService.getJoinedCharacters(row); + variantOffset = 0; for (let x = 0; x < this._bufferService.cols; x++) { line!.loadCell(x, this._workCell); let cell = this._workCell; @@ -92,9 +100,20 @@ export class TextRenderLayer extends BaseRenderLayer { // The character to the left is a wide character, drawing is owned by // the char at x-1 if (cell.getWidth() === 0) { + if (cell.extended.underlineStyle !== UnderlineStyle.DOTTED) { + variantOffset = 0; + } continue; } + const code = cell.getCode(); + let chWidth: number; + if (typeof code === 'number') { + chWidth = this._unicodeService.wcwidth(code); + } else { + chWidth = this._unicodeService.getStringCellWidth(code); + } + // exit early for NULL and SP // NOTE: commented out due to #4120 (needs a more clever patch to keep things performant) // const code = cell.getCode(); @@ -148,9 +167,18 @@ export class TextRenderLayer extends BaseRenderLayer { callback( cell, x, - y + y, + variantOffset ); + if (cell.extended.underlineStyle === UnderlineStyle.DOTTED) { + if (code !== NULL_CELL_CODE) { + variantOffset = ((deviceCellWidth! * chWidth) - ((lineWidth * 2) - variantOffset)) % (lineWidth * 2); + } + } else { + variantOffset = 0; + } + x = lastCharX; } } @@ -235,7 +263,7 @@ export class TextRenderLayer extends BaseRenderLayer { } private _drawForeground(firstRow: number, lastRow: number): void { - this._forEachCell(firstRow, lastRow, (cell, x, y) => this._drawChars(cell, x, y)); + this._forEachCell(firstRow, lastRow, (cell, x, y, variantOffset) => this._drawChars(cell, x, y, variantOffset ?? 0)); } public handleGridChanged(firstRow: number, lastRow: number): void { From c81dfee43c718f86155fd44444eca6b86c40be1b Mon Sep 17 00:00:00 2001 From: tisilent Date: Mon, 21 Aug 2023 20:54:16 +0800 Subject: [PATCH 03/73] Using ext to store variants. --- .../xterm-addon-canvas/src/BaseRenderLayer.ts | 9 +++-- addons/xterm-addon-image/src/ImageStorage.ts | 8 +++++ addons/xterm-addon-webgl/src/GlyphRenderer.ts | 4 +-- src/browser/renderer/shared/TextureAtlas.ts | 33 +++++++++---------- src/browser/renderer/shared/Types.d.ts | 4 +-- src/common/Types.d.ts | 2 ++ src/common/buffer/AttributeData.ts | 13 ++++++++ 7 files changed, 49 insertions(+), 24 deletions(-) diff --git a/addons/xterm-addon-canvas/src/BaseRenderLayer.ts b/addons/xterm-addon-canvas/src/BaseRenderLayer.ts index 4622ab42..91d55353 100644 --- a/addons/xterm-addon-canvas/src/BaseRenderLayer.ts +++ b/addons/xterm-addon-canvas/src/BaseRenderLayer.ts @@ -12,7 +12,7 @@ import { createSelectionRenderModel } from 'browser/renderer/shared/SelectionRen import { ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { ReadonlyColorSet } from 'browser/Types'; import { CellData } from 'common/buffer/CellData'; -import { WHITESPACE_CELL_CODE } from 'common/buffer/Constants'; +import { ExtFlags, WHITESPACE_CELL_CODE } from 'common/buffer/Constants'; import { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services'; import { ICellData, IDisposable } from 'common/Types'; import { Terminal } from 'xterm'; @@ -369,15 +369,18 @@ export abstract class BaseRenderLayer extends Disposable implements IRenderLayer const chars = cell.getChars(); this._cellColorResolver.resolve(cell, x, this._bufferService.buffer.ydisp + y); + this._cellColorResolver.result.ext &= ~ExtFlags.VARIANT_OFFSET; + this._cellColorResolver.result.ext |= (variantOffset << 29) & ExtFlags.VARIANT_OFFSET; + if (!this._charAtlas) { return; } let glyph: IRasterizedGlyph; if (chars && chars.length > 1) { - glyph = this._charAtlas.getRasterizedGlyphCombinedChar(chars, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, variantOffset, true); + glyph = this._charAtlas.getRasterizedGlyphCombinedChar(chars, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, true); } else { - glyph = this._charAtlas.getRasterizedGlyph(cell.getCode() || WHITESPACE_CELL_CODE, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, variantOffset, true); + glyph = this._charAtlas.getRasterizedGlyph(cell.getCode() || WHITESPACE_CELL_CODE, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, true); } if (!glyph.size.x || !glyph.size.y) { return; diff --git a/addons/xterm-addon-image/src/ImageStorage.ts b/addons/xterm-addon-image/src/ImageStorage.ts index 97eef852..ef13ca11 100644 --- a/addons/xterm-addon-image/src/ImageStorage.ts +++ b/addons/xterm-addon-image/src/ImageStorage.ts @@ -53,6 +53,14 @@ class ExtendedAttrsImage implements IExtendedAttrsImage { this._ext |= value & (Attributes.CM_MASK | Attributes.RGB_MASK); } + public get underlineVarinatOffset(): number { + return (this._ext & ExtFlags.VARIANT_OFFSET) >> 29; + } + public set underlineVarinatOffset(value: number) { + this._ext &= ~ExtFlags.VARIANT_OFFSET; + this._ext |= (value << 29) & ExtFlags.VARIANT_OFFSET; + } + private _urlId: number = 0; public get urlId(): number { return this._urlId; diff --git a/addons/xterm-addon-webgl/src/GlyphRenderer.ts b/addons/xterm-addon-webgl/src/GlyphRenderer.ts index 09523a9e..cd204a1f 100644 --- a/addons/xterm-addon-webgl/src/GlyphRenderer.ts +++ b/addons/xterm-addon-webgl/src/GlyphRenderer.ts @@ -239,9 +239,9 @@ export class GlyphRenderer extends Disposable { // Get the glyph if (chars && chars.length > 1) { - $glyph = this._atlas.getRasterizedGlyphCombinedChar(chars, bg, fg, ext, variantOffset, false); + $glyph = this._atlas.getRasterizedGlyphCombinedChar(chars, bg, fg, ext, false); } else { - $glyph = this._atlas.getRasterizedGlyph(code, bg, fg, ext, variantOffset, false); + $glyph = this._atlas.getRasterizedGlyph(code, bg, fg, ext, false); } $leftCellPadding = Math.floor((this._dimensions.device.cell.width - this._dimensions.device.char.width) / 2); diff --git a/src/browser/renderer/shared/TextureAtlas.ts b/src/browser/renderer/shared/TextureAtlas.ts index bc8fd2dc..b063c14b 100644 --- a/src/browser/renderer/shared/TextureAtlas.ts +++ b/src/browser/renderer/shared/TextureAtlas.ts @@ -11,7 +11,7 @@ import { color, NULL_COLOR, rgba } from 'common/Color'; import { tryDrawCustomChar } from 'browser/renderer/shared/CustomGlyphs'; import { excludeFromContrastRatioDemands, isPowerlineGlyph, isRestrictedPowerlineGlyph, throwIfFalsy } from 'browser/renderer/shared/RendererUtils'; import { IUnicodeService } from 'common/services/Services'; -import { FiveKeyMap } from 'common/MultiKeyMap'; +import { FourKeyMap } from 'common/MultiKeyMap'; import { IdleTaskQueue } from 'common/TaskQueue'; import { IBoundingBox, ICharAtlasConfig, IRasterizedGlyph, IRequestRedrawEvent, ITextureAtlas } from 'browser/renderer/shared/Types'; import { EventEmitter } from 'common/EventEmitter'; @@ -58,8 +58,8 @@ let $glyph = undefined; export class TextureAtlas implements ITextureAtlas { private _didWarmUp: boolean = false; - private _cacheMap: FiveKeyMap = new FiveKeyMap(); - private _cacheMapCombined: FiveKeyMap = new FiveKeyMap(); + private _cacheMap: FourKeyMap = new FourKeyMap(); + private _cacheMapCombined: FourKeyMap = new FourKeyMap(); // The texture that the atlas is drawn to private _pages: AtlasPage[] = []; @@ -121,9 +121,9 @@ export class TextureAtlas implements ITextureAtlas { const queue = new IdleTaskQueue(); for (let i = 33; i < 126; i++) { queue.enqueue(() => { - if (!this._cacheMap.get(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT, 1)) { - const rasterizedGlyph = this._drawToCache(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT, 0); - this._cacheMap.set(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT, 1, rasterizedGlyph); + if (!this._cacheMap.get(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT)) { + const rasterizedGlyph = this._drawToCache(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT); + this._cacheMap.set(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT, rasterizedGlyph); } }); } @@ -244,30 +244,29 @@ export class TextureAtlas implements ITextureAtlas { } } - public getRasterizedGlyphCombinedChar(chars: string, bg: number, fg: number, ext: number, variantOffset: number, restrictToCellHeight: boolean): IRasterizedGlyph { - return this._getFromCacheMap(this._cacheMapCombined, chars, bg, fg, ext, variantOffset, restrictToCellHeight); + public getRasterizedGlyphCombinedChar(chars: string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean): IRasterizedGlyph { + return this._getFromCacheMap(this._cacheMapCombined, chars, bg, fg, ext, restrictToCellHeight); } - public getRasterizedGlyph(code: number, bg: number, fg: number, ext: number, variantOffset: number, restrictToCellHeight: boolean): IRasterizedGlyph { - return this._getFromCacheMap(this._cacheMap, code, bg, fg, ext, variantOffset, restrictToCellHeight); + public getRasterizedGlyph(code: number, bg: number, fg: number, ext: number, restrictToCellHeight: boolean): IRasterizedGlyph { + return this._getFromCacheMap(this._cacheMap, code, bg, fg, ext, restrictToCellHeight); } /** * Gets the glyphs texture coords, drawing the texture if it's not already */ private _getFromCacheMap( - cacheMap: FiveKeyMap, + cacheMap: FourKeyMap, key: string | number, bg: number, fg: number, ext: number, - variantOffset: number, restrictToCellHeight: boolean = false ): IRasterizedGlyph { - $glyph = cacheMap.get(key, bg, fg, ext, variantOffset); + $glyph = cacheMap.get(key, bg, fg, ext); if (!$glyph) { - $glyph = this._drawToCache(key, bg, fg, ext, variantOffset, restrictToCellHeight); - cacheMap.set(key, bg, fg, ext, variantOffset, $glyph); + $glyph = this._drawToCache(key, bg, fg, ext, restrictToCellHeight); + cacheMap.set(key, bg, fg, ext, $glyph); } return $glyph; } @@ -428,7 +427,7 @@ export class TextureAtlas implements ITextureAtlas { } @traceCall - private _drawToCache(codeOrChars: number | string, bg: number, fg: number, ext: number,variantOffset: number = 0, restrictToCellHeight: boolean = false): IRasterizedGlyph { + private _drawToCache(codeOrChars: number | string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean = false): IRasterizedGlyph { const chars = typeof codeOrChars === 'number' ? String.fromCharCode(codeOrChars) : codeOrChars; // Uncomment for debugging @@ -548,7 +547,7 @@ export class TextureAtlas implements ITextureAtlas { const yTop = Math.ceil(padding + this._config.deviceCharHeight) - yOffset - (restrictToCellHeight ? lineWidth * 2 : 0); const yMid = yTop + lineWidth; const yBot = yTop + lineWidth * 2; - let nextOffset = variantOffset; + let nextOffset = this._workAttributeData.getUnderlineVarinatOffset(); for (let i = 0; i < chWidth; i++) { this._tmpCtx.save(); diff --git a/src/browser/renderer/shared/Types.d.ts b/src/browser/renderer/shared/Types.d.ts index be910e37..66affd94 100644 --- a/src/browser/renderer/shared/Types.d.ts +++ b/src/browser/renderer/shared/Types.d.ts @@ -109,8 +109,8 @@ export interface ITextureAtlas extends IDisposable { * Clear all glyphs from the texture atlas. */ clearTexture(): void; - getRasterizedGlyph(code: number, bg: number, fg: number, ext: number, variantOffset: number, restrictToCellHeight: boolean): IRasterizedGlyph; - getRasterizedGlyphCombinedChar(chars: string, bg: number, fg: number, ext: number, variantOffset: number, restrictToCellHeight: boolean): IRasterizedGlyph; + getRasterizedGlyph(code: number, bg: number, fg: number, ext: number, restrictToCellHeight: boolean): IRasterizedGlyph; + getRasterizedGlyphCombinedChar(chars: string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean): IRasterizedGlyph; } /** diff --git a/src/common/Types.d.ts b/src/common/Types.d.ts index ca9e25ff..fcd28d19 100644 --- a/src/common/Types.d.ts +++ b/src/common/Types.d.ts @@ -119,6 +119,7 @@ export interface IExtendedAttrs { ext: number; underlineStyle: UnderlineStyle; underlineColor: number; + underlineVarinatOffset: number; urlId: number; clone(): IExtendedAttrs; isEmpty(): boolean; @@ -209,6 +210,7 @@ export interface IAttributeData { isUnderlineColorPalette(): boolean; isUnderlineColorDefault(): boolean; getUnderlineStyle(): number; + getUnderlineVarinatOffset(): number; } /** Cell data */ diff --git a/src/common/buffer/AttributeData.ts b/src/common/buffer/AttributeData.ts index f4d12c2b..5333e108 100644 --- a/src/common/buffer/AttributeData.ts +++ b/src/common/buffer/AttributeData.ts @@ -126,6 +126,11 @@ export class AttributeData implements IAttributeData { ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE) : UnderlineStyle.NONE; } + public getUnderlineVarinatOffset(): number { + return this.fg & FgFlags.UNDERLINE + ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineVarinatOffset : 0) + : 0; + } } @@ -174,6 +179,14 @@ export class ExtendedAttrs implements IExtendedAttrs { this._urlId = value; } + public get underlineVarinatOffset(): number { + return (this._ext & ExtFlags.VARIANT_OFFSET) >> 29; + } + public set underlineVarinatOffset(value: number) { + this._ext &= ~ExtFlags.VARIANT_OFFSET; + this._ext |= (value << 29) & ExtFlags.VARIANT_OFFSET; + } + constructor( ext: number = 0, urlId: number = 0 From fe7f17f422096dfb1dc8ed75843faac24f532a5c Mon Sep 17 00:00:00 2001 From: tisilent Date: Tue, 22 Aug 2023 09:26:01 +0800 Subject: [PATCH 04/73] clean --- addons/xterm-addon-webgl/src/GlyphRenderer.ts | 6 +++--- src/common/MultiKeyMap.ts | 19 ------------------- 2 files changed, 3 insertions(+), 22 deletions(-) diff --git a/addons/xterm-addon-webgl/src/GlyphRenderer.ts b/addons/xterm-addon-webgl/src/GlyphRenderer.ts index cd204a1f..269d9374 100644 --- a/addons/xterm-addon-webgl/src/GlyphRenderer.ts +++ b/addons/xterm-addon-webgl/src/GlyphRenderer.ts @@ -215,15 +215,15 @@ export class GlyphRenderer extends Disposable { } @traceCall - public updateCell(x: number, y: number, code: number, bg: number, fg: number, ext: number, chars: string, lastBg: number, variantOffset: number): void { + public updateCell(x: number, y: number, code: number, bg: number, fg: number, ext: number, chars: string, lastBg: number): void { // Since this function is called for every cell (`rows*cols`), it must be very optimized. It // should not instantiate any variables unless a new glyph is drawn to the cache where the // slight slowdown is acceptable for the developer ergonomics provided as it's a once of for // each glyph. - this._updateCell(this._vertices.attributes, x, y, code, bg, fg, ext, chars, lastBg, variantOffset); + this._updateCell(this._vertices.attributes, x, y, code, bg, fg, ext, chars, lastBg); } - private _updateCell(array: Float32Array, x: number, y: number, code: number | undefined, bg: number, fg: number, ext: number, chars: string, lastBg: number, variantOffset: number): void { + private _updateCell(array: Float32Array, x: number, y: number, code: number | undefined, bg: number, fg: number, ext: number, chars: string, lastBg: number): void { $i = (y * this._terminal.cols + x) * INDICES_PER_CELL; // Exit early if this is a null character, allow space character to continue as it may have diff --git a/src/common/MultiKeyMap.ts b/src/common/MultiKeyMap.ts index edd5abb5..6287a8f2 100644 --- a/src/common/MultiKeyMap.ts +++ b/src/common/MultiKeyMap.ts @@ -40,22 +40,3 @@ export class FourKeyMap { - private _data: { [bg: string | number]: FourKeyMap | undefined } = {}; - - public set(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, five: TFive, value: TValue): void { - if (!this._data[first]) { - this._data[first] = new FourKeyMap(); - } - this._data[first as string | number]!.set(second, third, fourth, five, value); - } - - public get(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, five: TFive): TValue | undefined { - return this._data[first as string | number] ? this._data[first as string | number]?.get(second, third, fourth, five) : undefined; - } - - public clear(): void { - this._data = {}; - } -} From 5f0647f0ab2199f40125dff2d6945afbb81d4ebb Mon Sep 17 00:00:00 2001 From: tisilent Date: Tue, 22 Aug 2023 09:35:12 +0800 Subject: [PATCH 05/73] clean --- addons/xterm-addon-webgl/src/WebglRenderer.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/xterm-addon-webgl/src/WebglRenderer.ts b/addons/xterm-addon-webgl/src/WebglRenderer.ts index 2091347c..76a8a84b 100644 --- a/addons/xterm-addon-webgl/src/WebglRenderer.ts +++ b/addons/xterm-addon-webgl/src/WebglRenderer.ts @@ -534,7 +534,7 @@ export class WebglRenderer extends Disposable implements IRenderer { this._model.cells[i + RENDER_MODEL_FG_OFFSET] = this._cellColorResolver.result.fg; this._model.cells[i + RENDER_MODEL_EXT_OFFSET] = this._cellColorResolver.result.ext; - this._glyphRenderer!.updateCell(x, y, code, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, chars, lastBg, variantOffset); + this._glyphRenderer!.updateCell(x, y, code, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, chars, lastBg); if (cell.extended.underlineStyle === UnderlineStyle.DOTTED) { if (code !== NULL_CELL_CODE) { variantOffset = ((deviceCellWidth! * chWidth) - ((lineWidth * 2) - variantOffset)) % (lineWidth * 2); @@ -550,7 +550,7 @@ export class WebglRenderer extends Disposable implements IRenderer { // Null out non-first cells for (x++; x < lastCharX; x++) { j = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL; - this._glyphRenderer!.updateCell(x, y, NULL_CELL_CODE, 0, 0, 0, NULL_CELL_CHAR, 0, 0); + this._glyphRenderer!.updateCell(x, y, NULL_CELL_CODE, 0, 0, 0, NULL_CELL_CHAR, 0); this._model.cells[j] = NULL_CELL_CODE; this._model.cells[j + RENDER_MODEL_BG_OFFSET] = this._cellColorResolver.result.bg; this._model.cells[j + RENDER_MODEL_FG_OFFSET] = this._cellColorResolver.result.fg; From 1f3143cfab758a5de2ebc4e174951a2fce46639f Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 23 Aug 2023 05:07:44 -0700 Subject: [PATCH 06/73] Remove unused member --- addons/xterm-addon-canvas/src/CanvasRenderer.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/xterm-addon-canvas/src/CanvasRenderer.ts b/addons/xterm-addon-canvas/src/CanvasRenderer.ts index efadd104..0e695880 100644 --- a/addons/xterm-addon-canvas/src/CanvasRenderer.ts +++ b/addons/xterm-addon-canvas/src/CanvasRenderer.ts @@ -44,12 +44,12 @@ export class CanvasRenderer extends Disposable implements IRenderer { private readonly _coreBrowserService: ICoreBrowserService, decorationService: IDecorationService, private readonly _themeService: IThemeService, - private readonly _unicodeService: IUnicodeService + unicodeService: IUnicodeService ) { super(); const allowTransparency = this._optionsService.rawOptions.allowTransparency; this._renderLayers = [ - new TextRenderLayer(this._terminal, this._screenElement, 0, allowTransparency, this._bufferService, this._optionsService, characterJoinerService, decorationService, this._coreBrowserService, _themeService, _unicodeService), + new TextRenderLayer(this._terminal, this._screenElement, 0, allowTransparency, this._bufferService, this._optionsService, characterJoinerService, decorationService, this._coreBrowserService, _themeService, unicodeService), new SelectionRenderLayer(this._terminal, this._screenElement, 1, this._bufferService, this._coreBrowserService, decorationService, this._optionsService, _themeService), new LinkRenderLayer(this._terminal, this._screenElement, 2, linkifier2, this._bufferService, this._optionsService, decorationService, this._coreBrowserService, _themeService), new CursorRenderLayer(this._terminal, this._screenElement, 3, this._onRequestRedraw, this._bufferService, this._optionsService, coreService, this._coreBrowserService, decorationService, _themeService) From 2b0106f7e21a3d672a23b2c3feb2ebd52387991c Mon Sep 17 00:00:00 2001 From: tisilent Date: Thu, 24 Aug 2023 10:57:05 +0800 Subject: [PATCH 07/73] Logic move to CellColorResolver --- .../xterm-addon-canvas/src/BaseRenderLayer.ts | 14 +++--- addons/xterm-addon-canvas/src/CanvasAddon.ts | 2 +- .../xterm-addon-canvas/src/CanvasRenderer.ts | 6 +-- .../src/CursorRenderLayer.ts | 7 +-- .../xterm-addon-canvas/src/LinkRenderLayer.ts | 7 +-- .../src/SelectionRenderLayer.ts | 7 +-- .../xterm-addon-canvas/src/TextRenderLayer.ts | 38 +++------------- addons/xterm-addon-image/src/ImageStorage.ts | 6 ++- addons/xterm-addon-webgl/src/WebglRenderer.ts | 42 ++--------------- .../renderer/shared/CellColorResolver.ts | 45 +++++++++++++++++-- src/browser/renderer/shared/RendererUtils.ts | 4 ++ src/browser/renderer/shared/TextureAtlas.ts | 12 ++--- src/common/buffer/AttributeData.ts | 10 +++-- src/common/buffer/BufferLine.test.ts | 12 +++++ 14 files changed, 106 insertions(+), 106 deletions(-) diff --git a/addons/xterm-addon-canvas/src/BaseRenderLayer.ts b/addons/xterm-addon-canvas/src/BaseRenderLayer.ts index 91d55353..58c01527 100644 --- a/addons/xterm-addon-canvas/src/BaseRenderLayer.ts +++ b/addons/xterm-addon-canvas/src/BaseRenderLayer.ts @@ -13,7 +13,7 @@ import { ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { ReadonlyColorSet } from 'browser/Types'; import { CellData } from 'common/buffer/CellData'; import { ExtFlags, WHITESPACE_CELL_CODE } from 'common/buffer/Constants'; -import { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services'; +import { IBufferService, IDecorationService, IOptionsService, IUnicodeService } from 'common/services/Services'; import { ICellData, IDisposable } from 'common/Types'; import { Terminal } from 'xterm'; import { IRenderLayer } from './Types'; @@ -55,10 +55,11 @@ export abstract class BaseRenderLayer extends Disposable implements IRenderLayer protected readonly _bufferService: IBufferService, protected readonly _optionsService: IOptionsService, protected readonly _decorationService: IDecorationService, - protected readonly _coreBrowserService: ICoreBrowserService + protected readonly _coreBrowserService: ICoreBrowserService, + private readonly _unicodeService: IUnicodeService ) { super(); - this._cellColorResolver = new CellColorResolver(this._terminal, this._selectionModel, this._decorationService, this._coreBrowserService, this._themeService); + this._cellColorResolver = new CellColorResolver(this._terminal, this._selectionModel, this._decorationService, this._coreBrowserService, this._themeService, _unicodeService); this._canvas = document.createElement('canvas'); this._canvas.classList.add(`xterm-${id}-layer`); this._canvas.style.zIndex = zIndex.toString(); @@ -365,12 +366,9 @@ export abstract class BaseRenderLayer extends Disposable implements IRenderLayer * Draws one or more characters at a cell. If possible this will draw using * the character atlas to reduce draw time. */ - protected _drawChars(cell: ICellData, x: number, y: number, variantOffset: number = 0): void { + protected _drawChars(cell: ICellData, x: number, y: number): void { const chars = cell.getChars(); - this._cellColorResolver.resolve(cell, x, this._bufferService.buffer.ydisp + y); - - this._cellColorResolver.result.ext &= ~ExtFlags.VARIANT_OFFSET; - this._cellColorResolver.result.ext |= (variantOffset << 29) & ExtFlags.VARIANT_OFFSET; + this._cellColorResolver.resolve(cell, x, this._bufferService.buffer.ydisp + y, this._deviceCellWidth); if (!this._charAtlas) { return; diff --git a/addons/xterm-addon-canvas/src/CanvasAddon.ts b/addons/xterm-addon-canvas/src/CanvasAddon.ts index 01ce5ca7..25019f8e 100644 --- a/addons/xterm-addon-canvas/src/CanvasAddon.ts +++ b/addons/xterm-addon-canvas/src/CanvasAddon.ts @@ -54,7 +54,7 @@ export class CanvasAddon extends Disposable implements ITerminalAddon { setTraceLogger(logService); this._renderer = new CanvasRenderer(terminal, screenElement, linkifier, bufferService, charSizeService, optionsService, characterJoinerService, coreService, coreBrowserService, decorationService, themeService, unicodeService); - + this.register(forwardEvent(this._renderer.onChangeTextureAtlas, this._onChangeTextureAtlas)); this.register(forwardEvent(this._renderer.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas)); renderService.setRenderer(this._renderer); diff --git a/addons/xterm-addon-canvas/src/CanvasRenderer.ts b/addons/xterm-addon-canvas/src/CanvasRenderer.ts index bc65c31f..307dc496 100644 --- a/addons/xterm-addon-canvas/src/CanvasRenderer.ts +++ b/addons/xterm-addon-canvas/src/CanvasRenderer.ts @@ -50,9 +50,9 @@ export class CanvasRenderer extends Disposable implements IRenderer { const allowTransparency = this._optionsService.rawOptions.allowTransparency; this._renderLayers = [ new TextRenderLayer(this._terminal, this._screenElement, 0, allowTransparency, this._bufferService, this._optionsService, characterJoinerService, decorationService, this._coreBrowserService, _themeService, _unicodeService), - new SelectionRenderLayer(this._terminal, this._screenElement, 1, this._bufferService, this._coreBrowserService, decorationService, this._optionsService, _themeService), - new LinkRenderLayer(this._terminal, this._screenElement, 2, linkifier2, this._bufferService, this._optionsService, decorationService, this._coreBrowserService, _themeService), - new CursorRenderLayer(this._terminal, this._screenElement, 3, this._onRequestRedraw, this._bufferService, this._optionsService, coreService, this._coreBrowserService, decorationService, _themeService) + new SelectionRenderLayer(this._terminal, this._screenElement, 1, this._bufferService, this._coreBrowserService, decorationService, this._optionsService, _themeService, _unicodeService), + new LinkRenderLayer(this._terminal, this._screenElement, 2, linkifier2, this._bufferService, this._optionsService, decorationService, this._coreBrowserService, _themeService, _unicodeService), + new CursorRenderLayer(this._terminal, this._screenElement, 3, this._onRequestRedraw, this._bufferService, this._optionsService, coreService, this._coreBrowserService, decorationService, _themeService, _unicodeService) ]; for (const layer of this._renderLayers) { forwardEvent(layer.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas); diff --git a/addons/xterm-addon-canvas/src/CursorRenderLayer.ts b/addons/xterm-addon-canvas/src/CursorRenderLayer.ts index 2ef1d072..9e158e32 100644 --- a/addons/xterm-addon-canvas/src/CursorRenderLayer.ts +++ b/addons/xterm-addon-canvas/src/CursorRenderLayer.ts @@ -8,7 +8,7 @@ import { BaseRenderLayer } from './BaseRenderLayer'; import { ICellData } from 'common/Types'; import { CellData } from 'common/buffer/CellData'; import { IColorSet, ReadonlyColorSet } from 'browser/Types'; -import { IBufferService, IOptionsService, ICoreService, IDecorationService } from 'common/services/Services'; +import { IBufferService, IOptionsService, ICoreService, IDecorationService, IUnicodeService } from 'common/services/Services'; import { IEventEmitter } from 'common/EventEmitter'; import { ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { Terminal } from 'xterm'; @@ -45,9 +45,10 @@ export class CursorRenderLayer extends BaseRenderLayer { private readonly _coreService: ICoreService, coreBrowserService: ICoreBrowserService, decorationService: IDecorationService, - themeService: IThemeService + themeService: IThemeService, + unicodeService: IUnicodeService ) { - super(terminal, container, 'cursor', zIndex, true, themeService, bufferService, optionsService, decorationService, coreBrowserService); + super(terminal, container, 'cursor', zIndex, true, themeService, bufferService, optionsService, decorationService, coreBrowserService, unicodeService); this._state = { x: 0, y: 0, diff --git a/addons/xterm-addon-canvas/src/LinkRenderLayer.ts b/addons/xterm-addon-canvas/src/LinkRenderLayer.ts index 2d4c217c..af0482ef 100644 --- a/addons/xterm-addon-canvas/src/LinkRenderLayer.ts +++ b/addons/xterm-addon-canvas/src/LinkRenderLayer.ts @@ -8,7 +8,7 @@ import { BaseRenderLayer } from './BaseRenderLayer'; import { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants'; import { ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { IColorSet, ILinkifierEvent, ILinkifier2, ReadonlyColorSet } from 'browser/Types'; -import { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services'; +import { IBufferService, IDecorationService, IOptionsService, IUnicodeService } from 'common/services/Services'; import { is256Color } from 'browser/renderer/shared/CharAtlasUtils'; import { Terminal } from 'xterm'; @@ -24,9 +24,10 @@ export class LinkRenderLayer extends BaseRenderLayer { optionsService: IOptionsService, decorationService: IDecorationService, coreBrowserService: ICoreBrowserService, - themeService: IThemeService + themeService: IThemeService, + unicodeService: IUnicodeService ) { - super(terminal, container, 'link', zIndex, true, themeService, bufferService, optionsService, decorationService, coreBrowserService); + super(terminal, container, 'link', zIndex, true, themeService, bufferService, optionsService, decorationService, coreBrowserService, unicodeService); this.register(linkifier2.onShowLinkUnderline(e => this._handleShowLinkUnderline(e))); this.register(linkifier2.onHideLinkUnderline(e => this._handleHideLinkUnderline(e))); diff --git a/addons/xterm-addon-canvas/src/SelectionRenderLayer.ts b/addons/xterm-addon-canvas/src/SelectionRenderLayer.ts index 10950868..0e397441 100644 --- a/addons/xterm-addon-canvas/src/SelectionRenderLayer.ts +++ b/addons/xterm-addon-canvas/src/SelectionRenderLayer.ts @@ -5,7 +5,7 @@ import { IRenderDimensions } from 'browser/renderer/shared/Types'; import { BaseRenderLayer } from './BaseRenderLayer'; -import { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services'; +import { IBufferService, IDecorationService, IOptionsService, IUnicodeService } from 'common/services/Services'; import { ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { Terminal } from 'xterm'; @@ -27,9 +27,10 @@ export class SelectionRenderLayer extends BaseRenderLayer { coreBrowserService: ICoreBrowserService, decorationService: IDecorationService, optionsService: IOptionsService, - themeService: IThemeService + themeService: IThemeService, + unicodeService: IUnicodeService ) { - super(terminal, container, 'selection', zIndex, true, themeService, bufferService, optionsService, decorationService, coreBrowserService); + super(terminal, container, 'selection', zIndex, true, themeService, bufferService, optionsService, decorationService, coreBrowserService, unicodeService); this._clearState(); } diff --git a/addons/xterm-addon-canvas/src/TextRenderLayer.ts b/addons/xterm-addon-canvas/src/TextRenderLayer.ts index 802b514b..2f98f4c6 100644 --- a/addons/xterm-addon-canvas/src/TextRenderLayer.ts +++ b/addons/xterm-addon-canvas/src/TextRenderLayer.ts @@ -16,6 +16,7 @@ import { ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'bro import { JoinedCellData } from 'browser/services/CharacterJoinerService'; import { color, css } from 'common/Color'; import { Terminal } from 'xterm'; +import { computeVarinatOffset } from 'browser/renderer/shared/RendererUtils'; /** * This CharData looks like a null character, which will forc a clear and render @@ -42,9 +43,9 @@ export class TextRenderLayer extends BaseRenderLayer { decorationService: IDecorationService, coreBrowserService: ICoreBrowserService, themeService: IThemeService, - private readonly _unicodeService: IUnicodeService + unicodeService: IUnicodeService ) { - super(terminal, container, 'text', zIndex, alpha, themeService, bufferService, optionsService, decorationService, coreBrowserService); + super(terminal, container, 'text', zIndex, alpha, themeService, bufferService, optionsService, decorationService, coreBrowserService, unicodeService); this._state = new GridCache(); this.register(optionsService.onSpecificOptionChange('allowTransparency', value => this._setTransparency(value))); } @@ -75,20 +76,13 @@ export class TextRenderLayer extends BaseRenderLayer { callback: ( cell: ICellData, x: number, - y: number, - variantOffset: number + y: number ) => void ): void { - const fontSize = this._optionsService.rawOptions.fontSize; - const drp = this._coreBrowserService.dpr; - const lineWidth = Math.max(1, Math.floor(fontSize * drp / 15)); - const deviceCellWidth = this._charAtlas?.getDeviceCellWidth(); - let variantOffset: number = -1; for (let y = firstRow; y <= lastRow; y++) { const row = y + this._bufferService.buffer.ydisp; const line = this._bufferService.buffer.lines.get(row); const joinedRanges = this._characterJoinerService.getJoinedCharacters(row); - variantOffset = 0; for (let x = 0; x < this._bufferService.cols; x++) { line!.loadCell(x, this._workCell); let cell = this._workCell; @@ -100,20 +94,9 @@ export class TextRenderLayer extends BaseRenderLayer { // The character to the left is a wide character, drawing is owned by // the char at x-1 if (cell.getWidth() === 0) { - if (cell.extended.underlineStyle !== UnderlineStyle.DOTTED) { - variantOffset = 0; - } continue; } - const code = cell.getCode(); - let chWidth: number; - if (typeof code === 'number') { - chWidth = this._unicodeService.wcwidth(code); - } else { - chWidth = this._unicodeService.getStringCellWidth(code); - } - // exit early for NULL and SP // NOTE: commented out due to #4120 (needs a more clever patch to keep things performant) // const code = cell.getCode(); @@ -167,18 +150,9 @@ export class TextRenderLayer extends BaseRenderLayer { callback( cell, x, - y, - variantOffset + y ); - if (cell.extended.underlineStyle === UnderlineStyle.DOTTED) { - if (code !== NULL_CELL_CODE) { - variantOffset = ((deviceCellWidth! * chWidth) - ((lineWidth * 2) - variantOffset)) % (lineWidth * 2); - } - } else { - variantOffset = 0; - } - x = lastCharX; } } @@ -263,7 +237,7 @@ export class TextRenderLayer extends BaseRenderLayer { } private _drawForeground(firstRow: number, lastRow: number): void { - this._forEachCell(firstRow, lastRow, (cell, x, y, variantOffset) => this._drawChars(cell, x, y, variantOffset ?? 0)); + this._forEachCell(firstRow, lastRow, (cell, x, y) => this._drawChars(cell, x, y)); } public handleGridChanged(firstRow: number, lastRow: number): void { diff --git a/addons/xterm-addon-image/src/ImageStorage.ts b/addons/xterm-addon-image/src/ImageStorage.ts index ef13ca11..86d48a6d 100644 --- a/addons/xterm-addon-image/src/ImageStorage.ts +++ b/addons/xterm-addon-image/src/ImageStorage.ts @@ -54,7 +54,11 @@ class ExtendedAttrsImage implements IExtendedAttrsImage { } public get underlineVarinatOffset(): number { - return (this._ext & ExtFlags.VARIANT_OFFSET) >> 29; + const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29; + if (val < 0) { + return val ^ 4294967288; + } + return val; } public set underlineVarinatOffset(value: number) { this._ext &= ~ExtFlags.VARIANT_OFFSET; diff --git a/addons/xterm-addon-webgl/src/WebglRenderer.ts b/addons/xterm-addon-webgl/src/WebglRenderer.ts index 76a8a84b..31faa21e 100644 --- a/addons/xterm-addon-webgl/src/WebglRenderer.ts +++ b/addons/xterm-addon-webgl/src/WebglRenderer.ts @@ -14,7 +14,7 @@ import { ICharacterJoinerService, ICharSizeService, ICoreBrowserService, IThemeS import { ITerminal } from 'browser/Types'; import { AttributeData } from 'common/buffer/AttributeData'; import { CellData } from 'common/buffer/CellData'; -import { Attributes, Content, ExtFlags, NULL_CELL_CHAR, NULL_CELL_CODE, UnderlineStyle } from 'common/buffer/Constants'; +import { Attributes, Content, NULL_CELL_CHAR, NULL_CELL_CODE, UnderlineStyle } from 'common/buffer/Constants'; import { EventEmitter, forwardEvent } from 'common/EventEmitter'; import { Disposable, MutableDisposable, getDisposeArrayDisposable, toDisposable } from 'common/Lifecycle'; import { ICoreService, IDecorationService, ILogService, IOptionsService, IUnicodeService } from 'common/services/Services'; @@ -78,7 +78,7 @@ export class WebglRenderer extends Disposable implements IRenderer { this.register(this._themeService.onChangeColors(() => this._handleColorChange())); - this._cellColorResolver = new CellColorResolver(this._terminal, this._model.selection, this._decorationService, this._coreBrowserService, this._themeService); + this._cellColorResolver = new CellColorResolver(this._terminal, this._model.selection, this._decorationService, this._coreBrowserService, this._themeService, this._unicodeService); this._core = (this._terminal as any)._core; @@ -396,7 +396,6 @@ export class WebglRenderer extends Disposable implements IRenderer { let i: number; let x: number; let j: number; - let variantOffset: number = -1; start = clamp(start, terminal.rows - 1, 0); end = clamp(end, terminal.rows - 1, 0); @@ -411,18 +410,11 @@ export class WebglRenderer extends Disposable implements IRenderer { this._model.cursor = undefined; let modelUpdated = false; - const fontSize = this._optionsService.rawOptions.fontSize; - const drp = this._coreBrowserService.dpr; - const lineWidth = Math.max(1, Math.floor(fontSize * drp / 15)); - const deviceCellWidth = this._charAtlas?.getDeviceCellWidth(); - for (y = start; y <= end; y++) { row = y + terminal.buffer.ydisp; line = terminal.buffer.lines.get(row)!; this._model.lineLengths[y] = 0; joinedRanges = this._characterJoinerService.getJoinedCharacters(row); - // row start variant init - variantOffset = 0; for (x = 0; x < terminal.cols; x++) { lastBg = this._cellColorResolver.result.bg; line.loadCell(x, cell); @@ -457,17 +449,10 @@ export class WebglRenderer extends Disposable implements IRenderer { chars = cell.getChars(); code = cell.getCode(); - let chWidth: number; - if (typeof code === 'number') { - chWidth = this._unicodeService.wcwidth(code); - } else { - chWidth = this._unicodeService.getStringCellWidth(code); - } - i = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL; // Load colors/resolve overrides into work colors - this._cellColorResolver.resolve(cell, x, row); + this._cellColorResolver.resolve(cell, x, row, this.dimensions.device.cell.width); // Override colors for cursor cell if (isCursorVisible && row === cursorY) { @@ -497,27 +482,13 @@ export class WebglRenderer extends Disposable implements IRenderer { if (code !== NULL_CELL_CODE) { this._model.lineLengths[y] = x + 1; - } else { - if (cell.extended.underlineStyle !== UnderlineStyle.DOTTED) { - variantOffset = 0; - } } - this._cellColorResolver.result.ext &= ~ExtFlags.VARIANT_OFFSET; - this._cellColorResolver.result.ext |= (variantOffset << 29) & ExtFlags.VARIANT_OFFSET; - // Nothing has changed, no updates needed if (this._model.cells[i] === code && this._model.cells[i + RENDER_MODEL_BG_OFFSET] === this._cellColorResolver.result.bg && this._model.cells[i + RENDER_MODEL_FG_OFFSET] === this._cellColorResolver.result.fg && this._model.cells[i + RENDER_MODEL_EXT_OFFSET] === this._cellColorResolver.result.ext) { - if (cell.extended.underlineStyle === UnderlineStyle.DOTTED) { - if (code !== NULL_CELL_CODE) { - variantOffset = ((deviceCellWidth! * chWidth) - ((lineWidth * 2) - variantOffset)) % (lineWidth * 2); - } - } else { - variantOffset = 0; - } continue; } @@ -535,13 +506,6 @@ export class WebglRenderer extends Disposable implements IRenderer { this._model.cells[i + RENDER_MODEL_EXT_OFFSET] = this._cellColorResolver.result.ext; this._glyphRenderer!.updateCell(x, y, code, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, chars, lastBg); - if (cell.extended.underlineStyle === UnderlineStyle.DOTTED) { - if (code !== NULL_CELL_CODE) { - variantOffset = ((deviceCellWidth! * chWidth) - ((lineWidth * 2) - variantOffset)) % (lineWidth * 2); - } - } else { - variantOffset = 0; - } if (isJoined) { // Restore work cell diff --git a/src/browser/renderer/shared/CellColorResolver.ts b/src/browser/renderer/shared/CellColorResolver.ts index ae5019e2..b034832f 100644 --- a/src/browser/renderer/shared/CellColorResolver.ts +++ b/src/browser/renderer/shared/CellColorResolver.ts @@ -1,8 +1,9 @@ +import { computeVarinatOffset } from 'browser/renderer/shared/RendererUtils'; import { ISelectionRenderModel } from 'browser/renderer/shared/Types'; import { ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { IColorSet, ReadonlyColorSet } from 'browser/Types'; -import { Attributes, BgFlags, FgFlags } from 'common/buffer/Constants'; -import { IDecorationService } from 'common/services/Services'; +import { Attributes, BgFlags, ExtFlags, FgFlags, NULL_CELL_CODE, UnderlineStyle } from 'common/buffer/Constants'; +import { IDecorationService, IUnicodeService } from 'common/services/Services'; import { ICellData } from 'common/Types'; import { Terminal } from 'xterm'; @@ -13,6 +14,9 @@ let $hasFg = false; let $hasBg = false; let $isSelected = false; let $colors: ReadonlyColorSet | undefined; +let $x = -1; +let $y = -1; +let $variantOffset = 0; export class CellColorResolver { /** @@ -30,7 +34,8 @@ export class CellColorResolver { private readonly _selectionRenderModel: ISelectionRenderModel, private readonly _decorationService: IDecorationService, private readonly _coreBrowserService: ICoreBrowserService, - private readonly _themeService: IThemeService + private readonly _themeService: IThemeService, + private readonly _unicodeService: IUnicodeService ) { } @@ -38,7 +43,7 @@ export class CellColorResolver { * Resolves colors for the cell, putting the result into the shared {@link result}. This resolves * overrides, inverse and selection for the cell which can then be used to feed into the renderer. */ - public resolve(cell: ICellData, x: number, y: number): void { + public resolve(cell: ICellData, x: number, y: number,deviceCellWidth: number): void { this.result.bg = cell.bg; this.result.fg = cell.fg; this.result.ext = cell.bg & BgFlags.HAS_EXTENDED ? cell.extended.ext : 0; @@ -53,6 +58,26 @@ export class CellColorResolver { $isSelected = false; $colors = this._themeService.colors; + if ($y !== y) { + $variantOffset = 0; + } + $x = x; + $y = y; + + const code = cell.getCode(); + if (code === NULL_CELL_CODE && cell.extended.underlineStyle !== UnderlineStyle.DOTTED) { + $variantOffset = 0; + } + const fontSize = this._terminal.options.fontSize; + const drp = this._coreBrowserService.dpr; + const lineWidth = Math.max(1, Math.floor(fontSize! * drp / 15)); + let chWidth: number; + if (typeof code === 'number') { + chWidth = this._unicodeService.wcwidth(code); + } else { + chWidth = this._unicodeService.getStringCellWidth(code); + } + // Apply decorations on the bottom layer this._decorationService.forEachDecorationAtCell(x, y, 'bottom', d => { if (d.backgroundColorRGB) { @@ -133,5 +158,17 @@ export class CellColorResolver { // Use the override if it exists this.result.bg = $hasBg ? $bg : this.result.bg; this.result.fg = $hasFg ? $fg : this.result.fg; + + this.result.ext &= ~ExtFlags.VARIANT_OFFSET; + this.result.ext |= ($variantOffset << 29) & ExtFlags.VARIANT_OFFSET; + + // compute next varinatOffset + if (cell.extended.underlineStyle === UnderlineStyle.DOTTED) { + if (code !== NULL_CELL_CODE) { + $variantOffset = computeVarinatOffset(deviceCellWidth * chWidth, lineWidth, $variantOffset); + } + } else { + $variantOffset = 0; + } } } diff --git a/src/browser/renderer/shared/RendererUtils.ts b/src/browser/renderer/shared/RendererUtils.ts index 052f2894..839d8701 100644 --- a/src/browser/renderer/shared/RendererUtils.ts +++ b/src/browser/renderer/shared/RendererUtils.ts @@ -56,3 +56,7 @@ function createDimension(): IDimensions { height: 0 }; } + +export function computeVarinatOffset(cellWidth: number, lineWidth: number, currentOffset: number = 0): number { + return (cellWidth - (Math.round(lineWidth) * 2 - currentOffset)) % (Math.round(lineWidth) * 2); +} diff --git a/src/browser/renderer/shared/TextureAtlas.ts b/src/browser/renderer/shared/TextureAtlas.ts index b063c14b..0f2ee018 100644 --- a/src/browser/renderer/shared/TextureAtlas.ts +++ b/src/browser/renderer/shared/TextureAtlas.ts @@ -9,7 +9,7 @@ import { IColor } from 'common/Types'; import { AttributeData } from 'common/buffer/AttributeData'; import { color, NULL_COLOR, rgba } from 'common/Color'; import { tryDrawCustomChar } from 'browser/renderer/shared/CustomGlyphs'; -import { excludeFromContrastRatioDemands, isPowerlineGlyph, isRestrictedPowerlineGlyph, throwIfFalsy } from 'browser/renderer/shared/RendererUtils'; +import { computeVarinatOffset, excludeFromContrastRatioDemands, isPowerlineGlyph, isRestrictedPowerlineGlyph, throwIfFalsy } from 'browser/renderer/shared/RendererUtils'; import { IUnicodeService } from 'common/services/Services'; import { FourKeyMap } from 'common/MultiKeyMap'; import { IdleTaskQueue } from 'common/TaskQueue'; @@ -597,14 +597,16 @@ export class TextureAtlas implements ITextureAtlas { ); break; case UnderlineStyle.DOTTED: - const offsetWidth = nextOffset >= lineWidth ? lineWidth * 2 - nextOffset : lineWidth - nextOffset; + const offsetWidth = nextOffset === 0 ? 0 : + (nextOffset >= lineWidth ? lineWidth * 2 - nextOffset : lineWidth - nextOffset); if (offsetWidth === 0) { this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]); this._tmpCtx.moveTo(xChLeft, yTop); this._tmpCtx.lineTo(xChRight, yTop); } else { - const isFull = nextOffset >= lineWidth ? false : true; - if (isFull === false) { + // a line and a gap. + const isLineStart = nextOffset >= lineWidth ? false : true; + if (isLineStart === false) { this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]); this._tmpCtx.moveTo(xChLeft + offsetWidth, yTop); this._tmpCtx.lineTo(xChRight, yTop); @@ -616,7 +618,7 @@ export class TextureAtlas implements ITextureAtlas { this._tmpCtx.lineTo(xChRight, yTop); } } - nextOffset = (xChRight - xChLeft - ((lineWidth * 2) - nextOffset)) % (Math.round(lineWidth) * 2); + nextOffset = computeVarinatOffset(xChRight - xChLeft, lineWidth, nextOffset); break; case UnderlineStyle.DASHED: this._tmpCtx.setLineDash([this._config.devicePixelRatio * 4, this._config.devicePixelRatio * 3]); diff --git a/src/common/buffer/AttributeData.ts b/src/common/buffer/AttributeData.ts index 5333e108..91c5de61 100644 --- a/src/common/buffer/AttributeData.ts +++ b/src/common/buffer/AttributeData.ts @@ -127,9 +127,7 @@ export class AttributeData implements IAttributeData { : UnderlineStyle.NONE; } public getUnderlineVarinatOffset(): number { - return this.fg & FgFlags.UNDERLINE - ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineVarinatOffset : 0) - : 0; + return this.extended.underlineVarinatOffset; } } @@ -180,7 +178,11 @@ export class ExtendedAttrs implements IExtendedAttrs { } public get underlineVarinatOffset(): number { - return (this._ext & ExtFlags.VARIANT_OFFSET) >> 29; + const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29; + if (val < 0) { + return val ^ 4294967288; + } + return val; } public set underlineVarinatOffset(value: number) { this._ext &= ~ExtFlags.VARIANT_OFFSET; diff --git a/src/common/buffer/BufferLine.test.ts b/src/common/buffer/BufferLine.test.ts index 111aae03..3e115b4b 100644 --- a/src/common/buffer/BufferLine.test.ts +++ b/src/common/buffer/BufferLine.test.ts @@ -119,6 +119,18 @@ describe('AttributeData', () => { attrs.fg &= ~FgFlags.UNDERLINE; assert.equal(attrs.getUnderlineStyle(), UnderlineStyle.NONE); }); + it('getUnderlineVarinatOffset', () => { + const attrs = new AttributeData(); + + // defaults to no offset + assert.equal(attrs.getUnderlineVarinatOffset(), 0); + + // should return 0 - 7 + for (let i = 0; i < 8; ++i) { + attrs.extended.underlineVarinatOffset = i; + assert.equal(attrs.getUnderlineVarinatOffset(), i); + } + }); }); }); From 564371eae78007af8b6c6b387bacc35b70d2691a Mon Sep 17 00:00:00 2001 From: tisilent Date: Thu, 24 Aug 2023 11:38:51 +0800 Subject: [PATCH 08/73] Clean unused member --- addons/xterm-addon-canvas/src/BaseRenderLayer.ts | 2 +- addons/xterm-addon-webgl/src/WebglRenderer.ts | 2 +- src/browser/renderer/shared/CellColorResolver.ts | 4 +--- src/browser/renderer/shared/TextureAtlas.ts | 4 ---- src/browser/renderer/shared/Types.d.ts | 2 -- 5 files changed, 3 insertions(+), 11 deletions(-) diff --git a/addons/xterm-addon-canvas/src/BaseRenderLayer.ts b/addons/xterm-addon-canvas/src/BaseRenderLayer.ts index 58c01527..d68923e8 100644 --- a/addons/xterm-addon-canvas/src/BaseRenderLayer.ts +++ b/addons/xterm-addon-canvas/src/BaseRenderLayer.ts @@ -12,7 +12,7 @@ import { createSelectionRenderModel } from 'browser/renderer/shared/SelectionRen import { ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { ReadonlyColorSet } from 'browser/Types'; import { CellData } from 'common/buffer/CellData'; -import { ExtFlags, WHITESPACE_CELL_CODE } from 'common/buffer/Constants'; +import { WHITESPACE_CELL_CODE } from 'common/buffer/Constants'; import { IBufferService, IDecorationService, IOptionsService, IUnicodeService } from 'common/services/Services'; import { ICellData, IDisposable } from 'common/Types'; import { Terminal } from 'xterm'; diff --git a/addons/xterm-addon-webgl/src/WebglRenderer.ts b/addons/xterm-addon-webgl/src/WebglRenderer.ts index 1cb36f46..6b7859eb 100644 --- a/addons/xterm-addon-webgl/src/WebglRenderer.ts +++ b/addons/xterm-addon-webgl/src/WebglRenderer.ts @@ -17,7 +17,7 @@ import { Disposable, MutableDisposable, getDisposeArrayDisposable, toDisposable import { CharData, IBufferLine, ICellData } from 'common/Types'; import { AttributeData } from 'common/buffer/AttributeData'; import { CellData } from 'common/buffer/CellData'; -import { Attributes, Content, ExtFlags, NULL_CELL_CHAR, NULL_CELL_CODE, UnderlineStyle } from 'common/buffer/Constants'; +import { Attributes, Content, NULL_CELL_CHAR, NULL_CELL_CODE } from 'common/buffer/Constants'; import { traceCall } from 'common/services/LogService'; import { ICoreService, IDecorationService, IOptionsService, IUnicodeService } from 'common/services/Services'; import { IDisposable, Terminal } from 'xterm'; diff --git a/src/browser/renderer/shared/CellColorResolver.ts b/src/browser/renderer/shared/CellColorResolver.ts index 1790ddb2..b2d66042 100644 --- a/src/browser/renderer/shared/CellColorResolver.ts +++ b/src/browser/renderer/shared/CellColorResolver.ts @@ -14,7 +14,6 @@ let $hasFg = false; let $hasBg = false; let $isSelected = false; let $colors: ReadonlyColorSet | undefined; -let $x = -1; let $y = -1; let $variantOffset = 0; @@ -43,7 +42,7 @@ export class CellColorResolver { * Resolves colors for the cell, putting the result into the shared {@link result}. This resolves * overrides, inverse and selection for the cell which can then be used to feed into the renderer. */ - public resolve(cell: ICellData, x: number, y: number,deviceCellWidth: number): void { + public resolve(cell: ICellData, x: number, y: number, deviceCellWidth: number): void { this.result.bg = cell.bg; this.result.fg = cell.fg; this.result.ext = cell.bg & BgFlags.HAS_EXTENDED ? cell.extended.ext : 0; @@ -61,7 +60,6 @@ export class CellColorResolver { if ($y !== y) { $variantOffset = 0; } - $x = x; $y = y; const code = cell.getCode(); diff --git a/src/browser/renderer/shared/TextureAtlas.ts b/src/browser/renderer/shared/TextureAtlas.ts index 8a70e252..b2d23a02 100644 --- a/src/browser/renderer/shared/TextureAtlas.ts +++ b/src/browser/renderer/shared/TextureAtlas.ts @@ -960,10 +960,6 @@ export class TextureAtlas implements ITextureAtlas { } }; } - - public getDeviceCellWidth(): number { - return this._config.deviceCellWidth; - } } class AtlasPage { diff --git a/src/browser/renderer/shared/Types.d.ts b/src/browser/renderer/shared/Types.d.ts index 66affd94..a7e55e72 100644 --- a/src/browser/renderer/shared/Types.d.ts +++ b/src/browser/renderer/shared/Types.d.ts @@ -103,8 +103,6 @@ export interface ITextureAtlas extends IDisposable { */ beginFrame(): boolean; - getDeviceCellWidth(): number; - /** * Clear all glyphs from the texture atlas. */ From edfacbb5c6ec6501e9ff4a8716040571f9bdf94e Mon Sep 17 00:00:00 2001 From: tisilent Date: Thu, 24 Aug 2023 11:54:18 +0800 Subject: [PATCH 09/73] Adjusting the execution process --- .../renderer/shared/CellColorResolver.ts | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/browser/renderer/shared/CellColorResolver.ts b/src/browser/renderer/shared/CellColorResolver.ts index b2d66042..76f482d2 100644 --- a/src/browser/renderer/shared/CellColorResolver.ts +++ b/src/browser/renderer/shared/CellColorResolver.ts @@ -66,15 +66,6 @@ export class CellColorResolver { if (code === NULL_CELL_CODE && cell.extended.underlineStyle !== UnderlineStyle.DOTTED) { $variantOffset = 0; } - const fontSize = this._terminal.options.fontSize; - const drp = this._coreBrowserService.dpr; - const lineWidth = Math.max(1, Math.floor(fontSize! * drp / 15)); - let chWidth: number; - if (typeof code === 'number') { - chWidth = this._unicodeService.wcwidth(code); - } else { - chWidth = this._unicodeService.getStringCellWidth(code); - } // Apply decorations on the bottom layer this._decorationService.forEachDecorationAtCell(x, y, 'bottom', d => { @@ -157,12 +148,22 @@ export class CellColorResolver { this.result.bg = $hasBg ? $bg : this.result.bg; this.result.fg = $hasFg ? $fg : this.result.fg; + // Reset overrides variantOffset this.result.ext &= ~ExtFlags.VARIANT_OFFSET; this.result.ext |= ($variantOffset << 29) & ExtFlags.VARIANT_OFFSET; - // compute next varinatOffset + // Compute next varinatOffset if (cell.extended.underlineStyle === UnderlineStyle.DOTTED) { if (code !== NULL_CELL_CODE) { + const fontSize = this._terminal.options.fontSize; + const drp = this._coreBrowserService.dpr; + const lineWidth = Math.max(1, Math.floor(fontSize! * drp / 15)); + let chWidth: number; + if (typeof code === 'number') { + chWidth = this._unicodeService.wcwidth(code); + } else { + chWidth = this._unicodeService.getStringCellWidth(code); + } $variantOffset = computeVarinatOffset(deviceCellWidth * chWidth, lineWidth, $variantOffset); } } else { From 52c87bc8b3fcdae933b62c1ae665c0249e558e7a Mon Sep 17 00:00:00 2001 From: tisilent Date: Thu, 24 Aug 2023 14:46:30 +0800 Subject: [PATCH 10/73] Add tests for computeVarinatOffset --- .../renderer/shared/RendererUtils.test.ts | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/browser/renderer/shared/RendererUtils.test.ts diff --git a/src/browser/renderer/shared/RendererUtils.test.ts b/src/browser/renderer/shared/RendererUtils.test.ts new file mode 100644 index 00000000..e933af52 --- /dev/null +++ b/src/browser/renderer/shared/RendererUtils.test.ts @@ -0,0 +1,45 @@ +import { computeVarinatOffset } from 'browser/renderer/shared/RendererUtils'; +import { assert } from 'chai'; + +describe('RendererUtils', () => { + it('computeVarinatOffset', () => { + const cellWidth = 11; + const doubleCellWidth = 22; + let line = 1; + let varinatOffset = 0; + + // should line 1 + // =,_,=_,=_, + let cells = [cellWidth, cellWidth, doubleCellWidth, doubleCellWidth]; + let result = [1, 0, 0, 0]; + for (let index = 0; index < cells.length; index++) { + const cell = cells[index]; + varinatOffset = computeVarinatOffset(cell, line, varinatOffset); + assert.equal(varinatOffset, result[index]); + } + + // should line 2 + // ==__==__==_,_==__==__==,__==__==__==__==__==__,==__==__==__==__==__==, + line = 2; + varinatOffset = 0; + cells = [cellWidth, cellWidth, doubleCellWidth, doubleCellWidth]; + result = [3, 2, 0 ,2]; + for (let index = 0; index < cells.length; index++) { + const cell = cells[index]; + varinatOffset = computeVarinatOffset(cell, line, varinatOffset); + assert.equal(varinatOffset, result[index]); + } + + // should line 3 + // ===___===__,_===___===_,__===___===___===___==,=___===___===___===___, + line = 3; + varinatOffset = 0; + cells = [cellWidth, cellWidth, doubleCellWidth, doubleCellWidth]; + result = [5, 4, 2, 0]; + for (let index = 0; index < cells.length; index++) { + const cell = cells[index]; + varinatOffset = computeVarinatOffset(cell, line, varinatOffset); + assert.equal(varinatOffset, result[index]); + } + }); +}); From 6ace4162242b9303f2d67a3bc71eb8cea205860b Mon Sep 17 00:00:00 2001 From: tisilent Date: Thu, 24 Aug 2023 15:55:24 +0800 Subject: [PATCH 11/73] Add license header --- src/browser/renderer/shared/RendererUtils.test.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/browser/renderer/shared/RendererUtils.test.ts b/src/browser/renderer/shared/RendererUtils.test.ts index e933af52..b1e90bca 100644 --- a/src/browser/renderer/shared/RendererUtils.test.ts +++ b/src/browser/renderer/shared/RendererUtils.test.ts @@ -1,3 +1,8 @@ +/** + * Copyright (c) 2023 The xterm.js authors. All rights reserved. + * @license MIT + */ + import { computeVarinatOffset } from 'browser/renderer/shared/RendererUtils'; import { assert } from 'chai'; From f4881872f7ba143fb9263f68429553cfe72ff559 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 24 Aug 2023 06:12:56 -0700 Subject: [PATCH 12/73] Remove unused private prop --- addons/xterm-addon-canvas/src/BaseRenderLayer.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/xterm-addon-canvas/src/BaseRenderLayer.ts b/addons/xterm-addon-canvas/src/BaseRenderLayer.ts index d68923e8..4ce5c068 100644 --- a/addons/xterm-addon-canvas/src/BaseRenderLayer.ts +++ b/addons/xterm-addon-canvas/src/BaseRenderLayer.ts @@ -56,10 +56,10 @@ export abstract class BaseRenderLayer extends Disposable implements IRenderLayer protected readonly _optionsService: IOptionsService, protected readonly _decorationService: IDecorationService, protected readonly _coreBrowserService: ICoreBrowserService, - private readonly _unicodeService: IUnicodeService + unicodeService: IUnicodeService ) { super(); - this._cellColorResolver = new CellColorResolver(this._terminal, this._selectionModel, this._decorationService, this._coreBrowserService, this._themeService, _unicodeService); + this._cellColorResolver = new CellColorResolver(this._terminal, this._selectionModel, this._decorationService, this._coreBrowserService, this._themeService, unicodeService); this._canvas = document.createElement('canvas'); this._canvas.classList.add(`xterm-${id}-layer`); this._canvas.style.zIndex = zIndex.toString(); From d15abd7f2899bfb18ceab08a43f47d54970cac21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?xie=20jialong=20=E5=8A=AA=E5=8A=9B=E9=B8=AD?= <48614781+tisilent@users.noreply.github.com> Date: Fri, 25 Aug 2023 10:33:22 +0800 Subject: [PATCH 13/73] Update src/browser/renderer/shared/CellColorResolver.ts Co-authored-by: Daniel Imms <2193314+Tyriar@users.noreply.github.com> --- src/browser/renderer/shared/CellColorResolver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browser/renderer/shared/CellColorResolver.ts b/src/browser/renderer/shared/CellColorResolver.ts index 76f482d2..3066717a 100644 --- a/src/browser/renderer/shared/CellColorResolver.ts +++ b/src/browser/renderer/shared/CellColorResolver.ts @@ -152,7 +152,7 @@ export class CellColorResolver { this.result.ext &= ~ExtFlags.VARIANT_OFFSET; this.result.ext |= ($variantOffset << 29) & ExtFlags.VARIANT_OFFSET; - // Compute next varinatOffset + // Compute next variantOffset if (cell.extended.underlineStyle === UnderlineStyle.DOTTED) { if (code !== NULL_CELL_CODE) { const fontSize = this._terminal.options.fontSize; From 08f7b4c53c847a67b6baadbf9ca93b972aefbc4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?xie=20jialong=20=E5=8A=AA=E5=8A=9B=E9=B8=AD?= <48614781+tisilent@users.noreply.github.com> Date: Fri, 25 Aug 2023 10:34:31 +0800 Subject: [PATCH 14/73] Update src/browser/renderer/shared/CellColorResolver.ts Co-authored-by: Daniel Imms <2193314+Tyriar@users.noreply.github.com> --- src/browser/renderer/shared/CellColorResolver.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/browser/renderer/shared/CellColorResolver.ts b/src/browser/renderer/shared/CellColorResolver.ts index 3066717a..d5565f7f 100644 --- a/src/browser/renderer/shared/CellColorResolver.ts +++ b/src/browser/renderer/shared/CellColorResolver.ts @@ -156,8 +156,7 @@ export class CellColorResolver { if (cell.extended.underlineStyle === UnderlineStyle.DOTTED) { if (code !== NULL_CELL_CODE) { const fontSize = this._terminal.options.fontSize; - const drp = this._coreBrowserService.dpr; - const lineWidth = Math.max(1, Math.floor(fontSize! * drp / 15)); + const lineWidth = Math.max(1, Math.floor(fontSize! * this._coreBrowserService.dpr / 15)); let chWidth: number; if (typeof code === 'number') { chWidth = this._unicodeService.wcwidth(code); From bec1642123fa8e5a112e7824a7bacfbc7043448b Mon Sep 17 00:00:00 2001 From: tisilent Date: Fri, 25 Aug 2023 14:17:36 +0800 Subject: [PATCH 15/73] Modify variantOffset calculation logic --- .../xterm-addon-canvas/src/BaseRenderLayer.ts | 7 ++-- addons/xterm-addon-canvas/src/CanvasAddon.ts | 5 ++- .../xterm-addon-canvas/src/CanvasRenderer.ts | 13 ++++--- .../src/CursorRenderLayer.ts | 7 ++-- .../xterm-addon-canvas/src/LinkRenderLayer.ts | 7 ++-- .../src/SelectionRenderLayer.ts | 7 ++-- .../xterm-addon-canvas/src/TextRenderLayer.ts | 7 ++-- addons/xterm-addon-webgl/src/WebglAddon.ts | 4 +-- addons/xterm-addon-webgl/src/WebglRenderer.ts | 5 ++- .../renderer/shared/CellColorResolver.ts | 36 ++++--------------- .../renderer/shared/RendererUtils.test.ts | 10 +++--- src/browser/renderer/shared/RendererUtils.ts | 2 +- src/browser/renderer/shared/TextureAtlas.ts | 28 ++++++--------- src/common/buffer/AttributeData.ts | 2 +- 14 files changed, 51 insertions(+), 89 deletions(-) diff --git a/addons/xterm-addon-canvas/src/BaseRenderLayer.ts b/addons/xterm-addon-canvas/src/BaseRenderLayer.ts index 4ce5c068..6c6694f5 100644 --- a/addons/xterm-addon-canvas/src/BaseRenderLayer.ts +++ b/addons/xterm-addon-canvas/src/BaseRenderLayer.ts @@ -13,7 +13,7 @@ import { ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { ReadonlyColorSet } from 'browser/Types'; import { CellData } from 'common/buffer/CellData'; import { WHITESPACE_CELL_CODE } from 'common/buffer/Constants'; -import { IBufferService, IDecorationService, IOptionsService, IUnicodeService } from 'common/services/Services'; +import { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services'; import { ICellData, IDisposable } from 'common/Types'; import { Terminal } from 'xterm'; import { IRenderLayer } from './Types'; @@ -55,11 +55,10 @@ export abstract class BaseRenderLayer extends Disposable implements IRenderLayer protected readonly _bufferService: IBufferService, protected readonly _optionsService: IOptionsService, protected readonly _decorationService: IDecorationService, - protected readonly _coreBrowserService: ICoreBrowserService, - unicodeService: IUnicodeService + protected readonly _coreBrowserService: ICoreBrowserService ) { super(); - this._cellColorResolver = new CellColorResolver(this._terminal, this._selectionModel, this._decorationService, this._coreBrowserService, this._themeService, unicodeService); + this._cellColorResolver = new CellColorResolver(this._terminal, this._optionsService, this._selectionModel, this._decorationService, this._coreBrowserService, this._themeService); this._canvas = document.createElement('canvas'); this._canvas.classList.add(`xterm-${id}-layer`); this._canvas.style.zIndex = zIndex.toString(); diff --git a/addons/xterm-addon-canvas/src/CanvasAddon.ts b/addons/xterm-addon-canvas/src/CanvasAddon.ts index 3b3a2a44..d2da19f0 100644 --- a/addons/xterm-addon-canvas/src/CanvasAddon.ts +++ b/addons/xterm-addon-canvas/src/CanvasAddon.ts @@ -8,7 +8,7 @@ import { ITerminal } from 'browser/Types'; import { EventEmitter, forwardEvent } from 'common/EventEmitter'; import { Disposable, toDisposable } from 'common/Lifecycle'; import { setTraceLogger } from 'common/services/LogService'; -import { IBufferService, IDecorationService, ILogService, IUnicodeService } from 'common/services/Services'; +import { IBufferService, IDecorationService, ILogService } from 'common/services/Services'; import { ITerminalAddon, Terminal } from 'xterm'; import { CanvasRenderer } from './CanvasRenderer'; @@ -47,13 +47,12 @@ export class CanvasAddon extends Disposable implements ITerminalAddon { const decorationService: IDecorationService = unsafeCore._decorationService; const logService: ILogService = unsafeCore._logService; const themeService: IThemeService = unsafeCore._themeService; - const unicodeService: IUnicodeService = unsafeCore.unicodeService; // Set trace logger just in case it hasn't been yet which could happen when the addon is // bundled separately to the core module setTraceLogger(logService); - this._renderer = new CanvasRenderer(terminal, screenElement, linkifier, bufferService, charSizeService, optionsService, characterJoinerService, coreService, coreBrowserService, decorationService, themeService, unicodeService); + this._renderer = new CanvasRenderer(terminal, screenElement, linkifier, bufferService, charSizeService, optionsService, characterJoinerService, coreService, coreBrowserService, decorationService, themeService); this.register(forwardEvent(this._renderer.onChangeTextureAtlas, this._onChangeTextureAtlas)); this.register(forwardEvent(this._renderer.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas)); diff --git a/addons/xterm-addon-canvas/src/CanvasRenderer.ts b/addons/xterm-addon-canvas/src/CanvasRenderer.ts index e2f0b459..cd05f921 100644 --- a/addons/xterm-addon-canvas/src/CanvasRenderer.ts +++ b/addons/xterm-addon-canvas/src/CanvasRenderer.ts @@ -11,7 +11,7 @@ import { IRenderDimensions, IRenderer, IRequestRedrawEvent } from 'browser/rende import { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { EventEmitter, forwardEvent } from 'common/EventEmitter'; import { Disposable, toDisposable } from 'common/Lifecycle'; -import { IBufferService, ICoreService, IDecorationService, IOptionsService, IUnicodeService } from 'common/services/Services'; +import { IBufferService, ICoreService, IDecorationService, IOptionsService } from 'common/services/Services'; import { Terminal } from 'xterm'; import { CursorRenderLayer } from './CursorRenderLayer'; import { LinkRenderLayer } from './LinkRenderLayer'; @@ -43,16 +43,15 @@ export class CanvasRenderer extends Disposable implements IRenderer { coreService: ICoreService, private readonly _coreBrowserService: ICoreBrowserService, decorationService: IDecorationService, - private readonly _themeService: IThemeService, - unicodeService: IUnicodeService + private readonly _themeService: IThemeService ) { super(); const allowTransparency = this._optionsService.rawOptions.allowTransparency; this._renderLayers = [ - new TextRenderLayer(this._terminal, this._screenElement, 0, allowTransparency, this._bufferService, this._optionsService, characterJoinerService, decorationService, this._coreBrowserService, _themeService, unicodeService), - new SelectionRenderLayer(this._terminal, this._screenElement, 1, this._bufferService, this._coreBrowserService, decorationService, this._optionsService, _themeService, unicodeService), - new LinkRenderLayer(this._terminal, this._screenElement, 2, linkifier2, this._bufferService, this._optionsService, decorationService, this._coreBrowserService, _themeService, unicodeService), - new CursorRenderLayer(this._terminal, this._screenElement, 3, this._onRequestRedraw, this._bufferService, this._optionsService, coreService, this._coreBrowserService, decorationService, _themeService, unicodeService) + new TextRenderLayer(this._terminal, this._screenElement, 0, allowTransparency, this._bufferService, this._optionsService, characterJoinerService, decorationService, this._coreBrowserService, _themeService), + new SelectionRenderLayer(this._terminal, this._screenElement, 1, this._bufferService, this._coreBrowserService, decorationService, this._optionsService, _themeService), + new LinkRenderLayer(this._terminal, this._screenElement, 2, linkifier2, this._bufferService, this._optionsService, decorationService, this._coreBrowserService, _themeService), + new CursorRenderLayer(this._terminal, this._screenElement, 3, this._onRequestRedraw, this._bufferService, this._optionsService, coreService, this._coreBrowserService, decorationService, _themeService) ]; for (const layer of this._renderLayers) { forwardEvent(layer.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas); diff --git a/addons/xterm-addon-canvas/src/CursorRenderLayer.ts b/addons/xterm-addon-canvas/src/CursorRenderLayer.ts index 42383662..9f4ac896 100644 --- a/addons/xterm-addon-canvas/src/CursorRenderLayer.ts +++ b/addons/xterm-addon-canvas/src/CursorRenderLayer.ts @@ -11,7 +11,7 @@ import { toDisposable } from 'common/Lifecycle'; import { isFirefox } from 'common/Platform'; import { ICellData } from 'common/Types'; import { CellData } from 'common/buffer/CellData'; -import { IBufferService, ICoreService, IDecorationService, IOptionsService, IUnicodeService } from 'common/services/Services'; +import { IBufferService, ICoreService, IDecorationService, IOptionsService } from 'common/services/Services'; import { Terminal } from 'xterm'; import { BaseRenderLayer } from './BaseRenderLayer'; @@ -39,10 +39,9 @@ export class CursorRenderLayer extends BaseRenderLayer { private readonly _coreService: ICoreService, coreBrowserService: ICoreBrowserService, decorationService: IDecorationService, - themeService: IThemeService, - unicodeService: IUnicodeService + themeService: IThemeService ) { - super(terminal, container, 'cursor', zIndex, true, themeService, bufferService, optionsService, decorationService, coreBrowserService, unicodeService); + super(terminal, container, 'cursor', zIndex, true, themeService, bufferService, optionsService, decorationService, coreBrowserService); this._state = { x: 0, y: 0, diff --git a/addons/xterm-addon-canvas/src/LinkRenderLayer.ts b/addons/xterm-addon-canvas/src/LinkRenderLayer.ts index 53040b85..882f7d8c 100644 --- a/addons/xterm-addon-canvas/src/LinkRenderLayer.ts +++ b/addons/xterm-addon-canvas/src/LinkRenderLayer.ts @@ -8,7 +8,7 @@ import { is256Color } from 'browser/renderer/shared/CharAtlasUtils'; import { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants'; import { IRenderDimensions } from 'browser/renderer/shared/Types'; import { ICoreBrowserService, IThemeService } from 'browser/services/Services'; -import { IBufferService, IDecorationService, IOptionsService, IUnicodeService } from 'common/services/Services'; +import { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services'; import { Terminal } from 'xterm'; import { BaseRenderLayer } from './BaseRenderLayer'; @@ -24,10 +24,9 @@ export class LinkRenderLayer extends BaseRenderLayer { optionsService: IOptionsService, decorationService: IDecorationService, coreBrowserService: ICoreBrowserService, - themeService: IThemeService, - unicodeService: IUnicodeService + themeService: IThemeService ) { - super(terminal, container, 'link', zIndex, true, themeService, bufferService, optionsService, decorationService, coreBrowserService, unicodeService); + super(terminal, container, 'link', zIndex, true, themeService, bufferService, optionsService, decorationService, coreBrowserService); this.register(linkifier2.onShowLinkUnderline(e => this._handleShowLinkUnderline(e))); this.register(linkifier2.onHideLinkUnderline(e => this._handleHideLinkUnderline(e))); diff --git a/addons/xterm-addon-canvas/src/SelectionRenderLayer.ts b/addons/xterm-addon-canvas/src/SelectionRenderLayer.ts index 0e397441..10950868 100644 --- a/addons/xterm-addon-canvas/src/SelectionRenderLayer.ts +++ b/addons/xterm-addon-canvas/src/SelectionRenderLayer.ts @@ -5,7 +5,7 @@ import { IRenderDimensions } from 'browser/renderer/shared/Types'; import { BaseRenderLayer } from './BaseRenderLayer'; -import { IBufferService, IDecorationService, IOptionsService, IUnicodeService } from 'common/services/Services'; +import { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services'; import { ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { Terminal } from 'xterm'; @@ -27,10 +27,9 @@ export class SelectionRenderLayer extends BaseRenderLayer { coreBrowserService: ICoreBrowserService, decorationService: IDecorationService, optionsService: IOptionsService, - themeService: IThemeService, - unicodeService: IUnicodeService + themeService: IThemeService ) { - super(terminal, container, 'selection', zIndex, true, themeService, bufferService, optionsService, decorationService, coreBrowserService, unicodeService); + super(terminal, container, 'selection', zIndex, true, themeService, bufferService, optionsService, decorationService, coreBrowserService); this._clearState(); } diff --git a/addons/xterm-addon-canvas/src/TextRenderLayer.ts b/addons/xterm-addon-canvas/src/TextRenderLayer.ts index 600105ab..46d052f3 100644 --- a/addons/xterm-addon-canvas/src/TextRenderLayer.ts +++ b/addons/xterm-addon-canvas/src/TextRenderLayer.ts @@ -10,7 +10,7 @@ import { CharData, ICellData } from 'common/Types'; import { AttributeData } from 'common/buffer/AttributeData'; import { CellData } from 'common/buffer/CellData'; import { Content, NULL_CELL_CODE } from 'common/buffer/Constants'; -import { IBufferService, IDecorationService, IOptionsService, IUnicodeService } from 'common/services/Services'; +import { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services'; import { Terminal } from 'xterm'; import { BaseRenderLayer } from './BaseRenderLayer'; import { GridCache } from './GridCache'; @@ -39,10 +39,9 @@ export class TextRenderLayer extends BaseRenderLayer { private readonly _characterJoinerService: ICharacterJoinerService, decorationService: IDecorationService, coreBrowserService: ICoreBrowserService, - themeService: IThemeService, - unicodeService: IUnicodeService + themeService: IThemeService ) { - super(terminal, container, 'text', zIndex, alpha, themeService, bufferService, optionsService, decorationService, coreBrowserService, unicodeService); + super(terminal, container, 'text', zIndex, alpha, themeService, bufferService, optionsService, decorationService, coreBrowserService); this._state = new GridCache(); this.register(optionsService.onSpecificOptionChange('allowTransparency', value => this._setTransparency(value))); } diff --git a/addons/xterm-addon-webgl/src/WebglAddon.ts b/addons/xterm-addon-webgl/src/WebglAddon.ts index 9e961cc6..3e091f0b 100644 --- a/addons/xterm-addon-webgl/src/WebglAddon.ts +++ b/addons/xterm-addon-webgl/src/WebglAddon.ts @@ -8,7 +8,7 @@ import { ITerminal } from 'browser/Types'; import { EventEmitter, forwardEvent } from 'common/EventEmitter'; import { Disposable, toDisposable } from 'common/Lifecycle'; import { getSafariVersion, isSafari } from 'common/Platform'; -import { ICoreService, IDecorationService, ILogService, IOptionsService, IUnicodeService } from 'common/services/Services'; +import { ICoreService, IDecorationService, ILogService, IOptionsService } from 'common/services/Services'; import { ITerminalAddon, Terminal } from 'xterm'; import { WebglRenderer } from './WebglRenderer'; import { setTraceLogger } from 'common/services/LogService'; @@ -54,7 +54,6 @@ export class WebglAddon extends Disposable implements ITerminalAddon { const decorationService: IDecorationService = unsafeCore._decorationService; const logService: ILogService = unsafeCore._logService; const themeService: IThemeService = unsafeCore._themeService; - const unicodeService: IUnicodeService = unsafeCore.unicodeService; // Set trace logger just in case it hasn't been yet which could happen when the addon is // bundled separately to the core module @@ -69,7 +68,6 @@ export class WebglAddon extends Disposable implements ITerminalAddon { decorationService, optionsService, themeService, - unicodeService, this._preserveDrawingBuffer )); this.register(forwardEvent(this._renderer.onContextLoss, this._onContextLoss)); diff --git a/addons/xterm-addon-webgl/src/WebglRenderer.ts b/addons/xterm-addon-webgl/src/WebglRenderer.ts index 6b7859eb..5f4bf7ff 100644 --- a/addons/xterm-addon-webgl/src/WebglRenderer.ts +++ b/addons/xterm-addon-webgl/src/WebglRenderer.ts @@ -19,7 +19,7 @@ import { AttributeData } from 'common/buffer/AttributeData'; import { CellData } from 'common/buffer/CellData'; import { Attributes, Content, NULL_CELL_CHAR, NULL_CELL_CODE } from 'common/buffer/Constants'; import { traceCall } from 'common/services/LogService'; -import { ICoreService, IDecorationService, IOptionsService, IUnicodeService } from 'common/services/Services'; +import { ICoreService, IDecorationService, IOptionsService } from 'common/services/Services'; import { IDisposable, Terminal } from 'xterm'; import { GlyphRenderer } from './GlyphRenderer'; import { RectangleRenderer } from './RectangleRenderer'; @@ -70,14 +70,13 @@ export class WebglRenderer extends Disposable implements IRenderer { private readonly _decorationService: IDecorationService, private readonly _optionsService: IOptionsService, private readonly _themeService: IThemeService, - private readonly _unicodeService: IUnicodeService, preserveDrawingBuffer?: boolean ) { super(); this.register(this._themeService.onChangeColors(() => this._handleColorChange())); - this._cellColorResolver = new CellColorResolver(this._terminal, this._model.selection, this._decorationService, this._coreBrowserService, this._themeService, this._unicodeService); + this._cellColorResolver = new CellColorResolver(this._terminal, this._optionsService, this._model.selection, this._decorationService, this._coreBrowserService, this._themeService); this._core = (this._terminal as any)._core; diff --git a/src/browser/renderer/shared/CellColorResolver.ts b/src/browser/renderer/shared/CellColorResolver.ts index d5565f7f..fa0428b1 100644 --- a/src/browser/renderer/shared/CellColorResolver.ts +++ b/src/browser/renderer/shared/CellColorResolver.ts @@ -1,9 +1,8 @@ -import { computeVarinatOffset } from 'browser/renderer/shared/RendererUtils'; import { ISelectionRenderModel } from 'browser/renderer/shared/Types'; import { ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { ReadonlyColorSet } from 'browser/Types'; import { Attributes, BgFlags, ExtFlags, FgFlags, NULL_CELL_CODE, UnderlineStyle } from 'common/buffer/Constants'; -import { IDecorationService, IUnicodeService } from 'common/services/Services'; +import { IDecorationService, IOptionsService } from 'common/services/Services'; import { ICellData } from 'common/Types'; import { Terminal } from 'xterm'; @@ -14,7 +13,6 @@ let $hasFg = false; let $hasBg = false; let $isSelected = false; let $colors: ReadonlyColorSet | undefined; -let $y = -1; let $variantOffset = 0; export class CellColorResolver { @@ -30,11 +28,11 @@ export class CellColorResolver { constructor( private readonly _terminal: Terminal, + private readonly _optionService: IOptionsService, private readonly _selectionRenderModel: ISelectionRenderModel, private readonly _decorationService: IDecorationService, private readonly _coreBrowserService: ICoreBrowserService, - private readonly _themeService: IThemeService, - private readonly _unicodeService: IUnicodeService + private readonly _themeService: IThemeService ) { } @@ -56,15 +54,12 @@ export class CellColorResolver { $hasFg = false; $isSelected = false; $colors = this._themeService.colors; - - if ($y !== y) { - $variantOffset = 0; - } - $y = y; + $variantOffset = 0; const code = cell.getCode(); - if (code === NULL_CELL_CODE && cell.extended.underlineStyle !== UnderlineStyle.DOTTED) { - $variantOffset = 0; + if (code !== NULL_CELL_CODE && cell.extended.underlineStyle === UnderlineStyle.DOTTED) { + const lineWidth = Math.max(1, Math.floor(this._optionService.rawOptions.fontSize * this._coreBrowserService.dpr / 15)); + $variantOffset = x * deviceCellWidth % (Math.round(lineWidth) * 2); } // Apply decorations on the bottom layer @@ -151,22 +146,5 @@ export class CellColorResolver { // Reset overrides variantOffset this.result.ext &= ~ExtFlags.VARIANT_OFFSET; this.result.ext |= ($variantOffset << 29) & ExtFlags.VARIANT_OFFSET; - - // Compute next variantOffset - if (cell.extended.underlineStyle === UnderlineStyle.DOTTED) { - if (code !== NULL_CELL_CODE) { - const fontSize = this._terminal.options.fontSize; - const lineWidth = Math.max(1, Math.floor(fontSize! * this._coreBrowserService.dpr / 15)); - let chWidth: number; - if (typeof code === 'number') { - chWidth = this._unicodeService.wcwidth(code); - } else { - chWidth = this._unicodeService.getStringCellWidth(code); - } - $variantOffset = computeVarinatOffset(deviceCellWidth * chWidth, lineWidth, $variantOffset); - } - } else { - $variantOffset = 0; - } } } diff --git a/src/browser/renderer/shared/RendererUtils.test.ts b/src/browser/renderer/shared/RendererUtils.test.ts index b1e90bca..e7e49c1d 100644 --- a/src/browser/renderer/shared/RendererUtils.test.ts +++ b/src/browser/renderer/shared/RendererUtils.test.ts @@ -3,11 +3,11 @@ * @license MIT */ -import { computeVarinatOffset } from 'browser/renderer/shared/RendererUtils'; +import { computeNextVarinatOffset } from 'browser/renderer/shared/RendererUtils'; import { assert } from 'chai'; describe('RendererUtils', () => { - it('computeVarinatOffset', () => { + it('computeNextVarinatOffset', () => { const cellWidth = 11; const doubleCellWidth = 22; let line = 1; @@ -19,7 +19,7 @@ describe('RendererUtils', () => { let result = [1, 0, 0, 0]; for (let index = 0; index < cells.length; index++) { const cell = cells[index]; - varinatOffset = computeVarinatOffset(cell, line, varinatOffset); + varinatOffset = computeNextVarinatOffset(cell, line, varinatOffset); assert.equal(varinatOffset, result[index]); } @@ -31,7 +31,7 @@ describe('RendererUtils', () => { result = [3, 2, 0 ,2]; for (let index = 0; index < cells.length; index++) { const cell = cells[index]; - varinatOffset = computeVarinatOffset(cell, line, varinatOffset); + varinatOffset = computeNextVarinatOffset(cell, line, varinatOffset); assert.equal(varinatOffset, result[index]); } @@ -43,7 +43,7 @@ describe('RendererUtils', () => { result = [5, 4, 2, 0]; for (let index = 0; index < cells.length; index++) { const cell = cells[index]; - varinatOffset = computeVarinatOffset(cell, line, varinatOffset); + varinatOffset = computeNextVarinatOffset(cell, line, varinatOffset); assert.equal(varinatOffset, result[index]); } }); diff --git a/src/browser/renderer/shared/RendererUtils.ts b/src/browser/renderer/shared/RendererUtils.ts index 73009f6a..b60fd011 100644 --- a/src/browser/renderer/shared/RendererUtils.ts +++ b/src/browser/renderer/shared/RendererUtils.ts @@ -57,6 +57,6 @@ function createDimension(): IDimensions { }; } -export function computeVarinatOffset(cellWidth: number, lineWidth: number, currentOffset: number = 0): number { +export function computeNextVarinatOffset(cellWidth: number, lineWidth: number, currentOffset: number = 0): number { return (cellWidth - (Math.round(lineWidth) * 2 - currentOffset)) % (Math.round(lineWidth) * 2); } diff --git a/src/browser/renderer/shared/TextureAtlas.ts b/src/browser/renderer/shared/TextureAtlas.ts index b2d23a02..f72fafdb 100644 --- a/src/browser/renderer/shared/TextureAtlas.ts +++ b/src/browser/renderer/shared/TextureAtlas.ts @@ -6,7 +6,7 @@ import { IColorContrastCache } from 'browser/Types'; import { DIM_OPACITY, TEXT_BASELINE } from 'browser/renderer/shared/Constants'; import { tryDrawCustomChar } from 'browser/renderer/shared/CustomGlyphs'; -import { computeVarinatOffset, excludeFromContrastRatioDemands, isPowerlineGlyph, isRestrictedPowerlineGlyph, throwIfFalsy } from 'browser/renderer/shared/RendererUtils'; +import { computeNextVarinatOffset, excludeFromContrastRatioDemands, isPowerlineGlyph, isRestrictedPowerlineGlyph, throwIfFalsy } from 'browser/renderer/shared/RendererUtils'; import { IBoundingBox, ICharAtlasConfig, IRasterizedGlyph, ITextureAtlas } from 'browser/renderer/shared/Types'; import { NULL_COLOR, color, rgba } from 'common/Color'; import { EventEmitter } from 'common/EventEmitter'; @@ -599,26 +599,20 @@ export class TextureAtlas implements ITextureAtlas { case UnderlineStyle.DOTTED: const offsetWidth = nextOffset === 0 ? 0 : (nextOffset >= lineWidth ? lineWidth * 2 - nextOffset : lineWidth - nextOffset); - if (offsetWidth === 0) { + // a line and a gap. + const isLineStart = nextOffset >= lineWidth ? false : true; + if (isLineStart === false || offsetWidth === 0) { this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]); - this._tmpCtx.moveTo(xChLeft, yTop); + this._tmpCtx.moveTo(xChLeft + offsetWidth, yTop); this._tmpCtx.lineTo(xChRight, yTop); } else { - // a line and a gap. - const isLineStart = nextOffset >= lineWidth ? false : true; - if (isLineStart === false) { - this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]); - this._tmpCtx.moveTo(xChLeft + offsetWidth, yTop); - this._tmpCtx.lineTo(xChRight, yTop); - } else { - this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]); - this._tmpCtx.moveTo(xChLeft, yTop); - this._tmpCtx.lineTo(xChLeft + offsetWidth, yTop); - this._tmpCtx.moveTo(xChLeft + offsetWidth + lineWidth, yTop); - this._tmpCtx.lineTo(xChRight, yTop); - } + this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]); + this._tmpCtx.moveTo(xChLeft, yTop); + this._tmpCtx.lineTo(xChLeft + offsetWidth, yTop); + this._tmpCtx.moveTo(xChLeft + offsetWidth + lineWidth, yTop); + this._tmpCtx.lineTo(xChRight, yTop); } - nextOffset = computeVarinatOffset(xChRight - xChLeft, lineWidth, nextOffset); + nextOffset = computeNextVarinatOffset(xChRight - xChLeft, lineWidth, nextOffset); break; case UnderlineStyle.DASHED: this._tmpCtx.setLineDash([this._config.devicePixelRatio * 4, this._config.devicePixelRatio * 3]); diff --git a/src/common/buffer/AttributeData.ts b/src/common/buffer/AttributeData.ts index 91c5de61..acc8a8c2 100644 --- a/src/common/buffer/AttributeData.ts +++ b/src/common/buffer/AttributeData.ts @@ -180,7 +180,7 @@ export class ExtendedAttrs implements IExtendedAttrs { public get underlineVarinatOffset(): number { const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29; if (val < 0) { - return val ^ 4294967288; + return val ^ 0xFFFFFFF8; } return val; } From 810e62665fa97d49d346f5c393b4243fe049e2db Mon Sep 17 00:00:00 2001 From: tisilent Date: Fri, 25 Aug 2023 14:30:34 +0800 Subject: [PATCH 16/73] Clean --- addons/xterm-addon-canvas/src/CanvasAddon.ts | 1 - addons/xterm-addon-webgl/src/WebglRenderer.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/addons/xterm-addon-canvas/src/CanvasAddon.ts b/addons/xterm-addon-canvas/src/CanvasAddon.ts index d2da19f0..91438a4c 100644 --- a/addons/xterm-addon-canvas/src/CanvasAddon.ts +++ b/addons/xterm-addon-canvas/src/CanvasAddon.ts @@ -53,7 +53,6 @@ export class CanvasAddon extends Disposable implements ITerminalAddon { setTraceLogger(logService); this._renderer = new CanvasRenderer(terminal, screenElement, linkifier, bufferService, charSizeService, optionsService, characterJoinerService, coreService, coreBrowserService, decorationService, themeService); - this.register(forwardEvent(this._renderer.onChangeTextureAtlas, this._onChangeTextureAtlas)); this.register(forwardEvent(this._renderer.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas)); renderService.setRenderer(this._renderer); diff --git a/addons/xterm-addon-webgl/src/WebglRenderer.ts b/addons/xterm-addon-webgl/src/WebglRenderer.ts index 5f4bf7ff..516a4c27 100644 --- a/addons/xterm-addon-webgl/src/WebglRenderer.ts +++ b/addons/xterm-addon-webgl/src/WebglRenderer.ts @@ -446,7 +446,6 @@ export class WebglRenderer extends Disposable implements IRenderer { chars = cell.getChars(); code = cell.getCode(); - i = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL; // Load colors/resolve overrides into work colors From 42d6c2bd6b34495a36c99cef747c7c24c8dfba37 Mon Sep 17 00:00:00 2001 From: tisilent Date: Fri, 25 Aug 2023 14:37:03 +0800 Subject: [PATCH 17/73] Use hex --- addons/xterm-addon-image/src/ImageStorage.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/xterm-addon-image/src/ImageStorage.ts b/addons/xterm-addon-image/src/ImageStorage.ts index 86d48a6d..2fb12c14 100644 --- a/addons/xterm-addon-image/src/ImageStorage.ts +++ b/addons/xterm-addon-image/src/ImageStorage.ts @@ -56,7 +56,7 @@ class ExtendedAttrsImage implements IExtendedAttrsImage { public get underlineVarinatOffset(): number { const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29; if (val < 0) { - return val ^ 4294967288; + return val ^ 0xFFFFFFF8; } return val; } From 17575e1d7b7ed94b5c68cb5b88ffcd1dab754f75 Mon Sep 17 00:00:00 2001 From: tisilent Date: Thu, 14 Sep 2023 16:37:40 +0800 Subject: [PATCH 18/73] using viewport relative coordinate --- addons/xterm-addon-webgl/src/WebglRenderer.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/xterm-addon-webgl/src/WebglRenderer.ts b/addons/xterm-addon-webgl/src/WebglRenderer.ts index 8cc81b92..ed416c5c 100644 --- a/addons/xterm-addon-webgl/src/WebglRenderer.ts +++ b/addons/xterm-addon-webgl/src/WebglRenderer.ts @@ -391,6 +391,7 @@ export class WebglRenderer extends Disposable implements IRenderer { end = clamp(end, terminal.rows - 1, 0); const cursorY = this._terminal.buffer.active.baseY + this._terminal.buffer.active.cursorY; + const viewportRelativeCursorY = cursorY - terminal.buffer.ydisp; // in case cursor.x == cols adjust visual cursor to cols - 1 const cursorX = Math.min(this._terminal.buffer.active.cursorX, terminal.cols - 1); let lastCursorX = -1; @@ -449,7 +450,7 @@ export class WebglRenderer extends Disposable implements IRenderer { if (x === cursorX) { this._model.cursor = { x: cursorX, - y: this._terminal.buffer.active.cursorY, + y: viewportRelativeCursorY, width: cell.getWidth(), style: this._coreBrowserService.isFocused ? (terminal.options.cursorStyle || 'block') : terminal.options.cursorInactiveStyle, From 27fd011e354b504998af7edb98a4f3d5d02e7b9c Mon Sep 17 00:00:00 2001 From: tisilent Date: Tue, 19 Sep 2023 20:29:28 +0800 Subject: [PATCH 19/73] Add regression tests --- test/playwright/SharedRendererTests.ts | 28 ++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/test/playwright/SharedRendererTests.ts b/test/playwright/SharedRendererTests.ts index e1e56bc9..bdfbf83a 100644 --- a/test/playwright/SharedRendererTests.ts +++ b/test/playwright/SharedRendererTests.ts @@ -1147,6 +1147,34 @@ export function injectSharedRendererTests(ctx: ISharedRendererTestContext): void await ctx.value.proxy.selectAll(); await pollFor(ctx.value.page, () => getCellColor(ctx.value, 1, 1), [0, 0, 255, 255]); }); + test('#4799: cursor should be in the correct position', async () => { + const theme: ITheme = { + cursor: '#0000FF' + }; + await ctx.value.page.evaluate(`window.term.options.theme = ${JSON.stringify(theme)};`); + for (let index = 0; index < 160; index++) { + await ctx.value.proxy.writeln(``); + } + await ctx.value.proxy.focus(); + await ctx.value.proxy.write('\x1b[A'); + await ctx.value.proxy.write('\x1b[A'); + await ctx.value.proxy.scrollLines(-2); + await ctx.value.proxy.blur(); + await pollFor(ctx.value.page, () => getCellColor(ctx.value, 1 , 24), [0, 0, 0, 255]); + + if (frameDetails) { + const cellSize = { + width: frameDetails.decoded.width / frameDetails.cols, + height: frameDetails.decoded.height / frameDetails.rows + }; + // First point of cell + const x = Math.floor((1 - 1/* 1- to 0-based index */) * cellSize.width); + const y = Math.floor((24 - 1/* 1- to 0-based index */) * cellSize.height); + const i = (y * frameDetails.decoded.width + x) * 4/* 4 channels per pixel */; + const firstPoint = Array.from(frameDetails.decoded.data.slice(i, i + 4)) as [number, number, number, number]; + await pollFor(ctx.value.page, () => firstPoint, [0, 0, 255, 255]); + } + }); }); } From feb75a7f4d706d3b4497dab107a5a027324fcbf6 Mon Sep 17 00:00:00 2001 From: tisilent Date: Tue, 19 Sep 2023 21:58:08 +0800 Subject: [PATCH 20/73] Add getCellColorFirstPoint function --- test/playwright/SharedRendererTests.ts | 42 ++++++++++++++++---------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/test/playwright/SharedRendererTests.ts b/test/playwright/SharedRendererTests.ts index bdfbf83a..fee539bd 100644 --- a/test/playwright/SharedRendererTests.ts +++ b/test/playwright/SharedRendererTests.ts @@ -1160,35 +1160,34 @@ export function injectSharedRendererTests(ctx: ISharedRendererTestContext): void await ctx.value.proxy.write('\x1b[A'); await ctx.value.proxy.scrollLines(-2); await ctx.value.proxy.blur(); - await pollFor(ctx.value.page, () => getCellColor(ctx.value, 1 , 24), [0, 0, 0, 255]); - - if (frameDetails) { - const cellSize = { - width: frameDetails.decoded.width / frameDetails.cols, - height: frameDetails.decoded.height / frameDetails.rows - }; - // First point of cell - const x = Math.floor((1 - 1/* 1- to 0-based index */) * cellSize.width); - const y = Math.floor((24 - 1/* 1- to 0-based index */) * cellSize.height); - const i = (y * frameDetails.decoded.width + x) * 4/* 4 channels per pixel */; - const firstPoint = Array.from(frameDetails.decoded.data.slice(i, i + 4)) as [number, number, number, number]; - await pollFor(ctx.value.page, () => firstPoint, [0, 0, 255, 255]); - } + const rows = await ctx.value.proxy.rows; + await pollFor(ctx.value.page, () => getCellColor(ctx.value, 1 , rows), [0, 0, 0, 255]); + await pollFor(ctx.value.page, () => getCellColor(ctx.value ,1 , rows, CellColorPosition.FIRST), [0, 0, 255, 255]); }); }); } +enum CellColorPosition { + CENTER = 0, + FIRST = 1 +} + /** * Gets the color of the pixel in the center of a cell. * @param ctx The test context. * @param col The 1-based column index to get the color for. * @param row The 1-based row index to get the color for. */ -function getCellColor(ctx: ITestContext, col: number, row: number): MaybeAsync<[red: number, green: number, blue: number, alpha: number]> { +function getCellColor(ctx: ITestContext, col: number, row: number, position: CellColorPosition = CellColorPosition.CENTER): MaybeAsync<[red: number, green: number, blue: number, alpha: number]> { if (!frameDetails) { return getFrameDetails(ctx).then(frameDetails => getCellColorInner(frameDetails, col, row)); } - return getCellColorInner(frameDetails, col, row); + switch (position) { + case CellColorPosition.CENTER: + return getCellColorInner(frameDetails, col, row); + case CellColorPosition.FIRST: + return getCellColorFirstPoint(frameDetails, col, row); + } } let frameDetails: { cols: number, rows: number, decoded: IImage32 } | undefined = undefined; @@ -1214,6 +1213,17 @@ function getCellColorInner(frameDetails: { cols: number, rows: number, decoded: return Array.from(frameDetails.decoded.data.slice(i, i + 4)) as [number, number, number, number]; } +function getCellColorFirstPoint(frameDetails: { cols: number, rows: number, decoded: IImage32 }, col: number, row: number): [red: number, green: number, blue: number, alpha: number] { + const cellSize = { + width: frameDetails.decoded.width / frameDetails.cols, + height: frameDetails.decoded.height / frameDetails.rows + }; + const x = Math.floor((col - 1/* 1- to 0-based index */) * cellSize.width); + const y = Math.floor((row - 1/* 1- to 0-based index */) * cellSize.height); + const i = (y * frameDetails.decoded.width + x) * 4/* 4 channels per pixel */; + return Array.from(frameDetails.decoded.data.slice(i, i + 4)) as [number, number, number, number]; +} + const COLORS_16_TO_255 = [ '#000000', '#00005f', '#000087', '#0000af', '#0000d7', '#0000ff', '#005f00', '#005f5f', '#005f87', '#005faf', '#005fd7', '#005fff', '#008700', '#00875f', '#008787', '#0087af', '#0087d7', '#0087ff', '#00af00', '#00af5f', '#00af87', '#00afaf', '#00afd7', '#00afff', '#00d700', '#00d75f', '#00d787', '#00d7af', '#00d7d7', '#00d7ff', '#00ff00', '#00ff5f', From a8ef1d49a112576d0b240c17c8c3fcb27f97bc9e Mon Sep 17 00:00:00 2001 From: tisilent Date: Tue, 19 Sep 2023 22:15:35 +0800 Subject: [PATCH 21/73] Add block cursor style confirmation --- test/playwright/SharedRendererTests.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/test/playwright/SharedRendererTests.ts b/test/playwright/SharedRendererTests.ts index fee539bd..1fe67351 100644 --- a/test/playwright/SharedRendererTests.ts +++ b/test/playwright/SharedRendererTests.ts @@ -1159,10 +1159,13 @@ export function injectSharedRendererTests(ctx: ISharedRendererTestContext): void await ctx.value.proxy.write('\x1b[A'); await ctx.value.proxy.write('\x1b[A'); await ctx.value.proxy.scrollLines(-2); - await ctx.value.proxy.blur(); const rows = await ctx.value.proxy.rows; - await pollFor(ctx.value.page, () => getCellColor(ctx.value, 1 , rows), [0, 0, 0, 255]); - await pollFor(ctx.value.page, () => getCellColor(ctx.value ,1 , rows, CellColorPosition.FIRST), [0, 0, 255, 255]); + // block cursor style + await pollFor(ctx.value.page, () => getCellColor(ctx.value, 1, rows), [0, 0, 0, 255]); + await ctx.value.proxy.blur(); + // other cursor style + await pollFor(ctx.value.page, () => getCellColor(ctx.value, 1, rows), [0, 0, 0, 255]); + await pollFor(ctx.value.page, () => getCellColor(ctx.value, 1, rows, CellColorPosition.FIRST), [0, 0, 255, 255]); }); }); } From da2687174f7fea5d7512f6118caf64d6edf7fea9 Mon Sep 17 00:00:00 2001 From: tisilent Date: Tue, 19 Sep 2023 22:49:53 +0800 Subject: [PATCH 22/73] :lipstick: --- test/playwright/SharedRendererTests.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/playwright/SharedRendererTests.ts b/test/playwright/SharedRendererTests.ts index 1fe67351..3911f0c0 100644 --- a/test/playwright/SharedRendererTests.ts +++ b/test/playwright/SharedRendererTests.ts @@ -1161,9 +1161,10 @@ export function injectSharedRendererTests(ctx: ISharedRendererTestContext): void await ctx.value.proxy.scrollLines(-2); const rows = await ctx.value.proxy.rows; // block cursor style - await pollFor(ctx.value.page, () => getCellColor(ctx.value, 1, rows), [0, 0, 0, 255]); + await pollFor(ctx.value.page, () => getCellColor(ctx.value, 1, rows), [0, 0, 255, 255]); await ctx.value.proxy.blur(); - // other cursor style + frameDetails = undefined; + // outlink cursor style await pollFor(ctx.value.page, () => getCellColor(ctx.value, 1, rows), [0, 0, 0, 255]); await pollFor(ctx.value.page, () => getCellColor(ctx.value, 1, rows, CellColorPosition.FIRST), [0, 0, 255, 255]); }); From bde7bdc11d769d601ad98f1b5242842125c55a99 Mon Sep 17 00:00:00 2001 From: Per Bothner Date: Mon, 25 Sep 2023 18:21:02 -0700 Subject: [PATCH 23/73] Change setCellFromCodePoint API and rename to setCellFromCodepoint Replace fg, bg, and eAttrs parameters by single IAttributeData parameter. In addition to making for a simpler/cleaner API, it also increases flexibility for future CellData or BufferLine changes. (Rename function to reduce risk of using accidentally using old function.) Also removed redundant eraseAttr parameter in deleteCells, insertCells, and replaceCells. --- src/common/InputHandler.ts | 34 +++++++++++++++------------------ src/common/Types.d.ts | 8 ++++---- src/common/buffer/BufferLine.ts | 34 ++++++++++++++++----------------- 3 files changed, 36 insertions(+), 40 deletions(-) diff --git a/src/common/InputHandler.ts b/src/common/InputHandler.ts index b5c91bfb..faea43c7 100644 --- a/src/common/InputHandler.ts +++ b/src/common/InputHandler.ts @@ -519,7 +519,7 @@ export class InputHandler extends Disposable implements IInputHandler { // handle wide chars: reset start_cell-1 if we would overwrite the second cell of a wide char if (this._activeBuffer.x && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x - 1) === 2) { - bufferRow.setCellFromCodePoint(this._activeBuffer.x - 1, 0, 1, curAttr.fg, curAttr.bg, curAttr.extended); + bufferRow.setCellFromCodepoint(this._activeBuffer.x - 1, 0, 1, curAttr); } let precedingJoinState = this._parser.precedingJoinState; @@ -581,7 +581,7 @@ export class InputHandler extends Disposable implements IInputHandler { } // clear left over cells to the right while (oldCol < cols) { - oldRow.setCellFromCodePoint(oldCol++, 0, 1, curAttr.fg, curAttr.bg, curAttr.extended); + oldRow.setCellFromCodepoint(oldCol++, 0, 1, curAttr); } } else { this._activeBuffer.x = cols - 1; @@ -605,7 +605,7 @@ export class InputHandler extends Disposable implements IInputHandler { bufferRow.addCodepointToCell(this._activeBuffer.x - offset, code, chWidth); for (let delta = chWidth - oldWidth; --delta >= 0; ) { - bufferRow.setCellFromCodePoint(this._activeBuffer.x++, 0, 0, curAttr.fg, curAttr.bg, curAttr.extended); + bufferRow.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, curAttr); } continue; } @@ -613,17 +613,17 @@ export class InputHandler extends Disposable implements IInputHandler { // insert mode: move characters to right if (insertMode) { // right shift cells according to the width - bufferRow.insertCells(this._activeBuffer.x, chWidth - oldWidth, this._activeBuffer.getNullCell(curAttr), curAttr); + bufferRow.insertCells(this._activeBuffer.x, chWidth - oldWidth, this._activeBuffer.getNullCell(curAttr)); // test last cell - since the last cell has only room for // a halfwidth char any fullwidth shifted there is lost // and will be set to empty cell if (bufferRow.getWidth(cols - 1) === 2) { - bufferRow.setCellFromCodePoint(cols - 1, NULL_CELL_CODE, NULL_CELL_WIDTH, curAttr.fg, curAttr.bg, curAttr.extended); + bufferRow.setCellFromCodepoint(cols - 1, NULL_CELL_CODE, NULL_CELL_WIDTH, curAttr); } } // write current char to buffer and advance cursor - bufferRow.setCellFromCodePoint(this._activeBuffer.x++, code, chWidth, curAttr.fg, curAttr.bg, curAttr.extended); + bufferRow.setCellFromCodepoint(this._activeBuffer.x++, code, chWidth, curAttr); // fullwidth char - also set next cell to placeholder stub and advance cursor // for graphemes bigger than fullwidth we can simply loop to zero @@ -631,7 +631,7 @@ export class InputHandler extends Disposable implements IInputHandler { if (chWidth > 0) { while (--chWidth) { // other than a regular empty cell a cell following a wide char has no width - bufferRow.setCellFromCodePoint(this._activeBuffer.x++, 0, 0, curAttr.fg, curAttr.bg, curAttr.extended); + bufferRow.setCellFromCodepoint(this._activeBuffer.x++, 0, 0, curAttr); } } } @@ -640,7 +640,7 @@ export class InputHandler extends Disposable implements IInputHandler { // handle wide chars: reset cell to the right if it is second cell of a wide char if (this._activeBuffer.x < cols && end - start > 0 && bufferRow.getWidth(this._activeBuffer.x) === 0 && !bufferRow.hasContent(this._activeBuffer.x)) { - bufferRow.setCellFromCodePoint(this._activeBuffer.x, 0, 1, curAttr.fg, curAttr.bg, curAttr.extended); + bufferRow.setCellFromCodepoint(this._activeBuffer.x, 0, 1, curAttr); } this._dirtyRowTracker.markDirty(this._activeBuffer.y); @@ -1145,7 +1145,6 @@ export class InputHandler extends Disposable implements IInputHandler { start, end, this._activeBuffer.getNullCell(this._eraseAttrData()), - this._eraseAttrData(), respectProtect ); if (clearWrap) { @@ -1366,8 +1365,7 @@ export class InputHandler extends Disposable implements IInputHandler { line.insertCells( this._activeBuffer.x, params.params[0] || 1, - this._activeBuffer.getNullCell(this._eraseAttrData()), - this._eraseAttrData() + this._activeBuffer.getNullCell(this._eraseAttrData()) ); this._dirtyRowTracker.markDirty(this._activeBuffer.y); } @@ -1393,8 +1391,7 @@ export class InputHandler extends Disposable implements IInputHandler { line.deleteCells( this._activeBuffer.x, params.params[0] || 1, - this._activeBuffer.getNullCell(this._eraseAttrData()), - this._eraseAttrData() + this._activeBuffer.getNullCell(this._eraseAttrData()) ); this._dirtyRowTracker.markDirty(this._activeBuffer.y); } @@ -1461,7 +1458,7 @@ export class InputHandler extends Disposable implements IInputHandler { const param = params.params[0] || 1; for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) { const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!; - line.deleteCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()), this._eraseAttrData()); + line.deleteCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData())); line.isWrapped = false; } this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom); @@ -1494,7 +1491,7 @@ export class InputHandler extends Disposable implements IInputHandler { const param = params.params[0] || 1; for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) { const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!; - line.insertCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData()), this._eraseAttrData()); + line.insertCells(0, param, this._activeBuffer.getNullCell(this._eraseAttrData())); line.isWrapped = false; } this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom); @@ -1517,7 +1514,7 @@ export class InputHandler extends Disposable implements IInputHandler { const param = params.params[0] || 1; for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) { const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!; - line.insertCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()), this._eraseAttrData()); + line.insertCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData())); line.isWrapped = false; } this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom); @@ -1540,7 +1537,7 @@ export class InputHandler extends Disposable implements IInputHandler { const param = params.params[0] || 1; for (let y = this._activeBuffer.scrollTop; y <= this._activeBuffer.scrollBottom; ++y) { const line = this._activeBuffer.lines.get(this._activeBuffer.ybase + y)!; - line.deleteCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData()), this._eraseAttrData()); + line.deleteCells(this._activeBuffer.x, param, this._activeBuffer.getNullCell(this._eraseAttrData())); line.isWrapped = false; } this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop, this._activeBuffer.scrollBottom); @@ -1562,8 +1559,7 @@ export class InputHandler extends Disposable implements IInputHandler { line.replaceCells( this._activeBuffer.x, this._activeBuffer.x + (params.params[0] || 1), - this._activeBuffer.getNullCell(this._eraseAttrData()), - this._eraseAttrData() + this._activeBuffer.getNullCell(this._eraseAttrData()) ); this._dirtyRowTracker.markDirty(this._activeBuffer.y); } diff --git a/src/common/Types.d.ts b/src/common/Types.d.ts index fc8fdf4e..eb316d8d 100644 --- a/src/common/Types.d.ts +++ b/src/common/Types.d.ts @@ -233,11 +233,11 @@ export interface IBufferLine { set(index: number, value: CharData): void; loadCell(index: number, cell: ICellData): ICellData; setCell(index: number, cell: ICellData): void; - setCellFromCodePoint(index: number, codePoint: number, width: number, fg: number, bg: number, eAttrs: IExtendedAttrs): void; + setCellFromCodepoint(index: number, codePoint: number, width: number, attrs: IAttributeData): void; addCodepointToCell(index: number, codePoint: number, width: number): void; - insertCells(pos: number, n: number, ch: ICellData, eraseAttr?: IAttributeData): void; - deleteCells(pos: number, n: number, fill: ICellData, eraseAttr?: IAttributeData): void; - replaceCells(start: number, end: number, fill: ICellData, eraseAttr?: IAttributeData, respectProtect?: boolean): void; + insertCells(pos: number, n: number, ch: ICellData): void; + deleteCells(pos: number, n: number, fill: ICellData): void; + replaceCells(start: number, end: number, fill: ICellData, respectProtect?: boolean): void; resize(cols: number, fill: ICellData): boolean; cleanupMemory(): number; fill(fillCellData: ICellData, respectProtect?: boolean): void; diff --git a/src/common/buffer/BufferLine.ts b/src/common/buffer/BufferLine.ts index a268f2bc..2852c7f1 100644 --- a/src/common/buffer/BufferLine.ts +++ b/src/common/buffer/BufferLine.ts @@ -4,7 +4,7 @@ */ import { CharData, IAttributeData, IBufferLine, ICellData, IExtendedAttrs } from 'common/Types'; -import { AttributeData, ExtendedAttrs } from 'common/buffer/AttributeData'; +import { AttributeData } from 'common/buffer/AttributeData'; import { CellData } from 'common/buffer/CellData'; import { Attributes, BgFlags, CHAR_DATA_ATTR_INDEX, CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, Content, NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR } from 'common/buffer/Constants'; import { stringFromCodePoint } from 'common/input/TextDecoder'; @@ -212,13 +212,13 @@ export class BufferLine implements IBufferLine { * Since the input handler see the incoming chars as UTF32 codepoints, * it gets an optimized access method. */ - public setCellFromCodePoint(index: number, codePoint: number, width: number, fg: number, bg: number, eAttrs: IExtendedAttrs): void { - if (bg & BgFlags.HAS_EXTENDED) { - this._extendedAttrs[index] = eAttrs; + public setCellFromCodepoint(index: number, codePoint: number, width: number, attrs: IAttributeData): void { + if (attrs.bg & BgFlags.HAS_EXTENDED) { + this._extendedAttrs[index] = attrs.extended; } this._data[index * CELL_SIZE + Cell.CONTENT] = codePoint | (width << Content.WIDTH_SHIFT); - this._data[index * CELL_SIZE + Cell.FG] = fg; - this._data[index * CELL_SIZE + Cell.BG] = bg; + this._data[index * CELL_SIZE + Cell.FG] = attrs.fg; + this._data[index * CELL_SIZE + Cell.BG] = attrs.bg; } /** @@ -253,12 +253,12 @@ export class BufferLine implements IBufferLine { this._data[index * CELL_SIZE + Cell.CONTENT] = content; } - public insertCells(pos: number, n: number, fillCellData: ICellData, eraseAttr?: IAttributeData): void { + public insertCells(pos: number, n: number, fillCellData: ICellData): void { pos %= this.length; // handle fullwidth at pos: reset cell one to the left if pos is second cell of a wide char if (pos && this.getWidth(pos - 1) === 2) { - this.setCellFromCodePoint(pos - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs()); + this.setCellFromCodepoint(pos - 1, 0, 1, fillCellData); } if (n < this.length - pos) { @@ -277,11 +277,11 @@ export class BufferLine implements IBufferLine { // handle fullwidth at line end: reset last cell if it is first cell of a wide char if (this.getWidth(this.length - 1) === 2) { - this.setCellFromCodePoint(this.length - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs()); + this.setCellFromCodepoint(this.length - 1, 0, 1, fillCellData); } } - public deleteCells(pos: number, n: number, fillCellData: ICellData, eraseAttr?: IAttributeData): void { + public deleteCells(pos: number, n: number, fillCellData: ICellData): void { pos %= this.length; if (n < this.length - pos) { const cell = new CellData(); @@ -301,21 +301,21 @@ export class BufferLine implements IBufferLine { // - reset pos-1 if wide char // - reset pos if width==0 (previous second cell of a wide char) if (pos && this.getWidth(pos - 1) === 2) { - this.setCellFromCodePoint(pos - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs()); + this.setCellFromCodepoint(pos - 1, 0, 1, fillCellData); } if (this.getWidth(pos) === 0 && !this.hasContent(pos)) { - this.setCellFromCodePoint(pos, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs()); + this.setCellFromCodepoint(pos, 0, 1, fillCellData); } } - public replaceCells(start: number, end: number, fillCellData: ICellData, eraseAttr?: IAttributeData, respectProtect: boolean = false): void { + public replaceCells(start: number, end: number, fillCellData: ICellData, respectProtect: boolean = false): void { // full branching on respectProtect==true, hopefully getting fast JIT for standard case if (respectProtect) { if (start && this.getWidth(start - 1) === 2 && !this.isProtected(start - 1)) { - this.setCellFromCodePoint(start - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs()); + this.setCellFromCodepoint(start - 1, 0, 1, fillCellData); } if (end < this.length && this.getWidth(end - 1) === 2 && !this.isProtected(end)) { - this.setCellFromCodePoint(end, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs()); + this.setCellFromCodepoint(end, 0, 1, fillCellData); } while (start < end && start < this.length) { if (!this.isProtected(start)) { @@ -328,11 +328,11 @@ export class BufferLine implements IBufferLine { // handle fullwidth at start: reset cell one to the left if start is second cell of a wide char if (start && this.getWidth(start - 1) === 2) { - this.setCellFromCodePoint(start - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs()); + this.setCellFromCodepoint(start - 1, 0, 1, fillCellData); } // handle fullwidth at last cell + 1: reset to empty cell if it is second part of a wide char if (end < this.length && this.getWidth(end - 1) === 2) { - this.setCellFromCodePoint(end, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs()); + this.setCellFromCodepoint(end, 0, 1, fillCellData); } while (start < end && start < this.length) { From cfde4d634f630b8cf09d95209afbfcebd58e45b0 Mon Sep 17 00:00:00 2001 From: tisilent Date: Sun, 1 Oct 2023 20:39:10 +0800 Subject: [PATCH 24/73] Check option changes --- addons/xterm-addon-search/src/SearchAddon.ts | 22 ++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/addons/xterm-addon-search/src/SearchAddon.ts b/addons/xterm-addon-search/src/SearchAddon.ts index 959214c9..79cd010b 100644 --- a/addons/xterm-addon-search/src/SearchAddon.ts +++ b/addons/xterm-addon-search/src/SearchAddon.ts @@ -134,9 +134,10 @@ export class SearchAddon extends Disposable implements ITerminalAddon { if (!this._terminal) { throw new Error('Cannot use addon until it has been loaded'); } + const isOptionsChanged = this._lastSearchOptions ? this._isOptionsChange(this._lastSearchOptions, searchOptions) : true; this._lastSearchOptions = searchOptions; if (searchOptions?.decorations) { - if (this._cachedSearchTerm === undefined || term !== this._cachedSearchTerm) { + if (this._cachedSearchTerm === undefined || term !== this._cachedSearchTerm || isOptionsChanged) { this._highlightAllMatches(term, searchOptions); } } @@ -302,9 +303,10 @@ export class SearchAddon extends Disposable implements ITerminalAddon { if (!this._terminal) { throw new Error('Cannot use addon until it has been loaded'); } + const isOptionsChanged = this._lastSearchOptions ? this._isOptionsChange(this._lastSearchOptions, searchOptions) : true; this._lastSearchOptions = searchOptions; if (searchOptions?.decorations) { - if (this._cachedSearchTerm === undefined || term !== this._cachedSearchTerm) { + if (this._cachedSearchTerm === undefined || term !== this._cachedSearchTerm || isOptionsChanged) { this._highlightAllMatches(term, searchOptions); } } @@ -316,6 +318,22 @@ export class SearchAddon extends Disposable implements ITerminalAddon { return found; } + private _isOptionsChange(lastSearchOptions: ISearchOptions, searchOptions?: ISearchOptions): boolean { + if (!searchOptions) { + return false; + } + if (lastSearchOptions.caseSensitive !== searchOptions.caseSensitive) { + return true; + } + if (lastSearchOptions.regex !== searchOptions.regex) { + return true; + } + if (lastSearchOptions.wholeWord !== searchOptions.wholeWord) { + return true; + } + return false; + } + private _fireResults(searchOptions?: ISearchOptions): void { if (searchOptions?.decorations) { let resultIndex = -1; From 7cbaacde4035689a24ef92e53d9de81d51389945 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Nison?= Date: Wed, 4 Oct 2023 15:42:02 +0200 Subject: [PATCH 25/73] Fixes hex color serialization --- addons/xterm-addon-serialize/src/SerializeAddon.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/xterm-addon-serialize/src/SerializeAddon.ts b/addons/xterm-addon-serialize/src/SerializeAddon.ts index 7a2db089..8014c0f1 100644 --- a/addons/xterm-addon-serialize/src/SerializeAddon.ts +++ b/addons/xterm-addon-serialize/src/SerializeAddon.ts @@ -604,7 +604,7 @@ export class HTMLSerializeHandler extends BaseSerializeHandler { (color >> 8) & 255, (color ) & 255 ]; - return rgb.map(x => this._padStart(x.toString(16), 2, '0')).join(''); + return '#' + rgb.map(x => this._padStart(x.toString(16), 2, '0')).join(''); } if (isFg ? cell.isFgPalette() : cell.isBgPalette()) { return this._ansiColors[color].css; From 194b810ad518150198a3915563e8821a3264fd07 Mon Sep 17 00:00:00 2001 From: Taige Wang Date: Sun, 8 Oct 2023 13:03:28 +0300 Subject: [PATCH 26/73] Fix Webgl2 compatability on legacy Safari with webgl2 enabled --- addons/xterm-addon-webgl/src/WebglAddon.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/addons/xterm-addon-webgl/src/WebglAddon.ts b/addons/xterm-addon-webgl/src/WebglAddon.ts index 3e091f0b..61a8e2ef 100644 --- a/addons/xterm-addon-webgl/src/WebglAddon.ts +++ b/addons/xterm-addon-webgl/src/WebglAddon.ts @@ -10,6 +10,7 @@ import { Disposable, toDisposable } from 'common/Lifecycle'; import { getSafariVersion, isSafari } from 'common/Platform'; import { ICoreService, IDecorationService, ILogService, IOptionsService } from 'common/services/Services'; import { ITerminalAddon, Terminal } from 'xterm'; +import { IWebGL2RenderingContext } from './Types'; import { WebglRenderer } from './WebglRenderer'; import { setTraceLogger } from 'common/services/LogService'; @@ -30,7 +31,16 @@ export class WebglAddon extends Disposable implements ITerminalAddon { private _preserveDrawingBuffer?: boolean ) { if (isSafari && getSafariVersion() < 16) { - throw new Error('Webgl2 is only supported on Safari 16 and above'); + // Perform an extra check to determine if Webgl2 is manually enabled in developer settings + const contextAttributes = { + antialias: false, + depth: false, + preserveDrawingBuffer: true + }; + const gl = document.createElement('canvas').getContext('webgl2', contextAttributes) as IWebGL2RenderingContext; + if (!gl) { + throw new Error('Webgl2 is only supported on Safari 16 and above'); + } } super(); } From d3e075f37bfb92b47729d0f8f2b106a354c3b2df Mon Sep 17 00:00:00 2001 From: tisilent Date: Tue, 10 Oct 2023 15:54:15 +0800 Subject: [PATCH 27/73] handle selection when resizing --- src/browser/renderer/dom/DomRenderer.ts | 27 +++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/browser/renderer/dom/DomRenderer.ts b/src/browser/renderer/dom/DomRenderer.ts index 2e9f3701..79f658b6 100644 --- a/src/browser/renderer/dom/DomRenderer.ts +++ b/src/browser/renderer/dom/DomRenderer.ts @@ -25,6 +25,11 @@ const SELECTION_CLASS = 'xterm-selection'; let nextTerminalId = 1; +interface ISelectionState { + columnSelectMode: boolean; + selectionStart: [number, number]| undefined; + selectionEnd: [number, number]| undefined; +} /** * A fallback renderer for when canvas is slow. This is not meant to be @@ -41,6 +46,11 @@ export class DomRenderer extends Disposable implements IRenderer { private _rowElements: HTMLElement[] = []; private _selectionContainer: HTMLElement; private _widthCache: WidthCache; + private _selectionState: ISelectionState = { + columnSelectMode: false, + selectionStart: undefined, + selectionEnd: undefined + }; public dimensions: IRenderDimensions; @@ -291,6 +301,9 @@ export class DomRenderer extends Disposable implements IRenderer { public handleResize(cols: number, rows: number): void { this._refreshRowElements(cols, rows); this._updateDimensions(); + if (this._selectionState.selectionStart && this._selectionState.selectionEnd) { + this.handleSelectionChanged(this._selectionState.selectionStart, this._selectionState.selectionEnd, this._selectionState.columnSelectMode); + } } public handleCharSizeChanged(): void { @@ -310,6 +323,10 @@ export class DomRenderer extends Disposable implements IRenderer { } public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void { + this._selectionState.selectionStart = start; + this._selectionState.selectionEnd = end; + this._selectionState.columnSelectMode = columnSelectMode; + // Remove all selections this._selectionContainer.replaceChildren(); this._rowFactory.handleSelectionChanged(start, end, columnSelectMode); @@ -365,10 +382,16 @@ export class DomRenderer extends Disposable implements IRenderer { */ private _createSelectionElement(row: number, colStart: number, colEnd: number, rowCount: number = 1): HTMLElement { const element = this._document.createElement('div'); + const left = colStart * this.dimensions.css.cell.width; + let width = this.dimensions.css.cell.width * (colEnd - colStart); + if (left + width > this.dimensions.css.canvas.width) { + width = this.dimensions.css.canvas.width - left; + } + element.style.height = `${rowCount * this.dimensions.css.cell.height}px`; element.style.top = `${row * this.dimensions.css.cell.height}px`; - element.style.left = `${colStart * this.dimensions.css.cell.width}px`; - element.style.width = `${this.dimensions.css.cell.width * (colEnd - colStart)}px`; + element.style.left = `${left}px`; + element.style.width = `${width}px`; return element; } From 6b5fc260caf7bc310a760041161774ec5f536288 Mon Sep 17 00:00:00 2001 From: tisilent Date: Tue, 10 Oct 2023 22:53:01 +0800 Subject: [PATCH 28/73] Dom Renderer using SelectionRenderModel --- .../xterm-addon-canvas/src/BaseRenderLayer.ts | 2 +- addons/xterm-addon-webgl/src/WebglRenderer.ts | 2 +- src/browser/Terminal.ts | 2 +- src/browser/renderer/dom/DomRenderer.ts | 36 +++++++------------ .../renderer/shared/SelectionRenderModel.ts | 13 +++++-- src/browser/renderer/shared/Types.d.ts | 4 +-- 6 files changed, 27 insertions(+), 32 deletions(-) diff --git a/addons/xterm-addon-canvas/src/BaseRenderLayer.ts b/addons/xterm-addon-canvas/src/BaseRenderLayer.ts index 8c199336..ba5dca66 100644 --- a/addons/xterm-addon-canvas/src/BaseRenderLayer.ts +++ b/addons/xterm-addon-canvas/src/BaseRenderLayer.ts @@ -91,7 +91,7 @@ export abstract class BaseRenderLayer extends Disposable implements IRenderLayer public handleGridChanged(startRow: number, endRow: number): void {} public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void { - this._selectionModel.update(this._terminal, start, end, columnSelectMode); + this._selectionModel.update((this._terminal as any)._core, start, end, columnSelectMode); } protected _setTransparency(alpha: boolean): void { diff --git a/addons/xterm-addon-webgl/src/WebglRenderer.ts b/addons/xterm-addon-webgl/src/WebglRenderer.ts index 8cc81b92..35fbfcb3 100644 --- a/addons/xterm-addon-webgl/src/WebglRenderer.ts +++ b/addons/xterm-addon-webgl/src/WebglRenderer.ts @@ -219,7 +219,7 @@ export class WebglRenderer extends Disposable implements IRenderer { for (const l of this._renderLayers) { l.handleSelectionChanged(this._terminal, start, end, columnSelectMode); } - this._model.selection.update(this._terminal, start, end, columnSelectMode); + this._model.selection.update(this._core, start, end, columnSelectMode); this._requestRedrawViewport(); } diff --git a/src/browser/Terminal.ts b/src/browser/Terminal.ts index 18af3e4e..4198c84f 100644 --- a/src/browser/Terminal.ts +++ b/src/browser/Terminal.ts @@ -561,7 +561,7 @@ export class Terminal extends CoreTerminal implements ITerminal { } private _createRenderer(): IRenderer { - return this._instantiationService.createInstance(DomRenderer, this._document!, this.element!, this.screenElement!, this._viewportElement!, this._helperContainer!, this.linkifier2); + return this._instantiationService.createInstance(DomRenderer, this, this._document!, this.element!, this.screenElement!, this._viewportElement!, this._helperContainer!, this.linkifier2); } /** diff --git a/src/browser/renderer/dom/DomRenderer.ts b/src/browser/renderer/dom/DomRenderer.ts index 79f658b6..1549b130 100644 --- a/src/browser/renderer/dom/DomRenderer.ts +++ b/src/browser/renderer/dom/DomRenderer.ts @@ -7,9 +7,10 @@ import { DomRendererRowFactory, RowCss } from 'browser/renderer/dom/DomRendererR import { WidthCache } from 'browser/renderer/dom/WidthCache'; import { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants'; import { createRenderDimensions } from 'browser/renderer/shared/RendererUtils'; -import { IRenderDimensions, IRenderer, IRequestRedrawEvent } from 'browser/renderer/shared/Types'; +import { createSelectionRenderModel } from 'browser/renderer/shared/SelectionRenderModel'; +import { IRenderDimensions, IRenderer, IRequestRedrawEvent, ISelectionRenderModel } from 'browser/renderer/shared/Types'; import { ICharSizeService, ICoreBrowserService, IThemeService } from 'browser/services/Services'; -import { ILinkifier2, ILinkifierEvent, ReadonlyColorSet } from 'browser/Types'; +import { ILinkifier2, ILinkifierEvent, ITerminal, ReadonlyColorSet } from 'browser/Types'; import { color } from 'common/Color'; import { EventEmitter } from 'common/EventEmitter'; import { Disposable, toDisposable } from 'common/Lifecycle'; @@ -25,12 +26,6 @@ const SELECTION_CLASS = 'xterm-selection'; let nextTerminalId = 1; -interface ISelectionState { - columnSelectMode: boolean; - selectionStart: [number, number]| undefined; - selectionEnd: [number, number]| undefined; -} - /** * A fallback renderer for when canvas is slow. This is not meant to be * particularly fast or feature complete, more just stable and usable for when @@ -46,17 +41,14 @@ export class DomRenderer extends Disposable implements IRenderer { private _rowElements: HTMLElement[] = []; private _selectionContainer: HTMLElement; private _widthCache: WidthCache; - private _selectionState: ISelectionState = { - columnSelectMode: false, - selectionStart: undefined, - selectionEnd: undefined - }; + private _selectionRenderModel: ISelectionRenderModel = createSelectionRenderModel(); public dimensions: IRenderDimensions; public readonly onRequestRedraw = this.register(new EventEmitter()).event; constructor( + private readonly _terminal: ITerminal, private readonly _document: Document, private readonly _element: HTMLElement, private readonly _screenElement: HTMLElement, @@ -301,9 +293,7 @@ export class DomRenderer extends Disposable implements IRenderer { public handleResize(cols: number, rows: number): void { this._refreshRowElements(cols, rows); this._updateDimensions(); - if (this._selectionState.selectionStart && this._selectionState.selectionEnd) { - this.handleSelectionChanged(this._selectionState.selectionStart, this._selectionState.selectionEnd, this._selectionState.columnSelectMode); - } + this.handleSelectionChanged(this._selectionRenderModel.selectionStart, this._selectionRenderModel.selectionEnd, this._selectionRenderModel.columnSelectMode); } public handleCharSizeChanged(): void { @@ -323,10 +313,6 @@ export class DomRenderer extends Disposable implements IRenderer { } public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void { - this._selectionState.selectionStart = start; - this._selectionState.selectionEnd = end; - this._selectionState.columnSelectMode = columnSelectMode; - // Remove all selections this._selectionContainer.replaceChildren(); this._rowFactory.handleSelectionChanged(start, end, columnSelectMode); @@ -337,11 +323,13 @@ export class DomRenderer extends Disposable implements IRenderer { return; } + this._selectionRenderModel.update(this._terminal, start, end, columnSelectMode); + // Translate from buffer position to viewport position - const viewportStartRow = start[1] - this._bufferService.buffer.ydisp; - const viewportEndRow = end[1] - this._bufferService.buffer.ydisp; - const viewportCappedStartRow = Math.max(viewportStartRow, 0); - const viewportCappedEndRow = Math.min(viewportEndRow, this._bufferService.rows - 1); + const viewportStartRow = this._selectionRenderModel.viewportStartRow; + const viewportEndRow = this._selectionRenderModel.viewportEndRow; + const viewportCappedStartRow = this._selectionRenderModel.viewportCappedStartRow; + const viewportCappedEndRow = this._selectionRenderModel.viewportCappedEndRow; // No need to draw the selection if (viewportCappedStartRow >= this._bufferService.rows || viewportCappedEndRow < 0) { diff --git a/src/browser/renderer/shared/SelectionRenderModel.ts b/src/browser/renderer/shared/SelectionRenderModel.ts index db375778..3363ce9a 100644 --- a/src/browser/renderer/shared/SelectionRenderModel.ts +++ b/src/browser/renderer/shared/SelectionRenderModel.ts @@ -3,7 +3,9 @@ * @license MIT */ +import { ITerminal } from 'browser/Types'; import { ISelectionRenderModel } from 'browser/renderer/shared/Types'; +import { BufferNamespaceApi } from 'common/public/BufferNamespaceApi'; import { Terminal } from 'xterm'; class SelectionRenderModel implements ISelectionRenderModel { @@ -17,6 +19,7 @@ class SelectionRenderModel implements ISelectionRenderModel { public endCol!: number; public selectionStart: [number, number] | undefined; public selectionEnd: [number, number] | undefined; + private _buffer: BufferNamespaceApi | undefined; constructor() { this.clear(); @@ -35,7 +38,11 @@ class SelectionRenderModel implements ISelectionRenderModel { this.selectionEnd = undefined; } - public update(terminal: Terminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void { + public update(terminal: ITerminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void { + if (!this._buffer) { + this._buffer = new BufferNamespaceApi(terminal); + } + this.selectionStart = start; this.selectionEnd = end; // Selection does not exist @@ -45,8 +52,8 @@ class SelectionRenderModel implements ISelectionRenderModel { } // Translate from buffer position to viewport position - const viewportStartRow = start[1] - terminal.buffer.active.viewportY; - const viewportEndRow = end[1] - terminal.buffer.active.viewportY; + const viewportStartRow = start[1] - this._buffer.active.viewportY; + const viewportEndRow = end[1] - this._buffer.active.viewportY; const viewportCappedStartRow = Math.max(viewportStartRow, 0); const viewportCappedEndRow = Math.min(viewportEndRow, terminal.rows - 1); diff --git a/src/browser/renderer/shared/Types.d.ts b/src/browser/renderer/shared/Types.d.ts index a7e55e72..b42e7090 100644 --- a/src/browser/renderer/shared/Types.d.ts +++ b/src/browser/renderer/shared/Types.d.ts @@ -4,7 +4,7 @@ */ import { FontWeight, Terminal } from 'xterm'; -import { IColorSet } from 'browser/Types'; +import { IColorSet, ITerminal } from 'browser/Types'; import { IDisposable } from 'common/Types'; import { IEvent } from 'common/EventEmitter'; @@ -168,6 +168,6 @@ export interface ISelectionRenderModel { readonly selectionStart: [number, number] | undefined; readonly selectionEnd: [number, number] | undefined; clear(): void; - update(terminal: Terminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode?: boolean): void; + update(terminal: ITerminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode?: boolean): void; isCellSelected(terminal: Terminal, x: number, y: number): boolean; } From 023c778c4d076662391d375e7809d80bceb31a8e Mon Sep 17 00:00:00 2001 From: Jason Lin Date: Wed, 11 Oct 2023 14:59:35 +1100 Subject: [PATCH 29/73] Send correct code for ctrl+[alt+]+backspace We should send ^H (instead of ^?) for ctrl+backspace. This is what xterm and gnome-terminal do. --- src/common/input/Keyboard.test.ts | 15 +++++++++++++++ src/common/input/Keyboard.ts | 5 ++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/common/input/Keyboard.test.ts b/src/common/input/Keyboard.test.ts index f2d0936b..c598fc58 100644 --- a/src/common/input/Keyboard.test.ts +++ b/src/common/input/Keyboard.test.ts @@ -106,6 +106,21 @@ describe('Keyboard', () => { it('should return \\x1b[5B for ctrl+down', () => { assert.equal(testEvaluateKeyboardEvent({ ctrlKey: true, keyCode: 40 }).key, '\x1b[1;5B'); // CSI 5 B }); + it('should return \\x08 for ctrl+backspace', () => { + assert.equal(testEvaluateKeyboardEvent({ ctrlKey: true, keyCode: 8 }).key, '\x08'); + }); + it('should return \\x1b\\x7f for alt+backspace', () => { + assert.equal(testEvaluateKeyboardEvent({ altKey: true, keyCode: 8 }).key, '\x1b\x7f'); + }); + it('should return \\x1b\\x08 for ctrl+alt+backspace', () => { + assert.equal(testEvaluateKeyboardEvent({ ctrlKey: true, altKey: true, keyCode: 8 }).key, '\x1b\x08'); + }); + it('should return \\x1b[3;2~ for shift+delete', () => { + assert.equal(testEvaluateKeyboardEvent({ shiftKey: true, keyCode: 46 }).key, '\x1b[3;2~'); + }); + it('should return \\x1b[3;3~ for alt+delete', () => { + assert.equal(testEvaluateKeyboardEvent({ altKey: true, keyCode: 46 }).key, '\x1b[3;3~'); + }); describe('On non-macOS platforms', () => { // Evalueate alt + arrow key movement, which is a feature of terminal emulators but not VT100 diff --git a/src/common/input/Keyboard.ts b/src/common/input/Keyboard.ts index 9420a974..b86eeac4 100644 --- a/src/common/input/Keyboard.ts +++ b/src/common/input/Keyboard.ts @@ -83,11 +83,10 @@ export function evaluateKeyboardEvent( break; case 8: // backspace + result.key = ev.ctrlKey ? '\b' : C0.DEL; // ^H or ^? if (ev.altKey) { - result.key = C0.ESC + C0.DEL; // \e ^? - break; + result.key = C0.ESC + result.key; } - result.key = C0.DEL; // ^? break; case 9: // tab From 1b940de0bf24f4a4b38a19c06c62ce1cd1794c17 Mon Sep 17 00:00:00 2001 From: Jason Lin Date: Fri, 1 Sep 2023 17:00:15 +1000 Subject: [PATCH 30/73] Allow selection in the a11y tree and sync the selection to terminal --- css/xterm.css | 11 ++- src/browser/AccessibilityManager.ts | 134 ++++++++++++++++++++++++++- src/common/Types.d.ts | 2 +- src/common/buffer/BufferLine.test.ts | 121 +++++++++++++++--------- src/common/buffer/BufferLine.ts | 24 ++++- 5 files changed, 239 insertions(+), 53 deletions(-) diff --git a/css/xterm.css b/css/xterm.css index 74acc267..e97b6439 100644 --- a/css/xterm.css +++ b/css/xterm.css @@ -140,7 +140,7 @@ cursor: crosshair; } -.xterm .xterm-accessibility, +.xterm .xterm-accessibility:not(.debug), .xterm .xterm-message { position: absolute; left: 0; @@ -152,6 +152,15 @@ pointer-events: none; } +.xterm .xterm-accessibility-tree:not(.debug) *::selection { + color: transparent; +} + +.xterm .xterm-accessibility-tree { + user-select: text; + white-space: pre; +} + .xterm .live-region { position: absolute; left: -9999px; diff --git a/src/browser/AccessibilityManager.ts b/src/browser/AccessibilityManager.ts index c878bd0a..c36bae12 100644 --- a/src/browser/AccessibilityManager.ts +++ b/src/browser/AccessibilityManager.ts @@ -19,11 +19,17 @@ const enum BoundaryPosition { BOTTOM } +// Turn this on to unhide the accessibility tree and display it under +// (instead of overlapping with) the terminal. +const DEBUG = false; + export class AccessibilityManager extends Disposable { + private _debugRootContainer: HTMLElement | undefined; private _accessibilityContainer: HTMLElement; private _rowContainer: HTMLElement; private _rowElements: HTMLElement[]; + private _rowColumns: WeakMap = new WeakMap(); private _liveRegion: HTMLElement; private _liveRegionLineCount: number = 0; @@ -81,7 +87,23 @@ export class AccessibilityManager extends Disposable { if (!this._terminal.element) { throw new Error('Cannot enable accessibility before Terminal.open'); } - this._terminal.element.insertAdjacentElement('afterbegin', this._accessibilityContainer); + + if (DEBUG) { + this._accessibilityContainer.classList.add('debug'); + this._rowContainer.classList.add('debug'); + + // Use a `
` container so that the css will still apply. + this._debugRootContainer = document.createElement('div'); + this._debugRootContainer.classList.add('xterm'); + + this._debugRootContainer.appendChild(document.createTextNode('------start a11y------')); + this._debugRootContainer.appendChild(this._accessibilityContainer); + this._debugRootContainer.appendChild(document.createTextNode('------end a11y------')); + + this._terminal.element.insertAdjacentElement('afterend', this._debugRootContainer); + } else { + this._terminal.element.insertAdjacentElement('afterbegin', this._accessibilityContainer); + } this.register(this._terminal.onResize(e => this._handleResize(e.rows))); this.register(this._terminal.onRender(e => this._refreshRows(e.start, e.end))); @@ -93,6 +115,7 @@ export class AccessibilityManager extends Disposable { this.register(this._terminal.onKey(e => this._handleKey(e.key))); this.register(this._terminal.onBlur(() => this._clearLiveRegion())); this.register(this._renderService.onDimensionsChange(() => this._refreshRowsDimensions())); + this.register(addDisposableDomListener(document, 'selectionchange', () => this._handleSelectionChange())); this._screenDprMonitor = new ScreenDprMonitor(window); this.register(this._screenDprMonitor); @@ -103,7 +126,11 @@ export class AccessibilityManager extends Disposable { this._refreshRows(); this.register(toDisposable(() => { - this._accessibilityContainer.remove(); + if (DEBUG) { + this._debugRootContainer!.remove(); + } else { + this._accessibilityContainer.remove(); + } this._rowElements.length = 0; })); } @@ -156,14 +183,18 @@ export class AccessibilityManager extends Disposable { const buffer: IBuffer = this._terminal.buffer; const setSize = buffer.lines.length.toString(); for (let i = start; i <= end; i++) { - const lineData = buffer.translateBufferLineToString(buffer.ydisp + i, true); + const line = buffer.lines.get(buffer.ydisp + i); + const columns: number[] = []; + const lineData = line?.translateToString(true, undefined, undefined, columns) || ''; const posInSet = (buffer.ydisp + i + 1).toString(); const element = this._rowElements[i]; if (element) { if (lineData.length === 0) { element.innerText = '\u00a0'; + this._rowColumns.set(element, [0]); } else { element.textContent = lineData; + this._rowColumns.set(element, columns); } element.setAttribute('aria-posinset', posInSet); element.setAttribute('aria-setsize', setSize); @@ -240,6 +271,103 @@ export class AccessibilityManager extends Disposable { e.stopImmediatePropagation(); } + private _handleSelectionChange(): void { + if (this._rowElements.length === 0) { + return; + } + + const selection = document.getSelection(); + if (!selection) { + return; + } + + if (selection.isCollapsed) { + // Only do something when the anchorNode is inside the row container. This + // behavior mirrors what we do with mouse --- if the mouse clicks + // somewhere outside of the terminal, we don't clear the selection. + if (this._rowContainer.contains(selection.anchorNode)) { + this._terminal.clearSelection(); + } + return; + } + + if (!selection.anchorNode || !selection.focusNode) { + console.error('anchorNode and/or focusNode are null'); + return; + } + + // Sort the two selection points in document order. + let begin = { node: selection.anchorNode, offset: selection.anchorOffset }; + let end = { node: selection.focusNode, offset: selection.focusOffset }; + if ((begin.node.compareDocumentPosition(end.node) & Node.DOCUMENT_POSITION_PRECEDING) || (begin.node === end.node && begin.offset > end.offset) ) { + [begin, end] = [end, begin]; + } + + // Clamp begin/end to the inside of the row container. + if (begin.node.compareDocumentPosition(this._rowElements[0]) & (Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_FOLLOWING)) { + begin = { node: this._rowElements[0].childNodes[0], offset: 0 }; + } + if (!this._rowContainer.contains(begin.node)) { + // This happens when `begin` is below the last row. + return; + } + const lastRowElement = this._rowElements.slice(-1)[0]; + if (end.node.compareDocumentPosition(lastRowElement) & (Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_PRECEDING)) { + end = { + node: lastRowElement, + offset: lastRowElement.textContent?.length ?? 0 + }; + } + if (!this._rowContainer.contains(end.node)) { + // This happens when `end` is above the first row. + return; + } + + const toRowColumn = ({ node, offset }: typeof begin): {row: number, column: number} | null => { + // `node` is either the row element or the Text node inside it. + const rowElement: any = node instanceof Text ? node.parentNode : node; + let row = parseInt(rowElement?.getAttribute('aria-posinset'), 10) - 1; + if (isNaN(row)) { + console.warn('row is invalid. Race condition?'); + return null; + } + + const columns = this._rowColumns.get(rowElement); + if (!columns) { + console.warn('columns is null. Race condition?'); + return null; + } + + let column = offset < columns.length ? columns[offset] : columns.slice(-1)[0] + 1; + if (column >= this._terminal.cols) { + ++row; + column = 0; + } + return { + row, + column + }; + }; + + const beginRowColumn = toRowColumn(begin); + const endRowColumn = toRowColumn(end); + + if (!beginRowColumn || !endRowColumn) { + return; + } + + if (beginRowColumn.row > endRowColumn.row || (beginRowColumn.row === endRowColumn.row && beginRowColumn.column >= endRowColumn.column)) { + // This should not happen unless we have some bugs. + throw new Error('invalid range'); + } + + this._terminal.select( + beginRowColumn.column, + beginRowColumn.row, + (endRowColumn.row - beginRowColumn.row) * this._terminal.cols - beginRowColumn.column + endRowColumn.column + ); + } + private _handleResize(rows: number): void { // Remove bottom boundary listener this._rowElements[this._rowElements.length - 1].removeEventListener('focus', this._bottomBoundaryFocusListener); diff --git a/src/common/Types.d.ts b/src/common/Types.d.ts index fc8fdf4e..f76e0fee 100644 --- a/src/common/Types.d.ts +++ b/src/common/Types.d.ts @@ -245,7 +245,7 @@ export interface IBufferLine { clone(): IBufferLine; getTrimmedLength(): number; getNoBgTrimmedLength(): number; - translateToString(trimRight?: boolean, startCol?: number, endCol?: number): string; + translateToString(trimRight?: boolean, startCol?: number, endCol?: number, outColumns?: number[]): string; /* direct access to cell attrs */ getWidth(index: number): number; diff --git a/src/common/buffer/BufferLine.test.ts b/src/common/buffer/BufferLine.test.ts index f2819aa8..ed8df0f9 100644 --- a/src/common/buffer/BufferLine.test.ts +++ b/src/common/buffer/BufferLine.test.ts @@ -331,56 +331,75 @@ describe('BufferLine', function(): void { describe('translateToString with and w\'o trimming', function(): void { it('empty line', function(): void { const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]), false); - assert.equal(line.translateToString(false), ' '); - assert.equal(line.translateToString(true), ''); + const columns: number[] = []; + assert.equal(line.translateToString(false, undefined, undefined, columns), ' '); + assert.deepEqual(columns, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); + assert.equal(line.translateToString(true, undefined, undefined, columns), ''); + assert.deepEqual(columns, []); }); it('ASCII', function(): void { + const columns: number[] = []; const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]), false); line.setCell(0, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); line.setCell(2, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); line.setCell(4, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); line.setCell(5, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); - assert.equal(line.translateToString(false), 'a a aa '); - assert.equal(line.translateToString(true), 'a a aa'); - assert.equal(line.translateToString(false, 0, 5), 'a a a'); - assert.equal(line.translateToString(false, 0, 4), 'a a '); - assert.equal(line.translateToString(false, 0, 3), 'a a'); - assert.equal(line.translateToString(true, 0, 5), 'a a a'); - assert.equal(line.translateToString(true, 0, 4), 'a a '); - assert.equal(line.translateToString(true, 0, 3), 'a a'); + assert.equal(line.translateToString(false, undefined, undefined, columns), 'a a aa '); + assert.deepEqual(columns, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); + assert.equal(line.translateToString(true, undefined, undefined, columns), 'a a aa'); + assert.deepEqual(columns, [0, 1, 2, 3, 4, 5]); + for (const trimRight of [true, false]) { + assert.equal(line.translateToString(trimRight, 0, 5, columns), 'a a a'); + assert.deepEqual(columns, [0, 1, 2, 3, 4]); + assert.equal(line.translateToString(trimRight, 0, 4, columns), 'a a '); + assert.deepEqual(columns, [0, 1, 2, 3]); + assert.equal(line.translateToString(trimRight, 0, 3, columns), 'a a'); + assert.deepEqual(columns, [0, 1, 2]); + } }); it('surrogate', function(): void { + const columns: number[] = []; const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]), false); line.setCell(0, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); line.setCell(2, CellData.fromCharData([1, '𝄞', 1, '𝄞'.charCodeAt(0)])); line.setCell(4, CellData.fromCharData([1, '𝄞', 1, '𝄞'.charCodeAt(0)])); line.setCell(5, CellData.fromCharData([1, '𝄞', 1, '𝄞'.charCodeAt(0)])); - assert.equal(line.translateToString(false), 'a 𝄞 𝄞𝄞 '); - assert.equal(line.translateToString(true), 'a 𝄞 𝄞𝄞'); - assert.equal(line.translateToString(false, 0, 5), 'a 𝄞 𝄞'); - assert.equal(line.translateToString(false, 0, 4), 'a 𝄞 '); - assert.equal(line.translateToString(false, 0, 3), 'a 𝄞'); - assert.equal(line.translateToString(true, 0, 5), 'a 𝄞 𝄞'); - assert.equal(line.translateToString(true, 0, 4), 'a 𝄞 '); - assert.equal(line.translateToString(true, 0, 3), 'a 𝄞'); + assert.equal(line.translateToString(false, undefined, undefined, columns), 'a 𝄞 𝄞𝄞 '); + assert.deepEqual(columns, [0, 1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 8, 9]); + assert.equal(line.translateToString(true, undefined, undefined, columns), 'a 𝄞 𝄞𝄞'); + assert.deepEqual(columns, [0, 1, 2, 2, 3, 4, 4, 5, 5]); + for (const trimRight of [true, false]) { + assert.equal(line.translateToString(trimRight, 0, 5, columns), 'a 𝄞 𝄞'); + assert.deepEqual(columns, [0, 1, 2, 2, 3, 4, 4]); + assert.equal(line.translateToString(trimRight, 0, 4, columns), 'a 𝄞 '); + assert.deepEqual(columns, [0, 1, 2, 2, 3]); + assert.equal(line.translateToString(trimRight, 0, 3, columns), 'a 𝄞'); + assert.deepEqual(columns, [0, 1, 2, 2]); + } }); it('combining', function(): void { + const columns: number[] = []; const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]), false); line.setCell(0, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); line.setCell(2, CellData.fromCharData([1, 'e\u0301', 1, '\u0301'.charCodeAt(0)])); line.setCell(4, CellData.fromCharData([1, 'e\u0301', 1, '\u0301'.charCodeAt(0)])); line.setCell(5, CellData.fromCharData([1, 'e\u0301', 1, '\u0301'.charCodeAt(0)])); - assert.equal(line.translateToString(false), 'a e\u0301 e\u0301e\u0301 '); - assert.equal(line.translateToString(true), 'a e\u0301 e\u0301e\u0301'); - assert.equal(line.translateToString(false, 0, 5), 'a e\u0301 e\u0301'); - assert.equal(line.translateToString(false, 0, 4), 'a e\u0301 '); - assert.equal(line.translateToString(false, 0, 3), 'a e\u0301'); - assert.equal(line.translateToString(true, 0, 5), 'a e\u0301 e\u0301'); - assert.equal(line.translateToString(true, 0, 4), 'a e\u0301 '); - assert.equal(line.translateToString(true, 0, 3), 'a e\u0301'); + assert.equal(line.translateToString(false, undefined, undefined, columns), 'a e\u0301 e\u0301e\u0301 '); + assert.deepEqual(columns, [0, 1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 8, 9]); + assert.equal(line.translateToString(true, undefined, undefined, columns), 'a e\u0301 e\u0301e\u0301'); + assert.deepEqual(columns, [0, 1, 2, 2, 3, 4, 4, 5, 5]); + for (const trimRight of [true, false]) { + assert.equal(line.translateToString(trimRight, 0, 5, columns), 'a e\u0301 e\u0301'); + assert.deepEqual(columns, [0, 1, 2, 2, 3, 4, 4]); + assert.equal(line.translateToString(trimRight, 0, 4, columns), 'a e\u0301 '); + assert.deepEqual(columns, [0, 1, 2, 2, 3]); + assert.equal(line.translateToString(trimRight, 0, 3, columns), 'a e\u0301'); + assert.deepEqual(columns, [0, 1, 2, 2]); + } }); it('fullwidth', function(): void { + const columns: number[] = []; const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]), false); line.setCell(0, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); line.setCell(2, CellData.fromCharData([1, '1', 2, '1'.charCodeAt(0)])); @@ -389,43 +408,55 @@ describe('BufferLine', function(): void { line.setCell(6, CellData.fromCharData([0, '', 0, 0])); line.setCell(7, CellData.fromCharData([1, '1', 2, '1'.charCodeAt(0)])); line.setCell(8, CellData.fromCharData([0, '', 0, 0])); - assert.equal(line.translateToString(false), 'a 1 11 '); - assert.equal(line.translateToString(true), 'a 1 11'); - assert.equal(line.translateToString(false, 0, 7), 'a 1 1'); - assert.equal(line.translateToString(false, 0, 6), 'a 1 1'); - assert.equal(line.translateToString(false, 0, 5), 'a 1 '); - assert.equal(line.translateToString(false, 0, 4), 'a 1'); - assert.equal(line.translateToString(false, 0, 3), 'a 1'); - assert.equal(line.translateToString(false, 0, 2), 'a '); - assert.equal(line.translateToString(true, 0, 7), 'a 1 1'); - assert.equal(line.translateToString(true, 0, 6), 'a 1 1'); - assert.equal(line.translateToString(true, 0, 5), 'a 1 '); - assert.equal(line.translateToString(true, 0, 4), 'a 1'); - assert.equal(line.translateToString(true, 0, 3), 'a 1'); - assert.equal(line.translateToString(true, 0, 2), 'a '); + assert.equal(line.translateToString(false, undefined, undefined, columns), 'a 1 11 '); + assert.deepEqual(columns, [0, 1, 2, 4, 5, 7, 9]); + assert.equal(line.translateToString(true, undefined, undefined, columns), 'a 1 11'); + assert.deepEqual(columns, [0, 1, 2, 4, 5, 7]); + for (const trimRight of [true, false]) { + assert.equal(line.translateToString(trimRight, 0, 7, columns), 'a 1 1'); + assert.deepEqual(columns, [0, 1, 2, 4, 5]); + assert.equal(line.translateToString(trimRight, 0, 6, columns), 'a 1 1'); + assert.deepEqual(columns, [0, 1, 2, 4, 5]); + assert.equal(line.translateToString(trimRight, 0, 5, columns), 'a 1 '); + assert.deepEqual(columns, [0, 1, 2, 4]); + assert.equal(line.translateToString(trimRight, 0, 4, columns), 'a 1'); + assert.deepEqual(columns, [0, 1, 2]); + assert.equal(line.translateToString(trimRight, 0, 3, columns), 'a 1'); + assert.deepEqual(columns, [0, 1, 2]); + assert.equal(line.translateToString(trimRight, 0, 2, columns), 'a '); + assert.deepEqual(columns, [0, 1]); + } }); it('space at end', function(): void { + const columns: number[] = []; const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]), false); line.setCell(0, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); line.setCell(2, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); line.setCell(4, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); line.setCell(5, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); line.setCell(6, CellData.fromCharData([1, ' ', 1, ' '.charCodeAt(0)])); - assert.equal(line.translateToString(false), 'a a aa '); - assert.equal(line.translateToString(true), 'a a aa '); + assert.equal(line.translateToString(false, undefined, undefined, columns), 'a a aa '); + assert.deepEqual(columns, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); + assert.equal(line.translateToString(true, undefined, undefined, columns), 'a a aa '); + assert.deepEqual(columns, [0, 1, 2, 3, 4, 5, 6]); }); it('should always return some sane value', function(): void { + const columns: number[] = []; // sanity check - broken line with invalid out of bound null width cells // this can atm happen with deleting/inserting chars in inputhandler by "breaking" // fullwidth pairs --> needs to be fixed after settling BufferLine impl const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, 0, NULL_CELL_CODE]), false); - assert.equal(line.translateToString(false), ' '); - assert.equal(line.translateToString(true), ''); + assert.equal(line.translateToString(false, undefined, undefined, columns), ' '); + assert.deepEqual(columns, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); + assert.equal(line.translateToString(true, undefined, undefined, columns), ''); + assert.deepEqual(columns, []); }); it('should work with endCol=0', () => { + const columns: number[] = []; const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, 0, NULL_CELL_CODE]), false); line.setCell(0, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); - assert.equal(line.translateToString(true, 0, 0), ''); + assert.equal(line.translateToString(true, 0, 0, columns), ''); + assert.deepEqual(columns, []); }); }); describe('addCharToCell', () => { diff --git a/src/common/buffer/BufferLine.ts b/src/common/buffer/BufferLine.ts index a268f2bc..43231925 100644 --- a/src/common/buffer/BufferLine.ts +++ b/src/common/buffer/BufferLine.ts @@ -508,16 +508,34 @@ export class BufferLine implements IBufferLine { } } - public translateToString(trimRight: boolean = false, startCol: number = 0, endCol: number = this.length): string { + /** + * If outColumns is specified, it will be filled with column numbers such that + * returnedString[i] is display at outColumns[i] column. When a single cell is + * translated to multiple UTF-16 code units (e.g. surrogate pair) in the + * returned string, the corresponding entries in outColumns will have the same + * column number. + */ + public translateToString(trimRight?: boolean, startCol?: number, endCol?: number, outColumns?: number[]): string { + startCol = startCol ?? 0; + endCol = endCol ?? this.length; if (trimRight) { endCol = Math.min(endCol, this.getTrimmedLength()); } + if (outColumns) { + outColumns.length = 0; + } let result = ''; while (startCol < endCol) { const content = this._data[startCol * CELL_SIZE + Cell.CONTENT]; const cp = content & Content.CODEPOINT_MASK; - result += (content & Content.IS_COMBINED_MASK) ? this._combined[startCol] : (cp) ? stringFromCodePoint(cp) : WHITESPACE_CELL_CHAR; - startCol += (content >> Content.WIDTH_SHIFT) || 1; // always advance by 1 + const chars = (content & Content.IS_COMBINED_MASK) ? this._combined[startCol] : (cp) ? stringFromCodePoint(cp) : WHITESPACE_CELL_CHAR; + result += chars; + if (outColumns) { + for (let i = 0; i < chars.length; ++i) { + outColumns.push(startCol); + } + } + startCol += (content >> Content.WIDTH_SHIFT) || 1; // always advance by at least 1 } return result; } From c3aa63cffad50746f531d571cc3e994c7754fe59 Mon Sep 17 00:00:00 2001 From: Jason Lin Date: Tue, 5 Sep 2023 13:54:22 +1000 Subject: [PATCH 31/73] translateToString() adds one more entry to outColumns MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, for string 'ab好', outColumns=[0, 1, 2]. Now it becomes [0, 1, 2, 4]. This allows the user to know where does the last character ends. --- src/browser/AccessibilityManager.ts | 2 +- src/common/buffer/BufferLine.test.ts | 60 ++++++++++++++-------------- src/common/buffer/BufferLine.ts | 14 +++++-- 3 files changed, 41 insertions(+), 35 deletions(-) diff --git a/src/browser/AccessibilityManager.ts b/src/browser/AccessibilityManager.ts index c36bae12..1b964d1b 100644 --- a/src/browser/AccessibilityManager.ts +++ b/src/browser/AccessibilityManager.ts @@ -191,7 +191,7 @@ export class AccessibilityManager extends Disposable { if (element) { if (lineData.length === 0) { element.innerText = '\u00a0'; - this._rowColumns.set(element, [0]); + this._rowColumns.set(element, [0, 1]); } else { element.textContent = lineData; this._rowColumns.set(element, columns); diff --git a/src/common/buffer/BufferLine.test.ts b/src/common/buffer/BufferLine.test.ts index ed8df0f9..8461f571 100644 --- a/src/common/buffer/BufferLine.test.ts +++ b/src/common/buffer/BufferLine.test.ts @@ -333,9 +333,9 @@ describe('BufferLine', function(): void { const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]), false); const columns: number[] = []; assert.equal(line.translateToString(false, undefined, undefined, columns), ' '); - assert.deepEqual(columns, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); + assert.deepEqual(columns, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); assert.equal(line.translateToString(true, undefined, undefined, columns), ''); - assert.deepEqual(columns, []); + assert.deepEqual(columns, [0]); }); it('ASCII', function(): void { const columns: number[] = []; @@ -345,16 +345,16 @@ describe('BufferLine', function(): void { line.setCell(4, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); line.setCell(5, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); assert.equal(line.translateToString(false, undefined, undefined, columns), 'a a aa '); - assert.deepEqual(columns, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); + assert.deepEqual(columns, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); assert.equal(line.translateToString(true, undefined, undefined, columns), 'a a aa'); - assert.deepEqual(columns, [0, 1, 2, 3, 4, 5]); + assert.deepEqual(columns, [0, 1, 2, 3, 4, 5, 6]); for (const trimRight of [true, false]) { assert.equal(line.translateToString(trimRight, 0, 5, columns), 'a a a'); - assert.deepEqual(columns, [0, 1, 2, 3, 4]); + assert.deepEqual(columns, [0, 1, 2, 3, 4, 5]); assert.equal(line.translateToString(trimRight, 0, 4, columns), 'a a '); - assert.deepEqual(columns, [0, 1, 2, 3]); + assert.deepEqual(columns, [0, 1, 2, 3, 4]); assert.equal(line.translateToString(trimRight, 0, 3, columns), 'a a'); - assert.deepEqual(columns, [0, 1, 2]); + assert.deepEqual(columns, [0, 1, 2, 3]); } }); @@ -366,16 +366,16 @@ describe('BufferLine', function(): void { line.setCell(4, CellData.fromCharData([1, '𝄞', 1, '𝄞'.charCodeAt(0)])); line.setCell(5, CellData.fromCharData([1, '𝄞', 1, '𝄞'.charCodeAt(0)])); assert.equal(line.translateToString(false, undefined, undefined, columns), 'a 𝄞 𝄞𝄞 '); - assert.deepEqual(columns, [0, 1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 8, 9]); + assert.deepEqual(columns, [0, 1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10]); assert.equal(line.translateToString(true, undefined, undefined, columns), 'a 𝄞 𝄞𝄞'); - assert.deepEqual(columns, [0, 1, 2, 2, 3, 4, 4, 5, 5]); + assert.deepEqual(columns, [0, 1, 2, 2, 3, 4, 4, 5, 5, 6]); for (const trimRight of [true, false]) { assert.equal(line.translateToString(trimRight, 0, 5, columns), 'a 𝄞 𝄞'); - assert.deepEqual(columns, [0, 1, 2, 2, 3, 4, 4]); + assert.deepEqual(columns, [0, 1, 2, 2, 3, 4, 4, 5]); assert.equal(line.translateToString(trimRight, 0, 4, columns), 'a 𝄞 '); - assert.deepEqual(columns, [0, 1, 2, 2, 3]); + assert.deepEqual(columns, [0, 1, 2, 2, 3, 4]); assert.equal(line.translateToString(trimRight, 0, 3, columns), 'a 𝄞'); - assert.deepEqual(columns, [0, 1, 2, 2]); + assert.deepEqual(columns, [0, 1, 2, 2, 3]); } }); it('combining', function(): void { @@ -386,16 +386,16 @@ describe('BufferLine', function(): void { line.setCell(4, CellData.fromCharData([1, 'e\u0301', 1, '\u0301'.charCodeAt(0)])); line.setCell(5, CellData.fromCharData([1, 'e\u0301', 1, '\u0301'.charCodeAt(0)])); assert.equal(line.translateToString(false, undefined, undefined, columns), 'a e\u0301 e\u0301e\u0301 '); - assert.deepEqual(columns, [0, 1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 8, 9]); + assert.deepEqual(columns, [0, 1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10]); assert.equal(line.translateToString(true, undefined, undefined, columns), 'a e\u0301 e\u0301e\u0301'); - assert.deepEqual(columns, [0, 1, 2, 2, 3, 4, 4, 5, 5]); + assert.deepEqual(columns, [0, 1, 2, 2, 3, 4, 4, 5, 5, 6]); for (const trimRight of [true, false]) { assert.equal(line.translateToString(trimRight, 0, 5, columns), 'a e\u0301 e\u0301'); - assert.deepEqual(columns, [0, 1, 2, 2, 3, 4, 4]); + assert.deepEqual(columns, [0, 1, 2, 2, 3, 4, 4, 5]); assert.equal(line.translateToString(trimRight, 0, 4, columns), 'a e\u0301 '); - assert.deepEqual(columns, [0, 1, 2, 2, 3]); + assert.deepEqual(columns, [0, 1, 2, 2, 3, 4]); assert.equal(line.translateToString(trimRight, 0, 3, columns), 'a e\u0301'); - assert.deepEqual(columns, [0, 1, 2, 2]); + assert.deepEqual(columns, [0, 1, 2, 2, 3]); } }); it('fullwidth', function(): void { @@ -409,22 +409,22 @@ describe('BufferLine', function(): void { line.setCell(7, CellData.fromCharData([1, '1', 2, '1'.charCodeAt(0)])); line.setCell(8, CellData.fromCharData([0, '', 0, 0])); assert.equal(line.translateToString(false, undefined, undefined, columns), 'a 1 11 '); - assert.deepEqual(columns, [0, 1, 2, 4, 5, 7, 9]); + assert.deepEqual(columns, [0, 1, 2, 4, 5, 7, 9, 10]); assert.equal(line.translateToString(true, undefined, undefined, columns), 'a 1 11'); - assert.deepEqual(columns, [0, 1, 2, 4, 5, 7]); + assert.deepEqual(columns, [0, 1, 2, 4, 5, 7, 9]); for (const trimRight of [true, false]) { assert.equal(line.translateToString(trimRight, 0, 7, columns), 'a 1 1'); - assert.deepEqual(columns, [0, 1, 2, 4, 5]); + assert.deepEqual(columns, [0, 1, 2, 4, 5, 7]); assert.equal(line.translateToString(trimRight, 0, 6, columns), 'a 1 1'); - assert.deepEqual(columns, [0, 1, 2, 4, 5]); + assert.deepEqual(columns, [0, 1, 2, 4, 5, 7]); assert.equal(line.translateToString(trimRight, 0, 5, columns), 'a 1 '); - assert.deepEqual(columns, [0, 1, 2, 4]); + assert.deepEqual(columns, [0, 1, 2, 4, 5]); assert.equal(line.translateToString(trimRight, 0, 4, columns), 'a 1'); - assert.deepEqual(columns, [0, 1, 2]); + assert.deepEqual(columns, [0, 1, 2, 4]); assert.equal(line.translateToString(trimRight, 0, 3, columns), 'a 1'); - assert.deepEqual(columns, [0, 1, 2]); + assert.deepEqual(columns, [0, 1, 2, 4]); assert.equal(line.translateToString(trimRight, 0, 2, columns), 'a '); - assert.deepEqual(columns, [0, 1]); + assert.deepEqual(columns, [0, 1, 2]); } }); it('space at end', function(): void { @@ -436,9 +436,9 @@ describe('BufferLine', function(): void { line.setCell(5, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); line.setCell(6, CellData.fromCharData([1, ' ', 1, ' '.charCodeAt(0)])); assert.equal(line.translateToString(false, undefined, undefined, columns), 'a a aa '); - assert.deepEqual(columns, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); + assert.deepEqual(columns, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); assert.equal(line.translateToString(true, undefined, undefined, columns), 'a a aa '); - assert.deepEqual(columns, [0, 1, 2, 3, 4, 5, 6]); + assert.deepEqual(columns, [0, 1, 2, 3, 4, 5, 6, 7]); }); it('should always return some sane value', function(): void { const columns: number[] = []; @@ -447,16 +447,16 @@ describe('BufferLine', function(): void { // fullwidth pairs --> needs to be fixed after settling BufferLine impl const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, 0, NULL_CELL_CODE]), false); assert.equal(line.translateToString(false, undefined, undefined, columns), ' '); - assert.deepEqual(columns, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); + assert.deepEqual(columns, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); assert.equal(line.translateToString(true, undefined, undefined, columns), ''); - assert.deepEqual(columns, []); + assert.deepEqual(columns, [0]); }); it('should work with endCol=0', () => { const columns: number[] = []; const line = new TestBufferLine(10, CellData.fromCharData([DEFAULT_ATTR, NULL_CELL_CHAR, 0, NULL_CELL_CODE]), false); line.setCell(0, CellData.fromCharData([1, 'a', 1, 'a'.charCodeAt(0)])); assert.equal(line.translateToString(true, 0, 0, columns), ''); - assert.deepEqual(columns, []); + assert.deepEqual(columns, [0]); }); }); describe('addCharToCell', () => { diff --git a/src/common/buffer/BufferLine.ts b/src/common/buffer/BufferLine.ts index 43231925..e078d5ed 100644 --- a/src/common/buffer/BufferLine.ts +++ b/src/common/buffer/BufferLine.ts @@ -510,10 +510,13 @@ export class BufferLine implements IBufferLine { /** * If outColumns is specified, it will be filled with column numbers such that - * returnedString[i] is display at outColumns[i] column. When a single cell is - * translated to multiple UTF-16 code units (e.g. surrogate pair) in the - * returned string, the corresponding entries in outColumns will have the same - * column number. + * returnedString[i] is display at outColumns[i] column. + * outColumns[returnedString.length] is where the character following + * returnedString will be displayed. + * + * When a single cell is translated to multiple UTF-16 code units (e.g. + * surrogate pair) in the returned string, the corresponding entries in + * outColumns will have the same column number. */ public translateToString(trimRight?: boolean, startCol?: number, endCol?: number, outColumns?: number[]): string { startCol = startCol ?? 0; @@ -537,6 +540,9 @@ export class BufferLine implements IBufferLine { } startCol += (content >> Content.WIDTH_SHIFT) || 1; // always advance by at least 1 } + if (outColumns) { + outColumns.push(startCol); + } return result; } } From eb4277e7bd845716b179066fc8f9930fb8ac9188 Mon Sep 17 00:00:00 2001 From: tisilent Date: Mon, 16 Oct 2023 09:35:21 +0800 Subject: [PATCH 32/73] using ITerminal --- src/browser/renderer/shared/SelectionRenderModel.ts | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/browser/renderer/shared/SelectionRenderModel.ts b/src/browser/renderer/shared/SelectionRenderModel.ts index 3363ce9a..6bf59a36 100644 --- a/src/browser/renderer/shared/SelectionRenderModel.ts +++ b/src/browser/renderer/shared/SelectionRenderModel.ts @@ -5,7 +5,6 @@ import { ITerminal } from 'browser/Types'; import { ISelectionRenderModel } from 'browser/renderer/shared/Types'; -import { BufferNamespaceApi } from 'common/public/BufferNamespaceApi'; import { Terminal } from 'xterm'; class SelectionRenderModel implements ISelectionRenderModel { @@ -19,7 +18,6 @@ class SelectionRenderModel implements ISelectionRenderModel { public endCol!: number; public selectionStart: [number, number] | undefined; public selectionEnd: [number, number] | undefined; - private _buffer: BufferNamespaceApi | undefined; constructor() { this.clear(); @@ -39,10 +37,6 @@ class SelectionRenderModel implements ISelectionRenderModel { } public update(terminal: ITerminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void { - if (!this._buffer) { - this._buffer = new BufferNamespaceApi(terminal); - } - this.selectionStart = start; this.selectionEnd = end; // Selection does not exist @@ -52,8 +46,9 @@ class SelectionRenderModel implements ISelectionRenderModel { } // Translate from buffer position to viewport position - const viewportStartRow = start[1] - this._buffer.active.viewportY; - const viewportEndRow = end[1] - this._buffer.active.viewportY; + const viewportY = terminal.buffers.active.ydisp; + const viewportStartRow = start[1] - viewportY; + const viewportEndRow = end[1] - viewportY; const viewportCappedStartRow = Math.max(viewportStartRow, 0); const viewportCappedEndRow = Math.min(viewportEndRow, terminal.rows - 1); From 7dab4601d2e2a08b99b3545435501193955c8aae Mon Sep 17 00:00:00 2001 From: tisilent Date: Wed, 18 Oct 2023 00:29:56 +0800 Subject: [PATCH 33/73] add public api --- addons/xterm-addon-attach/src/AttachAddon.ts | 3 ++- addons/xterm-addon-attach/src/tsconfig.json | 7 ++++++- addons/xterm-addon-canvas/src/CanvasAddon.ts | 7 ++++++- addons/xterm-addon-canvas/src/tsconfig.json | 3 +++ addons/xterm-addon-fit/src/FitAddon.ts | 3 ++- addons/xterm-addon-fit/src/tsconfig.json | 3 +++ addons/xterm-addon-image/src/ImageAddon.ts | 4 ++-- addons/xterm-addon-image/src/tsconfig.json | 3 ++- addons/xterm-addon-ligatures/src/LigaturesAddon.ts | 3 ++- addons/xterm-addon-ligatures/src/tsconfig.json | 5 ++++- addons/xterm-addon-search/package.json | 3 +-- addons/xterm-addon-search/src/SearchAddon.ts | 3 ++- addons/xterm-addon-search/src/tsconfig.json | 3 +++ addons/xterm-addon-unicode11/src/Unicode11Addon.ts | 4 ++-- addons/xterm-addon-unicode11/src/tsconfig.json | 3 +++ addons/xterm-addon-web-links/src/WebLinksAddon.ts | 3 ++- addons/xterm-addon-web-links/src/tsconfig.json | 7 ++++++- addons/xterm-addon-webgl/src/WebglAddon.ts | 3 ++- addons/xterm-addon-webgl/src/tsconfig.json | 3 +++ 19 files changed, 56 insertions(+), 17 deletions(-) diff --git a/addons/xterm-addon-attach/src/AttachAddon.ts b/addons/xterm-addon-attach/src/AttachAddon.ts index 7fd8df29..e650b9b2 100644 --- a/addons/xterm-addon-attach/src/AttachAddon.ts +++ b/addons/xterm-addon-attach/src/AttachAddon.ts @@ -6,12 +6,13 @@ */ import { Terminal, IDisposable, ITerminalAddon } from 'xterm'; +import { AttachAddon as IAttachApi } from 'xterm-addon-attach'; interface IAttachOptions { bidirectional?: boolean; } -export class AttachAddon implements ITerminalAddon { +export class AttachAddon implements ITerminalAddon , IAttachApi { private _socket: WebSocket; private _bidirectional: boolean; private _disposables: IDisposable[] = []; diff --git a/addons/xterm-addon-attach/src/tsconfig.json b/addons/xterm-addon-attach/src/tsconfig.json index 7e68574d..dd9e145c 100644 --- a/addons/xterm-addon-attach/src/tsconfig.json +++ b/addons/xterm-addon-attach/src/tsconfig.json @@ -13,7 +13,12 @@ "strict": true, "types": [ "../../../node_modules/@types/mocha" - ] + ], + "paths": { + "xterm-addon-attach": [ + "../typings/xterm-addon-attach.d.ts" + ] + } }, "include": [ "./**/*", diff --git a/addons/xterm-addon-canvas/src/CanvasAddon.ts b/addons/xterm-addon-canvas/src/CanvasAddon.ts index 91438a4c..8f3ed758 100644 --- a/addons/xterm-addon-canvas/src/CanvasAddon.ts +++ b/addons/xterm-addon-canvas/src/CanvasAddon.ts @@ -11,8 +11,9 @@ import { setTraceLogger } from 'common/services/LogService'; import { IBufferService, IDecorationService, ILogService } from 'common/services/Services'; import { ITerminalAddon, Terminal } from 'xterm'; import { CanvasRenderer } from './CanvasRenderer'; +import { CanvasAddon as ICanvasApi } from 'xterm-addon-canvas'; -export class CanvasAddon extends Disposable implements ITerminalAddon { +export class CanvasAddon extends Disposable implements ITerminalAddon , ICanvasApi { private _terminal?: Terminal; private _renderer?: CanvasRenderer; @@ -65,4 +66,8 @@ export class CanvasAddon extends Disposable implements ITerminalAddon { this._renderer = undefined; })); } + + public clearTextureAtlas(): void { + this._renderer?.clearTextureAtlas(); + } } diff --git a/addons/xterm-addon-canvas/src/tsconfig.json b/addons/xterm-addon-canvas/src/tsconfig.json index f6fb08a7..eb64d9f8 100644 --- a/addons/xterm-addon-canvas/src/tsconfig.json +++ b/addons/xterm-addon-canvas/src/tsconfig.json @@ -17,6 +17,9 @@ ], "browser/*": [ "../../../src/browser/*" + ], + "xterm-addon-canvas": [ + "../typings/xterm-addon-canvas.d.ts" ] }, "strict": true, diff --git a/addons/xterm-addon-fit/src/FitAddon.ts b/addons/xterm-addon-fit/src/FitAddon.ts index f7245462..a3fd39b6 100644 --- a/addons/xterm-addon-fit/src/FitAddon.ts +++ b/addons/xterm-addon-fit/src/FitAddon.ts @@ -5,6 +5,7 @@ import { Terminal, ITerminalAddon } from 'xterm'; import { IRenderDimensions } from 'browser/renderer/shared/Types'; +import { FitAddon as IFitApi } from 'xterm-addon-fit'; interface ITerminalDimensions { /** @@ -21,7 +22,7 @@ interface ITerminalDimensions { const MINIMUM_COLS = 2; const MINIMUM_ROWS = 1; -export class FitAddon implements ITerminalAddon { +export class FitAddon implements ITerminalAddon , IFitApi { private _terminal: Terminal | undefined; public activate(terminal: Terminal): void { diff --git a/addons/xterm-addon-fit/src/tsconfig.json b/addons/xterm-addon-fit/src/tsconfig.json index 668f910b..dac0d618 100644 --- a/addons/xterm-addon-fit/src/tsconfig.json +++ b/addons/xterm-addon-fit/src/tsconfig.json @@ -17,6 +17,9 @@ "paths": { "browser/*": [ "../../../src/browser/*" + ], + "xterm-addon-fit": [ + "../typings/xterm-addon-fit.d.ts" ] } }, diff --git a/addons/xterm-addon-image/src/ImageAddon.ts b/addons/xterm-addon-image/src/ImageAddon.ts index bb633e6b..8e5d4cac 100644 --- a/addons/xterm-addon-image/src/ImageAddon.ts +++ b/addons/xterm-addon-image/src/ImageAddon.ts @@ -9,7 +9,7 @@ import { ImageRenderer } from './ImageRenderer'; import { ImageStorage, CELL_SIZE_DEFAULT } from './ImageStorage'; import { SixelHandler } from './SixelHandler'; import { ITerminalExt, IImageAddonOptions, IResetHandler } from './Types'; - +import { ImageAddon as IImageApi } from 'xterm-addon-image' // default values of addon ctor options const DEFAULT_OPTIONS: IImageAddonOptions = { @@ -48,7 +48,7 @@ const enum GaStatus { } -export class ImageAddon implements ITerminalAddon { +export class ImageAddon implements ITerminalAddon , IImageApi { private _opts: IImageAddonOptions; private _defaultOpts: IImageAddonOptions; private _storage: ImageStorage | undefined; diff --git a/addons/xterm-addon-image/src/tsconfig.json b/addons/xterm-addon-image/src/tsconfig.json index da519e17..cd961758 100644 --- a/addons/xterm-addon-image/src/tsconfig.json +++ b/addons/xterm-addon-image/src/tsconfig.json @@ -14,7 +14,8 @@ "baseUrl": ".", "paths": { "browser/*": [ "../../../src/browser/*" ], - "common/*": [ "../../../src/common/*" ] + "common/*": [ "../../../src/common/*" ], + "xterm-addon-image": [ "../typings/xterm-addon-image.d.ts" ] } }, "include": [ diff --git a/addons/xterm-addon-ligatures/src/LigaturesAddon.ts b/addons/xterm-addon-ligatures/src/LigaturesAddon.ts index c4586b38..2119662b 100644 --- a/addons/xterm-addon-ligatures/src/LigaturesAddon.ts +++ b/addons/xterm-addon-ligatures/src/LigaturesAddon.ts @@ -6,13 +6,14 @@ import { Terminal } from 'xterm'; import { enableLigatures } from '.'; import { ILigatureOptions } from './Types'; +import { LigaturesAddon as ILigaturesApi } from 'xterm-addon-ligatures'; export interface ITerminalAddon { activate(terminal: Terminal): void; dispose(): void; } -export class LigaturesAddon implements ITerminalAddon { +export class LigaturesAddon implements ITerminalAddon , ILigaturesApi { private readonly _fallbackLigatures: string[]; private _terminal: Terminal | undefined; diff --git a/addons/xterm-addon-ligatures/src/tsconfig.json b/addons/xterm-addon-ligatures/src/tsconfig.json index 28969f97..f7197160 100644 --- a/addons/xterm-addon-ligatures/src/tsconfig.json +++ b/addons/xterm-addon-ligatures/src/tsconfig.json @@ -10,7 +10,10 @@ "preserveWatchOutput": true, "types": [ "../../../node_modules/@types/mocha" - ] + ], + "paths": { + "xterm-addon-ligatures" : [ "../typings/xterm-addon-ligatures.d.ts" ] + } }, "include": [ "./**/*", diff --git a/addons/xterm-addon-search/package.json b/addons/xterm-addon-search/package.json index f846874d..e0a8dfdc 100644 --- a/addons/xterm-addon-search/package.json +++ b/addons/xterm-addon-search/package.json @@ -15,8 +15,7 @@ "xterm.js" ], "scripts": { - "build": "../../node_modules/.bin/tsc -p .", - "prepackage": "npm run build", + "prepackage": "../../node_modules/.bin/tsc -p .", "package": "../../node_modules/.bin/webpack", "prepublishOnly": "npm run package" }, diff --git a/addons/xterm-addon-search/src/SearchAddon.ts b/addons/xterm-addon-search/src/SearchAddon.ts index 959214c9..03f628ee 100644 --- a/addons/xterm-addon-search/src/SearchAddon.ts +++ b/addons/xterm-addon-search/src/SearchAddon.ts @@ -6,6 +6,7 @@ import { Terminal, IDisposable, ITerminalAddon, IDecoration } from 'xterm'; import { EventEmitter } from 'common/EventEmitter'; import { Disposable, toDisposable, disposeArray, MutableDisposable } from 'common/Lifecycle'; +import { SearchAddon as ISearchApi } from 'xterm-addon-search'; export interface ISearchOptions { regex?: boolean; @@ -61,7 +62,7 @@ const NON_WORD_CHARACTERS = ' ~!@#$%^&*()+`-=[]{}|\\;:"\',./<>?'; const LINES_CACHE_TIME_TO_LIVE = 15 * 1000; // 15 secs const DEFAULT_HIGHLIGHT_LIMIT = 1000; -export class SearchAddon extends Disposable implements ITerminalAddon { +export class SearchAddon extends Disposable implements ITerminalAddon , ISearchApi { private _terminal: Terminal | undefined; private _cachedSearchTerm: string | undefined; private _highlightedLines: Set = new Set(); diff --git a/addons/xterm-addon-search/src/tsconfig.json b/addons/xterm-addon-search/src/tsconfig.json index 1f08b12d..38626d3b 100644 --- a/addons/xterm-addon-search/src/tsconfig.json +++ b/addons/xterm-addon-search/src/tsconfig.json @@ -17,6 +17,9 @@ "paths": { "common/*": [ "../../../src/common/*" + ], + "xterm-addon-search" : [ + "../typings/xterm-addon-search.d.ts" ] } }, diff --git a/addons/xterm-addon-unicode11/src/Unicode11Addon.ts b/addons/xterm-addon-unicode11/src/Unicode11Addon.ts index d4ddf77e..c6e19d88 100644 --- a/addons/xterm-addon-unicode11/src/Unicode11Addon.ts +++ b/addons/xterm-addon-unicode11/src/Unicode11Addon.ts @@ -7,9 +7,9 @@ import { Terminal, ITerminalAddon } from 'xterm'; import { UnicodeV11 } from './UnicodeV11'; +import { Unicode11Addon as IUnicode11Api } from 'xterm-addon-unicode11'; - -export class Unicode11Addon implements ITerminalAddon { +export class Unicode11Addon implements ITerminalAddon , IUnicode11Api { public activate(terminal: Terminal): void { terminal.unicode.register(new UnicodeV11()); } diff --git a/addons/xterm-addon-unicode11/src/tsconfig.json b/addons/xterm-addon-unicode11/src/tsconfig.json index e2c1464e..dddfc8c6 100644 --- a/addons/xterm-addon-unicode11/src/tsconfig.json +++ b/addons/xterm-addon-unicode11/src/tsconfig.json @@ -15,6 +15,9 @@ "paths": { "common/*": [ "../../../src/common/*" + ], + "xterm-addon-unicode11": [ + "../typings/xterm-addon-unicode11.d.ts" ] }, "types": [ diff --git a/addons/xterm-addon-web-links/src/WebLinksAddon.ts b/addons/xterm-addon-web-links/src/WebLinksAddon.ts index 5c956cec..a4a08726 100644 --- a/addons/xterm-addon-web-links/src/WebLinksAddon.ts +++ b/addons/xterm-addon-web-links/src/WebLinksAddon.ts @@ -4,6 +4,7 @@ */ import { Terminal, ITerminalAddon, IDisposable } from 'xterm'; +import { WebLinksAddon as IWebLinksApi } from 'xterm-addon-web-links'; import { ILinkProviderOptions, WebLinkProvider } from './WebLinkProvider'; // consider everthing starting with http:// or https:// @@ -34,7 +35,7 @@ function handleLink(event: MouseEvent, uri: string): void { } } -export class WebLinksAddon implements ITerminalAddon { +export class WebLinksAddon implements ITerminalAddon , IWebLinksApi { private _terminal: Terminal | undefined; private _linkProvider: IDisposable | undefined; diff --git a/addons/xterm-addon-web-links/src/tsconfig.json b/addons/xterm-addon-web-links/src/tsconfig.json index 7e68574d..0c30d60c 100644 --- a/addons/xterm-addon-web-links/src/tsconfig.json +++ b/addons/xterm-addon-web-links/src/tsconfig.json @@ -13,7 +13,12 @@ "strict": true, "types": [ "../../../node_modules/@types/mocha" - ] + ], + "paths": { + "xterm-addon-web-links": [ + "../typings/xterm-addon-web-links.d.ts" + ] + } }, "include": [ "./**/*", diff --git a/addons/xterm-addon-webgl/src/WebglAddon.ts b/addons/xterm-addon-webgl/src/WebglAddon.ts index 3e091f0b..26803ef9 100644 --- a/addons/xterm-addon-webgl/src/WebglAddon.ts +++ b/addons/xterm-addon-webgl/src/WebglAddon.ts @@ -10,10 +10,11 @@ import { Disposable, toDisposable } from 'common/Lifecycle'; import { getSafariVersion, isSafari } from 'common/Platform'; import { ICoreService, IDecorationService, ILogService, IOptionsService } from 'common/services/Services'; import { ITerminalAddon, Terminal } from 'xterm'; +import { WebglAddon as IWebglApi } from 'xterm-addon-webgl'; import { WebglRenderer } from './WebglRenderer'; import { setTraceLogger } from 'common/services/LogService'; -export class WebglAddon extends Disposable implements ITerminalAddon { +export class WebglAddon extends Disposable implements ITerminalAddon , IWebglApi { private _terminal?: Terminal; private _renderer?: WebglRenderer; diff --git a/addons/xterm-addon-webgl/src/tsconfig.json b/addons/xterm-addon-webgl/src/tsconfig.json index 4d4194db..347b1741 100644 --- a/addons/xterm-addon-webgl/src/tsconfig.json +++ b/addons/xterm-addon-webgl/src/tsconfig.json @@ -17,6 +17,9 @@ ], "browser/*": [ "../../../src/browser/*" + ], + "xterm-addon-webgl": [ + "../typings/xterm-addon-webgl.d.ts" ] }, "strict": true, From dfd5385602f5150a459efdca31f2a163c9850ebf Mon Sep 17 00:00:00 2001 From: tisilent Date: Wed, 18 Oct 2023 00:49:29 +0800 Subject: [PATCH 34/73] add semicolon --- addons/xterm-addon-image/src/ImageAddon.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/xterm-addon-image/src/ImageAddon.ts b/addons/xterm-addon-image/src/ImageAddon.ts index 8e5d4cac..ffe0b2d7 100644 --- a/addons/xterm-addon-image/src/ImageAddon.ts +++ b/addons/xterm-addon-image/src/ImageAddon.ts @@ -9,7 +9,7 @@ import { ImageRenderer } from './ImageRenderer'; import { ImageStorage, CELL_SIZE_DEFAULT } from './ImageStorage'; import { SixelHandler } from './SixelHandler'; import { ITerminalExt, IImageAddonOptions, IResetHandler } from './Types'; -import { ImageAddon as IImageApi } from 'xterm-addon-image' +import { ImageAddon as IImageApi } from 'xterm-addon-image'; // default values of addon ctor options const DEFAULT_OPTIONS: IImageAddonOptions = { From a4e09d0ad85213676d45d5c8de19d25495c6cbcc Mon Sep 17 00:00:00 2001 From: tisilent Date: Wed, 18 Oct 2023 01:09:39 +0800 Subject: [PATCH 35/73] add path to benchmark --- addons/xterm-addon-serialize/benchmark/tsconfig.json | 5 ++++- addons/xterm-addon-serialize/src/SerializeAddon.ts | 3 ++- addons/xterm-addon-serialize/src/tsconfig.json | 3 +++ addons/xterm-addon-unicode-graphemes/benchmark/tsconfig.json | 5 ++++- .../src/UnicodeGraphemesAddon.ts | 4 ++-- addons/xterm-addon-unicode-graphemes/src/tsconfig.json | 3 +++ 6 files changed, 18 insertions(+), 5 deletions(-) diff --git a/addons/xterm-addon-serialize/benchmark/tsconfig.json b/addons/xterm-addon-serialize/benchmark/tsconfig.json index 6bbb2a4b..82a50b73 100644 --- a/addons/xterm-addon-serialize/benchmark/tsconfig.json +++ b/addons/xterm-addon-serialize/benchmark/tsconfig.json @@ -14,7 +14,10 @@ "paths": { "common/*": ["../../../src/common/*"], "browser/*": ["../../../src/browser/*"], - "SerializeAddon": ["../src/SerializeAddon"] + "SerializeAddon": ["../src/SerializeAddon"], + "xterm-addon-serialize": [ + "../typings/xterm-addon-serialize.d.ts" + ] } }, "include": ["../**/*", "../../../typings/xterm.d.ts"], diff --git a/addons/xterm-addon-serialize/src/SerializeAddon.ts b/addons/xterm-addon-serialize/src/SerializeAddon.ts index 7a2db089..960db383 100644 --- a/addons/xterm-addon-serialize/src/SerializeAddon.ts +++ b/addons/xterm-addon-serialize/src/SerializeAddon.ts @@ -8,6 +8,7 @@ import { DEFAULT_ANSI_COLORS } from 'browser/services/ThemeService'; import { IAttributeData, IColor } from 'common/Types'; import { IBuffer, IBufferCell, IBufferRange, ITerminalAddon, Terminal } from 'xterm'; +import { SerializeAddon as ISerializeApi } from 'xterm-addon-serialize'; function constrain(value: number, low: number, high: number): number { return Math.max(low, Math.min(value, high)); @@ -411,7 +412,7 @@ class StringSerializeHandler extends BaseSerializeHandler { } } -export class SerializeAddon implements ITerminalAddon { +export class SerializeAddon implements ITerminalAddon , ISerializeApi { private _terminal: Terminal | undefined; public activate(terminal: Terminal): void { diff --git a/addons/xterm-addon-serialize/src/tsconfig.json b/addons/xterm-addon-serialize/src/tsconfig.json index 22ffe53e..a0c2e665 100644 --- a/addons/xterm-addon-serialize/src/tsconfig.json +++ b/addons/xterm-addon-serialize/src/tsconfig.json @@ -17,6 +17,9 @@ ], "browser/*": [ "../../../src/browser/*" + ], + "xterm-addon-serialize": [ + "../typings/xterm-addon-serialize.d.ts" ] }, "strict": true, diff --git a/addons/xterm-addon-unicode-graphemes/benchmark/tsconfig.json b/addons/xterm-addon-unicode-graphemes/benchmark/tsconfig.json index 9bc532d3..d42be1c8 100644 --- a/addons/xterm-addon-unicode-graphemes/benchmark/tsconfig.json +++ b/addons/xterm-addon-unicode-graphemes/benchmark/tsconfig.json @@ -11,7 +11,10 @@ "paths": { "common/*": ["../../../src/common/*"], "browser/*": ["../../../src/browser/*"], - "UnicodeGraphemeProvider": ["../src/UnicodeGraphemeProvider"] + "UnicodeGraphemeProvider": ["../src/UnicodeGraphemeProvider"], + "xterm-addon-unicode-graphemes": [ + "../typings/xterm-addon-unicode-graphemes.d.ts" + ] } }, "include": ["../**/*", "../../../typings/xterm.d.ts"], diff --git a/addons/xterm-addon-unicode-graphemes/src/UnicodeGraphemesAddon.ts b/addons/xterm-addon-unicode-graphemes/src/UnicodeGraphemesAddon.ts index 80290edf..50c6e425 100644 --- a/addons/xterm-addon-unicode-graphemes/src/UnicodeGraphemesAddon.ts +++ b/addons/xterm-addon-unicode-graphemes/src/UnicodeGraphemesAddon.ts @@ -7,9 +7,9 @@ import { Terminal, ITerminalAddon, IUnicodeHandling } from 'xterm'; import { UnicodeGraphemeProvider } from './UnicodeGraphemeProvider'; +import { UnicodeGraphemesAddon as PublicApi } from 'xterm-addon-unicode-graphemes'; - -export class UnicodeGraphemesAddon implements ITerminalAddon { +export class UnicodeGraphemesAddon implements ITerminalAddon , PublicApi { private _provider15Graphemes?: UnicodeGraphemeProvider; private _provider15?: UnicodeGraphemeProvider; private _unicode?: IUnicodeHandling; diff --git a/addons/xterm-addon-unicode-graphemes/src/tsconfig.json b/addons/xterm-addon-unicode-graphemes/src/tsconfig.json index 60824fee..f17366c0 100644 --- a/addons/xterm-addon-unicode-graphemes/src/tsconfig.json +++ b/addons/xterm-addon-unicode-graphemes/src/tsconfig.json @@ -15,6 +15,9 @@ "paths": { "common/*": [ "../../../src/common/*" + ], + "xterm-addon-unicode-graphemes": [ + "../typings/xterm-addon-unicode-graphemes.d.ts" ] }, "types": [ From de1304d19e8436427cfa7cb660861f373cd32a18 Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Mon, 30 Oct 2023 10:44:18 +0100 Subject: [PATCH 36/73] fix: use globalThis instead of self to address non Browser consumption Currently using this package in a non Browser env will cause an error as Webpack will emit `self` which does not exist in all envs such as Node.js and Workers. This commit updates Webpack and force it to use `globalThis`. See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/globalThis --- webpack.config.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/webpack.config.js b/webpack.config.js index ca7c059a..3769bfb0 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -39,8 +39,10 @@ const config = { output: { filename: 'xterm.js', path: path.resolve('./lib'), - libraryTarget: 'umd' + libraryTarget: 'umd', + // Force usage of globalThis instead of global / self. (This is cross-env compatible) + globalObject: 'globalThis', }, - mode: 'production' + mode: 'production', }; module.exports = config; From 6945e881a847b40dd5cb206ffb034c3ca1387892 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 31 Oct 2023 06:18:40 -0700 Subject: [PATCH 37/73] Update README.md --- addons/xterm-addon-unicode-graphemes/README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/addons/xterm-addon-unicode-graphemes/README.md b/addons/xterm-addon-unicode-graphemes/README.md index 2f5639fc..5b8679f8 100644 --- a/addons/xterm-addon-unicode-graphemes/README.md +++ b/addons/xterm-addon-unicode-graphemes/README.md @@ -8,9 +8,7 @@ The file `src/UnicodeProperties.ts` is generated and depends on the Unicode vers ### Install -```bash -npm install --save xterm-addon-unicode-graphemes -``` +This addon is not yet published to npm ### Usage From 974b275f6e7051fce8b00c42771488e9386dd8d2 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 31 Oct 2023 06:41:16 -0700 Subject: [PATCH 38/73] is -> did --- addons/xterm-addon-search/src/SearchAddon.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/xterm-addon-search/src/SearchAddon.ts b/addons/xterm-addon-search/src/SearchAddon.ts index 79cd010b..c176a6f2 100644 --- a/addons/xterm-addon-search/src/SearchAddon.ts +++ b/addons/xterm-addon-search/src/SearchAddon.ts @@ -134,10 +134,10 @@ export class SearchAddon extends Disposable implements ITerminalAddon { if (!this._terminal) { throw new Error('Cannot use addon until it has been loaded'); } - const isOptionsChanged = this._lastSearchOptions ? this._isOptionsChange(this._lastSearchOptions, searchOptions) : true; + const didOptionsChanged = this._lastSearchOptions ? this._didOptionsChange(this._lastSearchOptions, searchOptions) : true; this._lastSearchOptions = searchOptions; if (searchOptions?.decorations) { - if (this._cachedSearchTerm === undefined || term !== this._cachedSearchTerm || isOptionsChanged) { + if (this._cachedSearchTerm === undefined || term !== this._cachedSearchTerm || didOptionsChanged) { this._highlightAllMatches(term, searchOptions); } } @@ -303,10 +303,10 @@ export class SearchAddon extends Disposable implements ITerminalAddon { if (!this._terminal) { throw new Error('Cannot use addon until it has been loaded'); } - const isOptionsChanged = this._lastSearchOptions ? this._isOptionsChange(this._lastSearchOptions, searchOptions) : true; + const didOptionsChanged = this._lastSearchOptions ? this._didOptionsChange(this._lastSearchOptions, searchOptions) : true; this._lastSearchOptions = searchOptions; if (searchOptions?.decorations) { - if (this._cachedSearchTerm === undefined || term !== this._cachedSearchTerm || isOptionsChanged) { + if (this._cachedSearchTerm === undefined || term !== this._cachedSearchTerm || didOptionsChanged) { this._highlightAllMatches(term, searchOptions); } } @@ -318,7 +318,7 @@ export class SearchAddon extends Disposable implements ITerminalAddon { return found; } - private _isOptionsChange(lastSearchOptions: ISearchOptions, searchOptions?: ISearchOptions): boolean { + private _didOptionsChange(lastSearchOptions: ISearchOptions, searchOptions?: ISearchOptions): boolean { if (!searchOptions) { return false; } From add7f8133eb0144d491ac66fa9d5a6b9467dfbe2 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 06:44:26 -0700 Subject: [PATCH 39/73] Start @xterm scope with core and webgl addons --- .eslintrc.json | 4 ++-- .github/workflows/ci.yml | 8 +++---- .../.gitignore | 0 .../.npmignore | 0 .../LICENSE | 0 .../README.md | 10 ++++----- .../package.json | 8 +++---- .../src/GlyphRenderer.ts | 0 .../src/RectangleRenderer.ts | 0 .../src/RenderModel.ts | 0 .../src/TypedArray.test.ts | 0 .../src/TypedArray.ts | 0 .../src/Types.d.ts | 0 .../src/WebglAddon.ts | 0 .../src/WebglRenderer.ts | 0 .../src/WebglUtils.ts | 0 .../src/renderLayer/BaseRenderLayer.ts | 0 .../src/renderLayer/LinkRenderLayer.ts | 0 .../src/renderLayer/Types.ts | 0 .../src/tsconfig.json | 0 .../test/WebglRenderer.test.ts | 0 .../test/playwright.config.ts | 0 .../test/tsconfig.json | 0 .../tsconfig.json | 0 .../typings/addon-webgl.d.ts} | 2 +- .../webpack.config.js | 2 +- bin/publish.js | 22 +++++++++---------- bin/test_playwright.js | 2 +- demo/client.ts | 4 ++-- demo/tsconfig.json | 2 +- package.json | 2 +- tsconfig.all.json | 2 +- 32 files changed, 34 insertions(+), 34 deletions(-) rename addons/{xterm-addon-webgl => addon-webgl}/.gitignore (100%) rename addons/{xterm-addon-webgl => addon-webgl}/.npmignore (100%) rename addons/{xterm-addon-webgl => addon-webgl}/LICENSE (100%) rename addons/{xterm-addon-webgl => addon-webgl}/README.md (83%) rename addons/{xterm-addon-webgl => addon-webgl}/package.json (80%) rename addons/{xterm-addon-webgl => addon-webgl}/src/GlyphRenderer.ts (100%) rename addons/{xterm-addon-webgl => addon-webgl}/src/RectangleRenderer.ts (100%) rename addons/{xterm-addon-webgl => addon-webgl}/src/RenderModel.ts (100%) rename addons/{xterm-addon-webgl => addon-webgl}/src/TypedArray.test.ts (100%) rename addons/{xterm-addon-webgl => addon-webgl}/src/TypedArray.ts (100%) rename addons/{xterm-addon-webgl => addon-webgl}/src/Types.d.ts (100%) rename addons/{xterm-addon-webgl => addon-webgl}/src/WebglAddon.ts (100%) rename addons/{xterm-addon-webgl => addon-webgl}/src/WebglRenderer.ts (100%) rename addons/{xterm-addon-webgl => addon-webgl}/src/WebglUtils.ts (100%) rename addons/{xterm-addon-webgl => addon-webgl}/src/renderLayer/BaseRenderLayer.ts (100%) rename addons/{xterm-addon-webgl => addon-webgl}/src/renderLayer/LinkRenderLayer.ts (100%) rename addons/{xterm-addon-webgl => addon-webgl}/src/renderLayer/Types.ts (100%) rename addons/{xterm-addon-webgl => addon-webgl}/src/tsconfig.json (100%) rename addons/{xterm-addon-webgl => addon-webgl}/test/WebglRenderer.test.ts (100%) rename addons/{xterm-addon-webgl => addon-webgl}/test/playwright.config.ts (100%) rename addons/{xterm-addon-webgl => addon-webgl}/test/tsconfig.json (100%) rename addons/{xterm-addon-webgl => addon-webgl}/tsconfig.json (100%) rename addons/{xterm-addon-webgl/typings/xterm-addon-webgl.d.ts => addon-webgl/typings/addon-webgl.d.ts} (96%) rename addons/{xterm-addon-webgl => addon-webgl}/webpack.config.js (94%) diff --git a/.eslintrc.json b/.eslintrc.json index 0ccafafb..8ca2eccc 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -35,8 +35,8 @@ "addons/xterm-addon-unicode-graphemes/benchmark/tsconfig.json", "addons/xterm-addon-web-links/src/tsconfig.json", "addons/xterm-addon-web-links/test/tsconfig.json", - "addons/xterm-addon-webgl/src/tsconfig.json", - "addons/xterm-addon-webgl/test/tsconfig.json" + "addons/addon-webgl/src/tsconfig.json", + "addons/addon-webgl/test/tsconfig.json" ], "sourceType": "module" }, diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eea525d0..cd3fa512 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -46,8 +46,8 @@ jobs: ./addons/xterm-addon-unicode-graphemes/out-test/* \ ./addons/xterm-addon-web-links/out/* \ ./addons/xterm-addon-web-links/out-test/* \ - ./addons/xterm-addon-webgl/out/* \ - ./addons/xterm-addon-webgl/out-test/* + ./addons/addon-webgl/out/* \ + ./addons/addon-webgl/out-test/* - name: Upload artifacts uses: actions/upload-artifact@v3 with: @@ -267,8 +267,8 @@ jobs: run: yarn test-playwright-${{ matrix.browser }} --workers=50% --forbid-only --suite=core - name: Integration tests (xterm-addon-canvas) run: yarn test-playwright-${{ matrix.browser }} --workers=50% --forbid-only --suite=xterm-addon-canvas - - name: Integration tests (xterm-addon-webgl) - run: yarn test-playwright-${{ matrix.browser }} --workers=50% --forbid-only --suite=xterm-addon-webgl + - name: Integration tests (addon-webgl) + run: yarn test-playwright-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-webgl test-api: needs: build diff --git a/addons/xterm-addon-webgl/.gitignore b/addons/addon-webgl/.gitignore similarity index 100% rename from addons/xterm-addon-webgl/.gitignore rename to addons/addon-webgl/.gitignore diff --git a/addons/xterm-addon-webgl/.npmignore b/addons/addon-webgl/.npmignore similarity index 100% rename from addons/xterm-addon-webgl/.npmignore rename to addons/addon-webgl/.npmignore diff --git a/addons/xterm-addon-webgl/LICENSE b/addons/addon-webgl/LICENSE similarity index 100% rename from addons/xterm-addon-webgl/LICENSE rename to addons/addon-webgl/LICENSE diff --git a/addons/xterm-addon-webgl/README.md b/addons/addon-webgl/README.md similarity index 83% rename from addons/xterm-addon-webgl/README.md rename to addons/addon-webgl/README.md index 5dee6b62..f944a17e 100644 --- a/addons/xterm-addon-webgl/README.md +++ b/addons/addon-webgl/README.md @@ -1,25 +1,25 @@ -## xterm-addon-webgl +## @xterm/addon-webgl An addon for [xterm.js](https://github.com/xtermjs/xterm.js) that enables a WebGL2-based renderer. This addon requires xterm.js v4+. ### Install ```bash -npm install --save xterm-addon-webgl +npm install --save @xterm/addon-webgl ``` ### Usage ```ts -import { Terminal } from 'xterm'; -import { WebglAddon } from 'xterm-addon-webgl'; +import { Terminal } from '@xterm/xterm'; +import { WebglAddon } from '@xterm/addon-webgl'; const terminal = new Terminal(); terminal.open(element); terminal.loadAddon(new WebglAddon()); ``` -See the full [API](https://github.com/xtermjs/xterm.js/blob/master/addons/xterm-addon-webgl/typings/xterm-addon-webgl.d.ts) for more advanced usage. +See the full [API](https://github.com/xtermjs/xterm.js/blob/master/addons/addon-webgl/typings/addon-webgl.d.ts) for more advanced usage. ### Handling Context Loss diff --git a/addons/xterm-addon-webgl/package.json b/addons/addon-webgl/package.json similarity index 80% rename from addons/xterm-addon-webgl/package.json rename to addons/addon-webgl/package.json index 1458effc..f52f8b59 100644 --- a/addons/xterm-addon-webgl/package.json +++ b/addons/addon-webgl/package.json @@ -1,13 +1,13 @@ { - "name": "xterm-addon-webgl", + "name": "@xterm/addon-webgl", "version": "0.16.0", "author": { "name": "The xterm.js authors", "url": "https://xtermjs.org/" }, - "main": "lib/xterm-addon-webgl.js", - "types": "typings/xterm-addon-webgl.d.ts", - "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/xterm-addon-webgl", + "main": "lib/addon-webgl.js", + "types": "typings/addon-webgl.d.ts", + "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-webgl", "license": "MIT", "keywords": [ "terminal", diff --git a/addons/xterm-addon-webgl/src/GlyphRenderer.ts b/addons/addon-webgl/src/GlyphRenderer.ts similarity index 100% rename from addons/xterm-addon-webgl/src/GlyphRenderer.ts rename to addons/addon-webgl/src/GlyphRenderer.ts diff --git a/addons/xterm-addon-webgl/src/RectangleRenderer.ts b/addons/addon-webgl/src/RectangleRenderer.ts similarity index 100% rename from addons/xterm-addon-webgl/src/RectangleRenderer.ts rename to addons/addon-webgl/src/RectangleRenderer.ts diff --git a/addons/xterm-addon-webgl/src/RenderModel.ts b/addons/addon-webgl/src/RenderModel.ts similarity index 100% rename from addons/xterm-addon-webgl/src/RenderModel.ts rename to addons/addon-webgl/src/RenderModel.ts diff --git a/addons/xterm-addon-webgl/src/TypedArray.test.ts b/addons/addon-webgl/src/TypedArray.test.ts similarity index 100% rename from addons/xterm-addon-webgl/src/TypedArray.test.ts rename to addons/addon-webgl/src/TypedArray.test.ts diff --git a/addons/xterm-addon-webgl/src/TypedArray.ts b/addons/addon-webgl/src/TypedArray.ts similarity index 100% rename from addons/xterm-addon-webgl/src/TypedArray.ts rename to addons/addon-webgl/src/TypedArray.ts diff --git a/addons/xterm-addon-webgl/src/Types.d.ts b/addons/addon-webgl/src/Types.d.ts similarity index 100% rename from addons/xterm-addon-webgl/src/Types.d.ts rename to addons/addon-webgl/src/Types.d.ts diff --git a/addons/xterm-addon-webgl/src/WebglAddon.ts b/addons/addon-webgl/src/WebglAddon.ts similarity index 100% rename from addons/xterm-addon-webgl/src/WebglAddon.ts rename to addons/addon-webgl/src/WebglAddon.ts diff --git a/addons/xterm-addon-webgl/src/WebglRenderer.ts b/addons/addon-webgl/src/WebglRenderer.ts similarity index 100% rename from addons/xterm-addon-webgl/src/WebglRenderer.ts rename to addons/addon-webgl/src/WebglRenderer.ts diff --git a/addons/xterm-addon-webgl/src/WebglUtils.ts b/addons/addon-webgl/src/WebglUtils.ts similarity index 100% rename from addons/xterm-addon-webgl/src/WebglUtils.ts rename to addons/addon-webgl/src/WebglUtils.ts diff --git a/addons/xterm-addon-webgl/src/renderLayer/BaseRenderLayer.ts b/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts similarity index 100% rename from addons/xterm-addon-webgl/src/renderLayer/BaseRenderLayer.ts rename to addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts diff --git a/addons/xterm-addon-webgl/src/renderLayer/LinkRenderLayer.ts b/addons/addon-webgl/src/renderLayer/LinkRenderLayer.ts similarity index 100% rename from addons/xterm-addon-webgl/src/renderLayer/LinkRenderLayer.ts rename to addons/addon-webgl/src/renderLayer/LinkRenderLayer.ts diff --git a/addons/xterm-addon-webgl/src/renderLayer/Types.ts b/addons/addon-webgl/src/renderLayer/Types.ts similarity index 100% rename from addons/xterm-addon-webgl/src/renderLayer/Types.ts rename to addons/addon-webgl/src/renderLayer/Types.ts diff --git a/addons/xterm-addon-webgl/src/tsconfig.json b/addons/addon-webgl/src/tsconfig.json similarity index 100% rename from addons/xterm-addon-webgl/src/tsconfig.json rename to addons/addon-webgl/src/tsconfig.json diff --git a/addons/xterm-addon-webgl/test/WebglRenderer.test.ts b/addons/addon-webgl/test/WebglRenderer.test.ts similarity index 100% rename from addons/xterm-addon-webgl/test/WebglRenderer.test.ts rename to addons/addon-webgl/test/WebglRenderer.test.ts diff --git a/addons/xterm-addon-webgl/test/playwright.config.ts b/addons/addon-webgl/test/playwright.config.ts similarity index 100% rename from addons/xterm-addon-webgl/test/playwright.config.ts rename to addons/addon-webgl/test/playwright.config.ts diff --git a/addons/xterm-addon-webgl/test/tsconfig.json b/addons/addon-webgl/test/tsconfig.json similarity index 100% rename from addons/xterm-addon-webgl/test/tsconfig.json rename to addons/addon-webgl/test/tsconfig.json diff --git a/addons/xterm-addon-webgl/tsconfig.json b/addons/addon-webgl/tsconfig.json similarity index 100% rename from addons/xterm-addon-webgl/tsconfig.json rename to addons/addon-webgl/tsconfig.json diff --git a/addons/xterm-addon-webgl/typings/xterm-addon-webgl.d.ts b/addons/addon-webgl/typings/addon-webgl.d.ts similarity index 96% rename from addons/xterm-addon-webgl/typings/xterm-addon-webgl.d.ts rename to addons/addon-webgl/typings/addon-webgl.d.ts index 79108e0d..e9f459cf 100644 --- a/addons/xterm-addon-webgl/typings/xterm-addon-webgl.d.ts +++ b/addons/addon-webgl/typings/addon-webgl.d.ts @@ -5,7 +5,7 @@ import { Terminal, ITerminalAddon, IEvent } from 'xterm'; -declare module 'xterm-addon-webgl' { +declare module '@xterm/addon-webgl' { /** * An xterm.js addon that provides search functionality. */ diff --git a/addons/xterm-addon-webgl/webpack.config.js b/addons/addon-webgl/webpack.config.js similarity index 94% rename from addons/xterm-addon-webgl/webpack.config.js rename to addons/addon-webgl/webpack.config.js index 578b1102..f31ffd51 100644 --- a/addons/xterm-addon-webgl/webpack.config.js +++ b/addons/addon-webgl/webpack.config.js @@ -6,7 +6,7 @@ const path = require('path'); const addonName = 'WebglAddon'; -const mainFile = 'xterm-addon-webgl.js'; +const mainFile = 'addon-webgl.js'; module.exports = { entry: `./out/${addonName}.js`, diff --git a/bin/publish.js b/bin/publish.js index e9c7c3e8..c9ce5e51 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -27,16 +27,16 @@ if (changedFiles.some(e => e.search(/^addons\//) === -1)) { // Publish addons if any files were changed inside of the addon const addonPackageDirs = [ - path.resolve(__dirname, '../addons/xterm-addon-attach'), - path.resolve(__dirname, '../addons/xterm-addon-canvas'), - path.resolve(__dirname, '../addons/xterm-addon-fit'), - // path.resolve(__dirname, '../addons/xterm-addon-image'), - path.resolve(__dirname, '../addons/xterm-addon-ligatures'), - path.resolve(__dirname, '../addons/xterm-addon-search'), - path.resolve(__dirname, '../addons/xterm-addon-serialize'), - path.resolve(__dirname, '../addons/xterm-addon-unicode11'), - path.resolve(__dirname, '../addons/xterm-addon-web-links'), - path.resolve(__dirname, '../addons/xterm-addon-webgl') + // path.resolve(__dirname, '../addons/xterm-addon-attach'), + // path.resolve(__dirname, '../addons/xterm-addon-canvas'), + // path.resolve(__dirname, '../addons/xterm-addon-fit'), + // // path.resolve(__dirname, '../addons/xterm-addon-image'), + // path.resolve(__dirname, '../addons/xterm-addon-ligatures'), + // path.resolve(__dirname, '../addons/xterm-addon-search'), + // path.resolve(__dirname, '../addons/xterm-addon-serialize'), + // path.resolve(__dirname, '../addons/xterm-addon-unicode11'), + // path.resolve(__dirname, '../addons/xterm-addon-web-links'), + path.resolve(__dirname, '../addons/addon-webgl') ]; console.log(`Checking if addons need to be published`); for (const p of addonPackageDirs) { @@ -70,7 +70,7 @@ function checkAndPublishPackage(packageDir) { fs.writeFileSync(packageJsonFile, JSON.stringify(packageJson, null, 2)); // Publish - const args = ['publish']; + const args = ['publish', '--access', 'public']; if (!isStableRelease) { args.push('--tag', 'beta'); } diff --git a/bin/test_playwright.js b/bin/test_playwright.js index 02c2a763..12aa0cf0 100644 --- a/bin/test_playwright.js +++ b/bin/test_playwright.js @@ -20,7 +20,7 @@ while (argv.some(e => e.startsWith('--suite='))) { let configs = [ { name: 'core', path: 'out-test/playwright/playwright.config.js' }, { name: 'xterm-addon-canvas', path: 'addons/xterm-addon-canvas/out-test/playwright.config.js' }, - { name: 'xterm-addon-webgl', path: 'addons/xterm-addon-webgl/out-test/playwright.config.js' } + { name: 'addon-webgl', path: 'addons/addon-webgl/out-test/playwright.config.js' } ]; if (suiteFilter) { diff --git a/demo/client.ts b/demo/client.ts index a1145ab9..a8f549b6 100644 --- a/demo/client.ts +++ b/demo/client.ts @@ -16,7 +16,7 @@ import { FitAddon } from '../addons/xterm-addon-fit/out/FitAddon'; import { SearchAddon, ISearchOptions } from '../addons/xterm-addon-search/out/SearchAddon'; import { SerializeAddon } from '../addons/xterm-addon-serialize/out/SerializeAddon'; import { WebLinksAddon } from '../addons/xterm-addon-web-links/out/WebLinksAddon'; -import { WebglAddon } from '../addons/xterm-addon-webgl/out/WebglAddon'; +import { WebglAddon } from '../addons/addon-webgl/out/WebglAddon'; import { Unicode11Addon } from '../addons/xterm-addon-unicode11/out/Unicode11Addon'; import { UnicodeGraphemesAddon } from '../addons/xterm-addon-unicode-graphemes/out/UnicodeGraphemesAddon'; import { LigaturesAddon } from '../addons/xterm-addon-ligatures/out/LigaturesAddon'; @@ -37,7 +37,7 @@ if ('WebAssembly' in window) { // import { SearchAddon, ISearchOptions } from 'xterm-addon-search'; // import { SerializeAddon } from 'xterm-addon-serialize'; // import { WebLinksAddon } from 'xterm-addon-web-links'; -// import { WebglAddon } from 'xterm-addon-webgl'; +// import { WebglAddon } from '@xterm/addon-webgl'; // import { Unicode11Addon } from 'xterm-addon-unicode11'; // import { UnicodeGraphemesAddon } from 'xterm-addon-unicode-graphemes'; // import { LigaturesAddon } from 'xterm-addon-ligatures'; diff --git a/demo/tsconfig.json b/demo/tsconfig.json index f728f20e..cd15a36d 100644 --- a/demo/tsconfig.json +++ b/demo/tsconfig.json @@ -12,7 +12,7 @@ "xterm-addon-search": ["../addons/xterm-addon-search"], "xterm-addon-serialize": ["../addons/xterm-addon-serialize"], "xterm-addon-web-links": ["../addons/xterm-addon-web-links"], - "xterm-addon-webgl": ["../addons/xterm-addon-webgl"] + "addon-webgl": ["../addons/addon-webgl"] } }, "include": [ diff --git a/package.json b/package.json index 70e0f4a9..d0510e5d 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "xterm", + "name": "@xterm/xterm", "description": "Full xterm terminal, in your browser", "version": "5.3.0", "main": "lib/xterm.js", diff --git a/tsconfig.all.json b/tsconfig.all.json index 5d8af629..e3fc22cf 100644 --- a/tsconfig.all.json +++ b/tsconfig.all.json @@ -17,6 +17,6 @@ { "path": "./addons/xterm-addon-unicode11" }, { "path": "./addons/xterm-addon-unicode-graphemes" }, { "path": "./addons/xterm-addon-web-links" }, - { "path": "./addons/xterm-addon-webgl" } + { "path": "./addons/addon-webgl" } ] } From 905285efda573e70b82cf6d3405a30aadc3db192 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 06:48:33 -0700 Subject: [PATCH 40/73] Temporarily enable publishing in PRs --- .github/workflows/release.yml | 2 ++ typings/xterm-headless.d.ts | 2 +- typings/xterm.d.ts | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1e26e438..21526c2c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,6 +5,8 @@ on: # If a commit reaches master, assume it has passed CI via PR and publish # without running tests to save time to publish branches: [ "master" ] + pull_request: + branches: [ "master" ] jobs: release: diff --git a/typings/xterm-headless.d.ts b/typings/xterm-headless.d.ts index 99aa8237..f8cef382 100644 --- a/typings/xterm-headless.d.ts +++ b/typings/xterm-headless.d.ts @@ -7,7 +7,7 @@ * to be stable and consumed by external programs. */ -declare module 'xterm-headless' { +declare module '@xterm/headless' { /** * A string representing log level. */ diff --git a/typings/xterm.d.ts b/typings/xterm.d.ts index b8c11455..70b0c6d7 100644 --- a/typings/xterm.d.ts +++ b/typings/xterm.d.ts @@ -9,7 +9,7 @@ /// -declare module 'xterm' { +declare module '@xterm/xterm' { /** * A string or number representing text font weight. */ From bb9728ccd1685665b6ef60468ac4c6b81012e15c Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 06:50:08 -0700 Subject: [PATCH 41/73] from xterm -> from scoped --- README.md | 4 ++-- addons/addon-webgl/src/GlyphRenderer.ts | 2 +- addons/addon-webgl/src/RectangleRenderer.ts | 2 +- addons/addon-webgl/src/WebglAddon.ts | 2 +- addons/addon-webgl/src/WebglRenderer.ts | 2 +- addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts | 2 +- addons/addon-webgl/src/renderLayer/LinkRenderLayer.ts | 2 +- addons/addon-webgl/src/renderLayer/Types.ts | 2 +- addons/addon-webgl/typings/addon-webgl.d.ts | 2 +- addons/xterm-addon-attach/README.md | 2 +- addons/xterm-addon-attach/src/AttachAddon.ts | 2 +- addons/xterm-addon-attach/typings/xterm-addon-attach.d.ts | 2 +- addons/xterm-addon-canvas/README.md | 2 +- addons/xterm-addon-canvas/src/BaseRenderLayer.ts | 2 +- addons/xterm-addon-canvas/src/CanvasAddon.ts | 2 +- addons/xterm-addon-canvas/src/CanvasRenderer.ts | 2 +- addons/xterm-addon-canvas/src/CursorRenderLayer.ts | 2 +- addons/xterm-addon-canvas/src/LinkRenderLayer.ts | 2 +- addons/xterm-addon-canvas/src/SelectionRenderLayer.ts | 2 +- addons/xterm-addon-canvas/src/TextRenderLayer.ts | 2 +- addons/xterm-addon-canvas/typings/xterm-addon-canvas.d.ts | 2 +- addons/xterm-addon-fit/README.md | 2 +- addons/xterm-addon-fit/src/FitAddon.ts | 2 +- addons/xterm-addon-fit/typings/xterm-addon-fit.d.ts | 2 +- addons/xterm-addon-image/README.md | 2 +- addons/xterm-addon-image/src/ImageAddon.ts | 2 +- addons/xterm-addon-image/src/ImageRenderer.ts | 2 +- addons/xterm-addon-image/src/ImageStorage.ts | 2 +- addons/xterm-addon-image/src/Types.d.ts | 2 +- addons/xterm-addon-image/typings/xterm-addon-image.d.ts | 4 ++-- addons/xterm-addon-ligatures/README.md | 2 +- addons/xterm-addon-ligatures/src/LigaturesAddon.ts | 2 +- addons/xterm-addon-ligatures/src/index.ts | 2 +- .../xterm-addon-ligatures/typings/xterm-addon-ligatures.d.ts | 2 +- addons/xterm-addon-search/README.md | 2 +- addons/xterm-addon-search/src/SearchAddon.ts | 2 +- addons/xterm-addon-search/typings/xterm-addon-search.d.ts | 2 +- addons/xterm-addon-serialize/src/SerializeAddon.ts | 2 +- .../xterm-addon-serialize/typings/xterm-addon-serialize.d.ts | 2 +- addons/xterm-addon-unicode-graphemes/README.md | 2 +- .../src/UnicodeGraphemeProvider.ts | 2 +- .../src/UnicodeGraphemesAddon.ts | 2 +- .../typings/xterm-addon-unicode-graphemes.d.ts | 2 +- addons/xterm-addon-unicode11/README.md | 2 +- addons/xterm-addon-unicode11/src/Unicode11Addon.ts | 2 +- addons/xterm-addon-unicode11/src/UnicodeV11.ts | 2 +- .../xterm-addon-unicode11/typings/xterm-addon-unicode11.d.ts | 2 +- addons/xterm-addon-web-links/README.md | 2 +- addons/xterm-addon-web-links/src/WebLinkProvider.ts | 2 +- addons/xterm-addon-web-links/src/WebLinksAddon.ts | 2 +- .../xterm-addon-web-links/typings/xterm-addon-web-links.d.ts | 2 +- demo/client.ts | 2 +- src/browser/Terminal.ts | 2 +- src/browser/Terminal2.test.ts | 2 +- src/browser/TestUtils.test.ts | 2 +- src/browser/Types.d.ts | 2 +- src/browser/public/Terminal.ts | 2 +- src/browser/renderer/shared/CellColorResolver.ts | 2 +- src/browser/renderer/shared/CharAtlasCache.ts | 2 +- src/browser/renderer/shared/CharAtlasUtils.ts | 2 +- src/browser/renderer/shared/SelectionRenderModel.ts | 2 +- src/browser/renderer/shared/Types.d.ts | 2 +- src/common/TestUtils.test.ts | 2 +- src/common/Types.d.ts | 2 +- src/common/buffer/BufferRange.test.ts | 2 +- src/common/buffer/BufferRange.ts | 2 +- src/common/public/AddonManager.test.ts | 2 +- src/common/public/AddonManager.ts | 2 +- src/common/public/BufferApiView.ts | 2 +- src/common/public/BufferLineApiView.ts | 2 +- src/common/public/BufferNamespaceApi.ts | 2 +- src/common/public/ParserApi.ts | 2 +- src/common/public/UnicodeApi.ts | 2 +- src/common/services/DecorationService.ts | 2 +- src/common/services/Services.ts | 2 +- src/headless/tsconfig.json | 2 +- test/api/TestUtils.ts | 2 +- test/playwright/MouseTracking.test.ts | 2 +- test/playwright/Parser.test.ts | 2 +- test/playwright/SharedRendererTests.ts | 2 +- test/playwright/TestUtils.ts | 2 +- 81 files changed, 83 insertions(+), 83 deletions(-) diff --git a/README.md b/README.md index 0abcd32c..64dde4c1 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ To start using xterm.js on your browser, add the `xterm.js` and `xterm.css` to t The recommended way to load xterm.js is via the ES6 module syntax: ```javascript -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; ``` ### Addons @@ -65,7 +65,7 @@ npm i -S xterm-addon-web-links Then import the addon, instantiate it and call `Terminal.loadAddon`: ```ts -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; import { WebLinksAddon } from 'xterm-addon-web-links'; const terminal = new Terminal(); diff --git a/addons/addon-webgl/src/GlyphRenderer.ts b/addons/addon-webgl/src/GlyphRenderer.ts index e0669102..1fb0e18c 100644 --- a/addons/addon-webgl/src/GlyphRenderer.ts +++ b/addons/addon-webgl/src/GlyphRenderer.ts @@ -8,7 +8,7 @@ import { TextureAtlas } from 'browser/renderer/shared/TextureAtlas'; import { IRasterizedGlyph, IRenderDimensions, ITextureAtlas } from 'browser/renderer/shared/Types'; import { NULL_CELL_CODE } from 'common/buffer/Constants'; import { Disposable, toDisposable } from 'common/Lifecycle'; -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; import { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject } 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 5e9c364e..2a1f5392 100644 --- a/addons/addon-webgl/src/RectangleRenderer.ts +++ b/addons/addon-webgl/src/RectangleRenderer.ts @@ -10,7 +10,7 @@ import { ReadonlyColorSet } from 'browser/Types'; import { Attributes, FgFlags } from 'common/buffer/Constants'; import { Disposable, toDisposable } from 'common/Lifecycle'; import { IColor } from 'common/Types'; -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; import { RENDER_MODEL_BG_OFFSET, RENDER_MODEL_FG_OFFSET, RENDER_MODEL_INDICIES_PER_CELL } from './RenderModel'; import { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject } from './Types'; import { createProgram, expandFloat32Array, PROJECTION_MATRIX } from './WebglUtils'; diff --git a/addons/addon-webgl/src/WebglAddon.ts b/addons/addon-webgl/src/WebglAddon.ts index 3e091f0b..3e2925c5 100644 --- a/addons/addon-webgl/src/WebglAddon.ts +++ b/addons/addon-webgl/src/WebglAddon.ts @@ -9,7 +9,7 @@ import { EventEmitter, 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 { ITerminalAddon, Terminal } from 'xterm'; +import { ITerminalAddon, Terminal } from '@xterm/xterm'; import { WebglRenderer } from './WebglRenderer'; import { setTraceLogger } from 'common/services/LogService'; diff --git a/addons/addon-webgl/src/WebglRenderer.ts b/addons/addon-webgl/src/WebglRenderer.ts index 51749984..9b7d56df 100644 --- a/addons/addon-webgl/src/WebglRenderer.ts +++ b/addons/addon-webgl/src/WebglRenderer.ts @@ -19,7 +19,7 @@ import { AttributeData } from 'common/buffer/AttributeData'; import { CellData } from 'common/buffer/CellData'; import { Attributes, Content, NULL_CELL_CHAR, NULL_CELL_CODE } from 'common/buffer/Constants'; import { ICoreService, IDecorationService, IOptionsService } from 'common/services/Services'; -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; import { GlyphRenderer } from './GlyphRenderer'; import { RectangleRenderer } from './RectangleRenderer'; import { COMBINED_CHAR_BIT_MASK, RENDER_MODEL_BG_OFFSET, RENDER_MODEL_EXT_OFFSET, RENDER_MODEL_FG_OFFSET, RENDER_MODEL_INDICIES_PER_CELL, RenderModel } from './RenderModel'; diff --git a/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts b/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts index 11f96ed8..93e0fcb1 100644 --- a/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts +++ b/addons/addon-webgl/src/renderLayer/BaseRenderLayer.ts @@ -12,7 +12,7 @@ import { ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { Disposable, toDisposable } from 'common/Lifecycle'; import { CellData } from 'common/buffer/CellData'; import { IOptionsService } from 'common/services/Services'; -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; import { IRenderLayer } from './Types'; export abstract class BaseRenderLayer extends Disposable implements IRenderLayer { diff --git a/addons/addon-webgl/src/renderLayer/LinkRenderLayer.ts b/addons/addon-webgl/src/renderLayer/LinkRenderLayer.ts index aefc9f6e..0aaf5e70 100644 --- a/addons/addon-webgl/src/renderLayer/LinkRenderLayer.ts +++ b/addons/addon-webgl/src/renderLayer/LinkRenderLayer.ts @@ -9,7 +9,7 @@ import { IRenderDimensions } from 'browser/renderer/shared/Types'; import { ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { ILinkifier2, ILinkifierEvent } from 'browser/Types'; import { IOptionsService } from 'common/services/Services'; -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; import { BaseRenderLayer } from './BaseRenderLayer'; export class LinkRenderLayer extends BaseRenderLayer { diff --git a/addons/addon-webgl/src/renderLayer/Types.ts b/addons/addon-webgl/src/renderLayer/Types.ts index 3dbdfd9c..feeceb14 100644 --- a/addons/addon-webgl/src/renderLayer/Types.ts +++ b/addons/addon-webgl/src/renderLayer/Types.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { IDisposable, Terminal } from 'xterm'; +import { IDisposable, Terminal } from '@xterm/xterm'; import { IRenderDimensions } from 'browser/renderer/shared/Types'; export interface IRenderLayer extends IDisposable { diff --git a/addons/addon-webgl/typings/addon-webgl.d.ts b/addons/addon-webgl/typings/addon-webgl.d.ts index e9f459cf..8c560421 100644 --- a/addons/addon-webgl/typings/addon-webgl.d.ts +++ b/addons/addon-webgl/typings/addon-webgl.d.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { Terminal, ITerminalAddon, IEvent } from 'xterm'; +import { Terminal, ITerminalAddon, IEvent } from '@xterm/xterm'; declare module '@xterm/addon-webgl' { /** diff --git a/addons/xterm-addon-attach/README.md b/addons/xterm-addon-attach/README.md index 67ebf17b..a12c3c67 100644 --- a/addons/xterm-addon-attach/README.md +++ b/addons/xterm-addon-attach/README.md @@ -11,7 +11,7 @@ npm install --save xterm-addon-attach ### Usage ```ts -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; import { AttachAddon } from 'xterm-addon-attach'; const terminal = new Terminal(); diff --git a/addons/xterm-addon-attach/src/AttachAddon.ts b/addons/xterm-addon-attach/src/AttachAddon.ts index 7fd8df29..756e03d9 100644 --- a/addons/xterm-addon-attach/src/AttachAddon.ts +++ b/addons/xterm-addon-attach/src/AttachAddon.ts @@ -5,7 +5,7 @@ * Implements the attach method, that attaches the terminal to a WebSocket stream. */ -import { Terminal, IDisposable, ITerminalAddon } from 'xterm'; +import { Terminal, IDisposable, ITerminalAddon } from '@xterm/xterm'; interface IAttachOptions { bidirectional?: boolean; diff --git a/addons/xterm-addon-attach/typings/xterm-addon-attach.d.ts b/addons/xterm-addon-attach/typings/xterm-addon-attach.d.ts index 2956b9d9..86296825 100644 --- a/addons/xterm-addon-attach/typings/xterm-addon-attach.d.ts +++ b/addons/xterm-addon-attach/typings/xterm-addon-attach.d.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { Terminal, ITerminalAddon } from 'xterm'; +import { Terminal, ITerminalAddon } from '@xterm/xterm'; declare module 'xterm-addon-attach' { export interface IAttachOptions { diff --git a/addons/xterm-addon-canvas/README.md b/addons/xterm-addon-canvas/README.md index bffac96e..6d24c592 100644 --- a/addons/xterm-addon-canvas/README.md +++ b/addons/xterm-addon-canvas/README.md @@ -13,7 +13,7 @@ npm install --save xterm-addon-canvas ### Usage ```ts -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; import { CanvasAddon } from 'xterm-addon-canvas'; const terminal = new Terminal(); diff --git a/addons/xterm-addon-canvas/src/BaseRenderLayer.ts b/addons/xterm-addon-canvas/src/BaseRenderLayer.ts index 62fe71a7..0e85901a 100644 --- a/addons/xterm-addon-canvas/src/BaseRenderLayer.ts +++ b/addons/xterm-addon-canvas/src/BaseRenderLayer.ts @@ -19,7 +19,7 @@ import { ICellData } from 'common/Types'; import { CellData } from 'common/buffer/CellData'; import { WHITESPACE_CELL_CODE } from 'common/buffer/Constants'; import { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services'; -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; import { IRenderLayer } from './Types'; export abstract class BaseRenderLayer extends Disposable implements IRenderLayer { diff --git a/addons/xterm-addon-canvas/src/CanvasAddon.ts b/addons/xterm-addon-canvas/src/CanvasAddon.ts index 91438a4c..6cfa2d46 100644 --- a/addons/xterm-addon-canvas/src/CanvasAddon.ts +++ b/addons/xterm-addon-canvas/src/CanvasAddon.ts @@ -9,7 +9,7 @@ import { EventEmitter, 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 { ITerminalAddon, Terminal } from 'xterm'; +import { ITerminalAddon, Terminal } from '@xterm/xterm'; import { CanvasRenderer } from './CanvasRenderer'; export class CanvasAddon extends Disposable implements ITerminalAddon { diff --git a/addons/xterm-addon-canvas/src/CanvasRenderer.ts b/addons/xterm-addon-canvas/src/CanvasRenderer.ts index cd05f921..40b89546 100644 --- a/addons/xterm-addon-canvas/src/CanvasRenderer.ts +++ b/addons/xterm-addon-canvas/src/CanvasRenderer.ts @@ -12,7 +12,7 @@ import { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IThemeS import { EventEmitter, forwardEvent } from 'common/EventEmitter'; import { Disposable, toDisposable } from 'common/Lifecycle'; import { IBufferService, ICoreService, IDecorationService, IOptionsService } from 'common/services/Services'; -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; import { CursorRenderLayer } from './CursorRenderLayer'; import { LinkRenderLayer } from './LinkRenderLayer'; import { SelectionRenderLayer } from './SelectionRenderLayer'; diff --git a/addons/xterm-addon-canvas/src/CursorRenderLayer.ts b/addons/xterm-addon-canvas/src/CursorRenderLayer.ts index c5174f86..adc1db18 100644 --- a/addons/xterm-addon-canvas/src/CursorRenderLayer.ts +++ b/addons/xterm-addon-canvas/src/CursorRenderLayer.ts @@ -12,7 +12,7 @@ import { isFirefox } from 'common/Platform'; import { ICellData } from 'common/Types'; import { CellData } from 'common/buffer/CellData'; import { IBufferService, ICoreService, IDecorationService, IOptionsService } from 'common/services/Services'; -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; import { BaseRenderLayer } from './BaseRenderLayer'; interface ICursorState { diff --git a/addons/xterm-addon-canvas/src/LinkRenderLayer.ts b/addons/xterm-addon-canvas/src/LinkRenderLayer.ts index 882f7d8c..1cdf71c2 100644 --- a/addons/xterm-addon-canvas/src/LinkRenderLayer.ts +++ b/addons/xterm-addon-canvas/src/LinkRenderLayer.ts @@ -9,7 +9,7 @@ import { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants'; import { IRenderDimensions } from 'browser/renderer/shared/Types'; import { ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services'; -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; import { BaseRenderLayer } from './BaseRenderLayer'; export class LinkRenderLayer extends BaseRenderLayer { diff --git a/addons/xterm-addon-canvas/src/SelectionRenderLayer.ts b/addons/xterm-addon-canvas/src/SelectionRenderLayer.ts index 10950868..01612a1d 100644 --- a/addons/xterm-addon-canvas/src/SelectionRenderLayer.ts +++ b/addons/xterm-addon-canvas/src/SelectionRenderLayer.ts @@ -7,7 +7,7 @@ import { IRenderDimensions } from 'browser/renderer/shared/Types'; import { BaseRenderLayer } from './BaseRenderLayer'; import { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services'; import { ICoreBrowserService, IThemeService } from 'browser/services/Services'; -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; interface ISelectionState { start?: [number, number]; diff --git a/addons/xterm-addon-canvas/src/TextRenderLayer.ts b/addons/xterm-addon-canvas/src/TextRenderLayer.ts index 46d052f3..43c33d64 100644 --- a/addons/xterm-addon-canvas/src/TextRenderLayer.ts +++ b/addons/xterm-addon-canvas/src/TextRenderLayer.ts @@ -11,7 +11,7 @@ import { AttributeData } from 'common/buffer/AttributeData'; import { CellData } from 'common/buffer/CellData'; import { Content, NULL_CELL_CODE } from 'common/buffer/Constants'; import { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services'; -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; import { BaseRenderLayer } from './BaseRenderLayer'; import { GridCache } from './GridCache'; diff --git a/addons/xterm-addon-canvas/typings/xterm-addon-canvas.d.ts b/addons/xterm-addon-canvas/typings/xterm-addon-canvas.d.ts index c983825c..9a444d27 100644 --- a/addons/xterm-addon-canvas/typings/xterm-addon-canvas.d.ts +++ b/addons/xterm-addon-canvas/typings/xterm-addon-canvas.d.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { Terminal, ITerminalAddon, IEvent } from 'xterm'; +import { Terminal, ITerminalAddon, IEvent } from '@xterm/xterm'; declare module 'xterm-addon-canvas' { /** diff --git a/addons/xterm-addon-fit/README.md b/addons/xterm-addon-fit/README.md index 321b2cf7..0b858fb4 100644 --- a/addons/xterm-addon-fit/README.md +++ b/addons/xterm-addon-fit/README.md @@ -11,7 +11,7 @@ npm install --save xterm-addon-fit ### Usage ```ts -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; import { FitAddon } from 'xterm-addon-fit'; const terminal = new Terminal(); diff --git a/addons/xterm-addon-fit/src/FitAddon.ts b/addons/xterm-addon-fit/src/FitAddon.ts index f7245462..c634ea8f 100644 --- a/addons/xterm-addon-fit/src/FitAddon.ts +++ b/addons/xterm-addon-fit/src/FitAddon.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { Terminal, ITerminalAddon } from 'xterm'; +import { Terminal, ITerminalAddon } from '@xterm/xterm'; import { IRenderDimensions } from 'browser/renderer/shared/Types'; interface ITerminalDimensions { diff --git a/addons/xterm-addon-fit/typings/xterm-addon-fit.d.ts b/addons/xterm-addon-fit/typings/xterm-addon-fit.d.ts index 2d1b8f1d..605a7b1d 100644 --- a/addons/xterm-addon-fit/typings/xterm-addon-fit.d.ts +++ b/addons/xterm-addon-fit/typings/xterm-addon-fit.d.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { Terminal, ITerminalAddon } from 'xterm'; +import { Terminal, ITerminalAddon } from '@xterm/xterm'; declare module 'xterm-addon-fit' { /** diff --git a/addons/xterm-addon-image/README.md b/addons/xterm-addon-image/README.md index 686df9b4..f9ccd637 100644 --- a/addons/xterm-addon-image/README.md +++ b/addons/xterm-addon-image/README.md @@ -16,7 +16,7 @@ npm install --save xterm-addon-image ### Usage ```ts -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; import { ImageAddon, IImageAddonOptions } from 'xterm-addon-image'; // customize as needed (showing addon defaults) diff --git a/addons/xterm-addon-image/src/ImageAddon.ts b/addons/xterm-addon-image/src/ImageAddon.ts index bb633e6b..f02ec311 100644 --- a/addons/xterm-addon-image/src/ImageAddon.ts +++ b/addons/xterm-addon-image/src/ImageAddon.ts @@ -4,7 +4,7 @@ */ import { IIPHandler } from './IIPHandler'; -import { ITerminalAddon, IDisposable } from 'xterm'; +import { ITerminalAddon, IDisposable } from '@xterm/xterm'; import { ImageRenderer } from './ImageRenderer'; import { ImageStorage, CELL_SIZE_DEFAULT } from './ImageStorage'; import { SixelHandler } from './SixelHandler'; diff --git a/addons/xterm-addon-image/src/ImageRenderer.ts b/addons/xterm-addon-image/src/ImageRenderer.ts index 9b528efe..214a2e6b 100644 --- a/addons/xterm-addon-image/src/ImageRenderer.ts +++ b/addons/xterm-addon-image/src/ImageRenderer.ts @@ -4,7 +4,7 @@ */ import { toRGBA8888 } from 'sixel/lib/Colors'; -import { IDisposable } from 'xterm'; +import { IDisposable } from '@xterm/xterm'; import { ICellSize, ITerminalExt, IImageSpec, IRenderDimensions, IRenderService } from './Types'; import { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle'; diff --git a/addons/xterm-addon-image/src/ImageStorage.ts b/addons/xterm-addon-image/src/ImageStorage.ts index 97eef852..8b3891ee 100644 --- a/addons/xterm-addon-image/src/ImageStorage.ts +++ b/addons/xterm-addon-image/src/ImageStorage.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { IDisposable } from 'xterm'; +import { IDisposable } from '@xterm/xterm'; import { ImageRenderer } from './ImageRenderer'; import { ITerminalExt, IExtendedAttrsImage, IImageAddonOptions, IImageSpec, IBufferLineExt, BgFlags, Cell, Content, ICellSize, ExtFlags, Attributes, UnderlineStyle } from './Types'; diff --git a/addons/xterm-addon-image/src/Types.d.ts b/addons/xterm-addon-image/src/Types.d.ts index 62f4481a..60de0f3d 100644 --- a/addons/xterm-addon-image/src/Types.d.ts +++ b/addons/xterm-addon-image/src/Types.d.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { IDisposable, IMarker, Terminal } from 'xterm'; +import { IDisposable, IMarker, Terminal } from '@xterm/xterm'; // private imports from base repo we build against import { Attributes, BgFlags, Content, ExtFlags, UnderlineStyle } from 'common/buffer/Constants'; diff --git a/addons/xterm-addon-image/typings/xterm-addon-image.d.ts b/addons/xterm-addon-image/typings/xterm-addon-image.d.ts index 94dc6f65..608eb9fd 100644 --- a/addons/xterm-addon-image/typings/xterm-addon-image.d.ts +++ b/addons/xterm-addon-image/typings/xterm-addon-image.d.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { Terminal, ITerminalAddon } from 'xterm'; +import { Terminal, ITerminalAddon } from '@xterm/xterm'; declare module 'xterm-addon-image' { export interface IImageAddonOptions { @@ -37,7 +37,7 @@ declare module 'xterm-addon-image' { * * Note: `storageLimit` bytes are calculated from images by multiplying the pixels with 4 * (4 channels with one byte, images are stored as RGBA8888). - * + * * Default is 2^16 (4096 x 4096 pixels). */ pixelLimit?: number; diff --git a/addons/xterm-addon-ligatures/README.md b/addons/xterm-addon-ligatures/README.md index fad2a7ef..1c14976b 100644 --- a/addons/xterm-addon-ligatures/README.md +++ b/addons/xterm-addon-ligatures/README.md @@ -16,7 +16,7 @@ npm install --save xterm-addon-ligatures ### Usage ```ts -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; import { LigaturesAddon } from 'xterm-addon-ligatures'; const terminal = new Terminal(); diff --git a/addons/xterm-addon-ligatures/src/LigaturesAddon.ts b/addons/xterm-addon-ligatures/src/LigaturesAddon.ts index c4586b38..27e8fcf3 100644 --- a/addons/xterm-addon-ligatures/src/LigaturesAddon.ts +++ b/addons/xterm-addon-ligatures/src/LigaturesAddon.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; import { enableLigatures } from '.'; import { ILigatureOptions } from './Types'; diff --git a/addons/xterm-addon-ligatures/src/index.ts b/addons/xterm-addon-ligatures/src/index.ts index 82675626..bd8ff215 100644 --- a/addons/xterm-addon-ligatures/src/index.ts +++ b/addons/xterm-addon-ligatures/src/index.ts @@ -3,7 +3,7 @@ * @license MIT */ -import type { Terminal } from 'xterm'; +import type { Terminal } from '@xterm/xterm'; import { Font } from 'font-ligatures'; import load from './font'; diff --git a/addons/xterm-addon-ligatures/typings/xterm-addon-ligatures.d.ts b/addons/xterm-addon-ligatures/typings/xterm-addon-ligatures.d.ts index 4d8fbdf0..2b967a33 100644 --- a/addons/xterm-addon-ligatures/typings/xterm-addon-ligatures.d.ts +++ b/addons/xterm-addon-ligatures/typings/xterm-addon-ligatures.d.ts @@ -8,7 +8,7 @@ * which is intended to be stable and consumed by external programs. */ -import { Terminal, ITerminalAddon } from 'xterm'; +import { Terminal, ITerminalAddon } from '@xterm/xterm'; declare module 'xterm-addon-ligatures' { /** diff --git a/addons/xterm-addon-search/README.md b/addons/xterm-addon-search/README.md index 91bcc34b..51ce20b4 100644 --- a/addons/xterm-addon-search/README.md +++ b/addons/xterm-addon-search/README.md @@ -11,7 +11,7 @@ npm install --save xterm-addon-search ### Usage ```ts -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; import { SearchAddon } from 'xterm-addon-search'; const terminal = new Terminal(); diff --git a/addons/xterm-addon-search/src/SearchAddon.ts b/addons/xterm-addon-search/src/SearchAddon.ts index c176a6f2..2e83b0ad 100644 --- a/addons/xterm-addon-search/src/SearchAddon.ts +++ b/addons/xterm-addon-search/src/SearchAddon.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { Terminal, IDisposable, ITerminalAddon, IDecoration } from 'xterm'; +import { Terminal, IDisposable, ITerminalAddon, IDecoration } from '@xterm/xterm'; import { EventEmitter } from 'common/EventEmitter'; import { Disposable, toDisposable, disposeArray, MutableDisposable } from 'common/Lifecycle'; diff --git a/addons/xterm-addon-search/typings/xterm-addon-search.d.ts b/addons/xterm-addon-search/typings/xterm-addon-search.d.ts index 3a3b7c89..c3774bf5 100644 --- a/addons/xterm-addon-search/typings/xterm-addon-search.d.ts +++ b/addons/xterm-addon-search/typings/xterm-addon-search.d.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { Terminal, ITerminalAddon, IEvent } from 'xterm'; +import { Terminal, ITerminalAddon, IEvent } from '@xterm/xterm'; declare module 'xterm-addon-search' { /** diff --git a/addons/xterm-addon-serialize/src/SerializeAddon.ts b/addons/xterm-addon-serialize/src/SerializeAddon.ts index 7a2db089..bb62779b 100644 --- a/addons/xterm-addon-serialize/src/SerializeAddon.ts +++ b/addons/xterm-addon-serialize/src/SerializeAddon.ts @@ -7,7 +7,7 @@ import { DEFAULT_ANSI_COLORS } from 'browser/services/ThemeService'; import { IAttributeData, IColor } from 'common/Types'; -import { IBuffer, IBufferCell, IBufferRange, ITerminalAddon, Terminal } from 'xterm'; +import { IBuffer, IBufferCell, IBufferRange, ITerminalAddon, Terminal } from '@xterm/xterm'; function constrain(value: number, low: number, high: number): number { return Math.max(low, Math.min(value, high)); diff --git a/addons/xterm-addon-serialize/typings/xterm-addon-serialize.d.ts b/addons/xterm-addon-serialize/typings/xterm-addon-serialize.d.ts index 4cb6283d..a675cd14 100644 --- a/addons/xterm-addon-serialize/typings/xterm-addon-serialize.d.ts +++ b/addons/xterm-addon-serialize/typings/xterm-addon-serialize.d.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { Terminal, ITerminalAddon } from 'xterm'; +import { Terminal, ITerminalAddon } from '@xterm/xterm'; declare module 'xterm-addon-serialize' { /** diff --git a/addons/xterm-addon-unicode-graphemes/README.md b/addons/xterm-addon-unicode-graphemes/README.md index 5b8679f8..1f03e4e9 100644 --- a/addons/xterm-addon-unicode-graphemes/README.md +++ b/addons/xterm-addon-unicode-graphemes/README.md @@ -13,7 +13,7 @@ This addon is not yet published to npm ### Usage ```ts -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; import { UnicodeGraphemesAddon } from 'xterm-addon-unicode-graphemes'; const terminal = new Terminal(); diff --git a/addons/xterm-addon-unicode-graphemes/src/UnicodeGraphemeProvider.ts b/addons/xterm-addon-unicode-graphemes/src/UnicodeGraphemeProvider.ts index 39fbec84..3d5717a0 100644 --- a/addons/xterm-addon-unicode-graphemes/src/UnicodeGraphemeProvider.ts +++ b/addons/xterm-addon-unicode-graphemes/src/UnicodeGraphemeProvider.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { IUnicodeVersionProvider } from 'xterm'; +import { IUnicodeVersionProvider } from '@xterm/xterm'; import { UnicodeCharProperties, UnicodeCharWidth } from 'common/services/Services'; import { UnicodeService } from 'common/services/UnicodeService'; import * as UC from './third-party/UnicodeProperties'; diff --git a/addons/xterm-addon-unicode-graphemes/src/UnicodeGraphemesAddon.ts b/addons/xterm-addon-unicode-graphemes/src/UnicodeGraphemesAddon.ts index 80290edf..714f223b 100644 --- a/addons/xterm-addon-unicode-graphemes/src/UnicodeGraphemesAddon.ts +++ b/addons/xterm-addon-unicode-graphemes/src/UnicodeGraphemesAddon.ts @@ -5,7 +5,7 @@ * UnicodeVersionProvider for V15 with grapeme cluster handleing. */ -import { Terminal, ITerminalAddon, IUnicodeHandling } from 'xterm'; +import { Terminal, ITerminalAddon, IUnicodeHandling } from '@xterm/xterm'; import { UnicodeGraphemeProvider } from './UnicodeGraphemeProvider'; diff --git a/addons/xterm-addon-unicode-graphemes/typings/xterm-addon-unicode-graphemes.d.ts b/addons/xterm-addon-unicode-graphemes/typings/xterm-addon-unicode-graphemes.d.ts index 3ab25aa0..3a6a9590 100644 --- a/addons/xterm-addon-unicode-graphemes/typings/xterm-addon-unicode-graphemes.d.ts +++ b/addons/xterm-addon-unicode-graphemes/typings/xterm-addon-unicode-graphemes.d.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { Terminal, ITerminalAddon } from 'xterm'; +import { Terminal, ITerminalAddon } from '@xterm/xterm'; declare module 'xterm-addon-unicode-graphemes' { export class UnicodeGraphemesAddon implements ITerminalAddon { diff --git a/addons/xterm-addon-unicode11/README.md b/addons/xterm-addon-unicode11/README.md index ec01203e..52c2e0d9 100644 --- a/addons/xterm-addon-unicode11/README.md +++ b/addons/xterm-addon-unicode11/README.md @@ -11,7 +11,7 @@ npm install --save xterm-addon-unicode11 ### Usage ```ts -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; import { Unicode11Addon } from 'xterm-addon-unicode11'; const terminal = new Terminal(); diff --git a/addons/xterm-addon-unicode11/src/Unicode11Addon.ts b/addons/xterm-addon-unicode11/src/Unicode11Addon.ts index d4ddf77e..03672fbf 100644 --- a/addons/xterm-addon-unicode11/src/Unicode11Addon.ts +++ b/addons/xterm-addon-unicode11/src/Unicode11Addon.ts @@ -5,7 +5,7 @@ * UnicodeVersionProvider for V11. */ -import { Terminal, ITerminalAddon } from 'xterm'; +import { Terminal, ITerminalAddon } from '@xterm/xterm'; import { UnicodeV11 } from './UnicodeV11'; diff --git a/addons/xterm-addon-unicode11/src/UnicodeV11.ts b/addons/xterm-addon-unicode11/src/UnicodeV11.ts index c1ef08c1..79568960 100644 --- a/addons/xterm-addon-unicode11/src/UnicodeV11.ts +++ b/addons/xterm-addon-unicode11/src/UnicodeV11.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { IUnicodeVersionProvider } from 'xterm'; +import { IUnicodeVersionProvider } from '@xterm/xterm'; import { UnicodeCharProperties, UnicodeCharWidth } from 'common/services/Services'; import { UnicodeService } from 'common/services/UnicodeService'; diff --git a/addons/xterm-addon-unicode11/typings/xterm-addon-unicode11.d.ts b/addons/xterm-addon-unicode11/typings/xterm-addon-unicode11.d.ts index 1d0dce1b..2525dc23 100644 --- a/addons/xterm-addon-unicode11/typings/xterm-addon-unicode11.d.ts +++ b/addons/xterm-addon-unicode11/typings/xterm-addon-unicode11.d.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { Terminal, ITerminalAddon } from 'xterm'; +import { Terminal, ITerminalAddon } from '@xterm/xterm'; declare module 'xterm-addon-unicode11' { export class Unicode11Addon implements ITerminalAddon { diff --git a/addons/xterm-addon-web-links/README.md b/addons/xterm-addon-web-links/README.md index e53f4edf..323c1f01 100644 --- a/addons/xterm-addon-web-links/README.md +++ b/addons/xterm-addon-web-links/README.md @@ -11,7 +11,7 @@ npm install --save xterm-addon-web-links ### Usage ```ts -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; import { WebLinksAddon } from 'xterm-addon-web-links'; const terminal = new Terminal(); diff --git a/addons/xterm-addon-web-links/src/WebLinkProvider.ts b/addons/xterm-addon-web-links/src/WebLinkProvider.ts index 1c9486f5..25dd983c 100644 --- a/addons/xterm-addon-web-links/src/WebLinkProvider.ts +++ b/addons/xterm-addon-web-links/src/WebLinkProvider.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { ILinkProvider, ILink, Terminal, IViewportRange, IBufferLine } from 'xterm'; +import { ILinkProvider, ILink, Terminal, IViewportRange, IBufferLine } from '@xterm/xterm'; export interface ILinkProviderOptions { hover?(event: MouseEvent, text: string, location: IViewportRange): void; diff --git a/addons/xterm-addon-web-links/src/WebLinksAddon.ts b/addons/xterm-addon-web-links/src/WebLinksAddon.ts index 5c956cec..701a658e 100644 --- a/addons/xterm-addon-web-links/src/WebLinksAddon.ts +++ b/addons/xterm-addon-web-links/src/WebLinksAddon.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { Terminal, ITerminalAddon, IDisposable } from 'xterm'; +import { Terminal, ITerminalAddon, IDisposable } from '@xterm/xterm'; import { ILinkProviderOptions, WebLinkProvider } from './WebLinkProvider'; // consider everthing starting with http:// or https:// diff --git a/addons/xterm-addon-web-links/typings/xterm-addon-web-links.d.ts b/addons/xterm-addon-web-links/typings/xterm-addon-web-links.d.ts index dc69d732..11e6ffb2 100644 --- a/addons/xterm-addon-web-links/typings/xterm-addon-web-links.d.ts +++ b/addons/xterm-addon-web-links/typings/xterm-addon-web-links.d.ts @@ -4,7 +4,7 @@ */ -import { Terminal, ITerminalAddon, IViewportRange } from 'xterm'; +import { Terminal, ITerminalAddon, IViewportRange } from '@xterm/xterm'; declare module 'xterm-addon-web-links' { /** diff --git a/demo/client.ts b/demo/client.ts index a8f549b6..df169ffe 100644 --- a/demo/client.ts +++ b/demo/client.ts @@ -44,7 +44,7 @@ if ('WebAssembly' in window) { // Pulling in the module's types relies on the above, it's looks a // little weird here as we're importing "this" module -import { Terminal as TerminalType, ITerminalOptions } from 'xterm'; +import { Terminal as TerminalType, ITerminalOptions } from '@xterm/xterm'; export interface IWindowWithTerminal extends Window { term: TerminalType; diff --git a/src/browser/Terminal.ts b/src/browser/Terminal.ts index b64c3b1d..0413b906 100644 --- a/src/browser/Terminal.ts +++ b/src/browser/Terminal.ts @@ -54,7 +54,7 @@ import { evaluateKeyboardEvent } from 'common/input/Keyboard'; import { toRgbString } from 'common/input/XParseColor'; import { DecorationService } from 'common/services/DecorationService'; import { IDecorationService } from 'common/services/Services'; -import { IDecoration, IDecorationOptions, IDisposable, ILinkProvider, IMarker } from 'xterm'; +import { IDecoration, IDecorationOptions, IDisposable, ILinkProvider, IMarker } from '@xterm/xterm'; import { WindowsOptionsReportType } from '../common/InputHandler'; import { AccessibilityManager } from './AccessibilityManager'; diff --git a/src/browser/Terminal2.test.ts b/src/browser/Terminal2.test.ts index 4965e8f3..abbb42d3 100644 --- a/src/browser/Terminal2.test.ts +++ b/src/browser/Terminal2.test.ts @@ -9,7 +9,7 @@ import * as os from 'os'; import * as fs from 'fs'; import * as pty from 'node-pty'; import { Terminal } from 'browser/Terminal'; -import { IDisposable } from 'xterm'; +import { IDisposable } from '@xterm/xterm'; // all test files expect terminal in 80x25 const COLS = 80; diff --git a/src/browser/TestUtils.test.ts b/src/browser/TestUtils.test.ts index d557cd98..7e43017a 100644 --- a/src/browser/TestUtils.test.ts +++ b/src/browser/TestUtils.test.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { IDisposable, IMarker, ILinkProvider, IDecorationOptions, IDecoration } from 'xterm'; +import { IDisposable, IMarker, ILinkProvider, IDecorationOptions, IDecoration } from '@xterm/xterm'; import { IEvent, EventEmitter } from 'common/EventEmitter'; import { ICharacterJoinerService, ICharSizeService, ICoreBrowserService, IMouseService, IRenderService, ISelectionService, IThemeService } from 'browser/services/Services'; import { IRenderDimensions, IRenderer, IRequestRedrawEvent } from 'browser/renderer/shared/Types'; diff --git a/src/browser/Types.d.ts b/src/browser/Types.d.ts index f2b5e220..b1f31b20 100644 --- a/src/browser/Types.d.ts +++ b/src/browser/Types.d.ts @@ -6,7 +6,7 @@ import { IEvent } from 'common/EventEmitter'; import { CharData, IColor, ICoreTerminal, ITerminalOptions } from 'common/Types'; import { IBuffer } from 'common/buffer/Types'; -import { IDisposable, Terminal as ITerminalApi } from 'xterm'; +import { IDisposable, Terminal as ITerminalApi } from '@xterm/xterm'; import { IMouseService, IRenderService } from './services/Services'; /** diff --git a/src/browser/public/Terminal.ts b/src/browser/public/Terminal.ts index 2c75d7b8..6f009f74 100644 --- a/src/browser/public/Terminal.ts +++ b/src/browser/public/Terminal.ts @@ -13,7 +13,7 @@ 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, ITerminalAddon, Terminal as ITerminalApi, ITerminalInitOnlyOptions, IUnicodeHandling } from 'xterm'; +import { IBufferNamespace as IBufferNamespaceApi, IDecoration, IDecorationOptions, IDisposable, ILinkProvider, ILocalizableStrings, IMarker, IModes, IParser, ITerminalAddon, Terminal as ITerminalApi, ITerminalInitOnlyOptions, IUnicodeHandling } from '@xterm/xterm'; /** * The set of options that only have an effect when set in the Terminal constructor. diff --git a/src/browser/renderer/shared/CellColorResolver.ts b/src/browser/renderer/shared/CellColorResolver.ts index 66e6a344..72a9fa30 100644 --- a/src/browser/renderer/shared/CellColorResolver.ts +++ b/src/browser/renderer/shared/CellColorResolver.ts @@ -4,7 +4,7 @@ import { ReadonlyColorSet } from 'browser/Types'; import { Attributes, BgFlags, FgFlags } from 'common/buffer/Constants'; import { IDecorationService } from 'common/services/Services'; import { ICellData } from 'common/Types'; -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; // Work variables to avoid garbage collection let $fg = 0; diff --git a/src/browser/renderer/shared/CharAtlasCache.ts b/src/browser/renderer/shared/CharAtlasCache.ts index 67343912..0a871483 100644 --- a/src/browser/renderer/shared/CharAtlasCache.ts +++ b/src/browser/renderer/shared/CharAtlasCache.ts @@ -4,7 +4,7 @@ */ import { TextureAtlas } from 'browser/renderer/shared/TextureAtlas'; -import { ITerminalOptions, Terminal } from 'xterm'; +import { ITerminalOptions, Terminal } from '@xterm/xterm'; import { ITerminal, ReadonlyColorSet } from 'browser/Types'; import { ICharAtlasConfig, ITextureAtlas } from 'browser/renderer/shared/Types'; import { generateConfig, configEquals } from 'browser/renderer/shared/CharAtlasUtils'; diff --git a/src/browser/renderer/shared/CharAtlasUtils.ts b/src/browser/renderer/shared/CharAtlasUtils.ts index 955bd4e6..f8fe9104 100644 --- a/src/browser/renderer/shared/CharAtlasUtils.ts +++ b/src/browser/renderer/shared/CharAtlasUtils.ts @@ -5,7 +5,7 @@ import { ICharAtlasConfig } from './Types'; import { Attributes } from 'common/buffer/Constants'; -import { ITerminalOptions } from 'xterm'; +import { ITerminalOptions } from '@xterm/xterm'; import { IColorSet, ReadonlyColorSet } from 'browser/Types'; import { NULL_COLOR } from 'common/Color'; diff --git a/src/browser/renderer/shared/SelectionRenderModel.ts b/src/browser/renderer/shared/SelectionRenderModel.ts index db375778..1568ad8b 100644 --- a/src/browser/renderer/shared/SelectionRenderModel.ts +++ b/src/browser/renderer/shared/SelectionRenderModel.ts @@ -4,7 +4,7 @@ */ import { ISelectionRenderModel } from 'browser/renderer/shared/Types'; -import { Terminal } from 'xterm'; +import { Terminal } from '@xterm/xterm'; class SelectionRenderModel implements ISelectionRenderModel { public hasSelection!: boolean; diff --git a/src/browser/renderer/shared/Types.d.ts b/src/browser/renderer/shared/Types.d.ts index a7e55e72..029ac88a 100644 --- a/src/browser/renderer/shared/Types.d.ts +++ b/src/browser/renderer/shared/Types.d.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { FontWeight, Terminal } from 'xterm'; +import { FontWeight, Terminal } from '@xterm/xterm'; import { IColorSet } from 'browser/Types'; import { IDisposable } from 'common/Types'; import { IEvent } from 'common/EventEmitter'; diff --git a/src/common/TestUtils.test.ts b/src/common/TestUtils.test.ts index 8e57664e..39e13fba 100644 --- a/src/common/TestUtils.test.ts +++ b/src/common/TestUtils.test.ts @@ -12,7 +12,7 @@ import { IBufferSet, IBuffer } from 'common/buffer/Types'; 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'; +import { IDecorationOptions, IDecoration } from '@xterm/xterm'; export class MockBufferService implements IBufferService { public serviceBrand: any; diff --git a/src/common/Types.d.ts b/src/common/Types.d.ts index fc8fdf4e..14dee972 100644 --- a/src/common/Types.d.ts +++ b/src/common/Types.d.ts @@ -9,7 +9,7 @@ import { Attributes, UnderlineStyle } from 'common/buffer/Constants'; // eslint- 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'; +import { IFunctionIdentifier, ITerminalOptions as IPublicTerminalOptions } from '@xterm/xterm'; export interface ICoreTerminal { coreMouseService: ICoreMouseService; diff --git a/src/common/buffer/BufferRange.test.ts b/src/common/buffer/BufferRange.test.ts index 69aacd99..15d1b831 100644 --- a/src/common/buffer/BufferRange.test.ts +++ b/src/common/buffer/BufferRange.test.ts @@ -5,7 +5,7 @@ import { assert } from 'chai'; import { getRangeLength } from 'common/buffer/BufferRange'; -import { IBufferRange } from 'xterm'; +import { IBufferRange } from '@xterm/xterm'; describe('BufferRange', () => { describe('getRangeLength', () => { diff --git a/src/common/buffer/BufferRange.ts b/src/common/buffer/BufferRange.ts index a49cf481..aa7ee405 100644 --- a/src/common/buffer/BufferRange.ts +++ b/src/common/buffer/BufferRange.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { IBufferRange } from 'xterm'; +import { IBufferRange } from '@xterm/xterm'; export function getRangeLength(range: IBufferRange, bufferCols: number): number { if (range.start.y > range.end.y) { diff --git a/src/common/public/AddonManager.test.ts b/src/common/public/AddonManager.test.ts index e947976a..239952ee 100644 --- a/src/common/public/AddonManager.test.ts +++ b/src/common/public/AddonManager.test.ts @@ -5,7 +5,7 @@ import { assert } from 'chai'; import { AddonManager, ILoadedAddon } from './AddonManager'; -import { ITerminalAddon } from 'xterm'; +import { ITerminalAddon } from '@xterm/xterm'; class TestAddonManager extends AddonManager { public get addons(): ILoadedAddon[] { diff --git a/src/common/public/AddonManager.ts b/src/common/public/AddonManager.ts index af04a269..9a36e2a0 100644 --- a/src/common/public/AddonManager.ts +++ b/src/common/public/AddonManager.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { ITerminalAddon, IDisposable, Terminal } from 'xterm'; +import { ITerminalAddon, IDisposable, Terminal } from '@xterm/xterm'; export interface ILoadedAddon { instance: ITerminalAddon; diff --git a/src/common/public/BufferApiView.ts b/src/common/public/BufferApiView.ts index ca9ef2d8..834cedbe 100644 --- a/src/common/public/BufferApiView.ts +++ b/src/common/public/BufferApiView.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { IBuffer as IBufferApi, IBufferLine as IBufferLineApi, IBufferCell as IBufferCellApi } from 'xterm'; +import { IBuffer as IBufferApi, IBufferLine as IBufferLineApi, IBufferCell as IBufferCellApi } from '@xterm/xterm'; import { IBuffer } from 'common/buffer/Types'; import { BufferLineApiView } from 'common/public/BufferLineApiView'; import { CellData } from 'common/buffer/CellData'; diff --git a/src/common/public/BufferLineApiView.ts b/src/common/public/BufferLineApiView.ts index 60375015..560dd0bf 100644 --- a/src/common/public/BufferLineApiView.ts +++ b/src/common/public/BufferLineApiView.ts @@ -5,7 +5,7 @@ import { CellData } from 'common/buffer/CellData'; import { IBufferLine, ICellData } from 'common/Types'; -import { IBufferCell as IBufferCellApi, IBufferLine as IBufferLineApi } from 'xterm'; +import { IBufferCell as IBufferCellApi, IBufferLine as IBufferLineApi } from '@xterm/xterm'; export class BufferLineApiView implements IBufferLineApi { constructor(private _line: IBufferLine) { } diff --git a/src/common/public/BufferNamespaceApi.ts b/src/common/public/BufferNamespaceApi.ts index aeaa4ac8..cef0ed16 100644 --- a/src/common/public/BufferNamespaceApi.ts +++ b/src/common/public/BufferNamespaceApi.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { IBuffer as IBufferApi, IBufferNamespace as IBufferNamespaceApi } from 'xterm'; +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'; diff --git a/src/common/public/ParserApi.ts b/src/common/public/ParserApi.ts index 67df4be5..afcc01be 100644 --- a/src/common/public/ParserApi.ts +++ b/src/common/public/ParserApi.ts @@ -4,7 +4,7 @@ */ import { IParams } from 'common/parser/Types'; -import { IDisposable, IFunctionIdentifier, IParser } from 'xterm'; +import { IDisposable, IFunctionIdentifier, IParser } from '@xterm/xterm'; import { ICoreTerminal } from 'common/Types'; export class ParserApi implements IParser { diff --git a/src/common/public/UnicodeApi.ts b/src/common/public/UnicodeApi.ts index 8a669a05..ec9bd1f7 100644 --- a/src/common/public/UnicodeApi.ts +++ b/src/common/public/UnicodeApi.ts @@ -4,7 +4,7 @@ */ import { ICoreTerminal } from 'common/Types'; -import { IUnicodeHandling, IUnicodeVersionProvider } from 'xterm'; +import { IUnicodeHandling, IUnicodeVersionProvider } from '@xterm/xterm'; export class UnicodeApi implements IUnicodeHandling { constructor(private _core: ICoreTerminal) { } diff --git a/src/common/services/DecorationService.ts b/src/common/services/DecorationService.ts index 36faa509..da759152 100644 --- a/src/common/services/DecorationService.ts +++ b/src/common/services/DecorationService.ts @@ -9,7 +9,7 @@ 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'; +import { IDecoration, IDecorationOptions, IMarker } from '@xterm/xterm'; // Work variables to avoid garbage collection let $xmin = 0; diff --git a/src/common/services/Services.ts b/src/common/services/Services.ts index 6ac73e37..304e8cbb 100644 --- a/src/common/services/Services.ts +++ b/src/common/services/Services.ts @@ -7,7 +7,7 @@ import { IEvent, IEventEmitter } from 'common/EventEmitter'; import { IBuffer, IBufferSet } from 'common/buffer/Types'; import { IDecPrivateModes, ICoreMouseEvent, CoreMouseEncoding, ICoreMouseProtocol, CoreMouseEventType, ICharset, IWindowOptions, IModes, IAttributeData, ScrollSource, IDisposable, IColor, CursorStyle, CursorInactiveStyle, IOscLinkData } from 'common/Types'; import { createDecorator } from 'common/services/ServiceRegistry'; -import { IDecorationOptions, IDecoration, ILinkHandler, IWindowsPty, ILogger } from 'xterm'; +import { IDecorationOptions, IDecoration, ILinkHandler, IWindowsPty, ILogger } from '@xterm/xterm'; export const IBufferService = createDecorator('BufferService'); export interface IBufferService { diff --git a/src/headless/tsconfig.json b/src/headless/tsconfig.json index b579af97..e48c4fd5 100644 --- a/src/headless/tsconfig.json +++ b/src/headless/tsconfig.json @@ -17,7 +17,7 @@ }, "include": [ "./**/*", - "../../typings/xterm.d.ts", // common/Types.d.ts imports from 'xterm' + "../../typings/xterm.d.ts", // common/Types.d.ts imports from '@xterm/xterm' "../../typings/xterm-headless.d.ts" ], "references": [ diff --git a/test/api/TestUtils.ts b/test/api/TestUtils.ts index 288a3c07..9ebf67b6 100644 --- a/test/api/TestUtils.ts +++ b/test/api/TestUtils.ts @@ -5,7 +5,7 @@ import * as playwright from '@playwright/test'; import deepEqual = require('deep-equal'); -import { ITerminalInitOnlyOptions, ITerminalOptions } from 'xterm'; +import { ITerminalInitOnlyOptions, ITerminalOptions } from '@xterm/xterm'; import { deepStrictEqual } from 'assert'; export async function pollFor(page: playwright.Page, evalOrFn: string | (() => Promise), val: T, preFn?: () => Promise, maxDuration?: number): Promise { diff --git a/test/playwright/MouseTracking.test.ts b/test/playwright/MouseTracking.test.ts index dbce55cd..1cefd7cd 100644 --- a/test/playwright/MouseTracking.test.ts +++ b/test/playwright/MouseTracking.test.ts @@ -4,7 +4,7 @@ */ import { test } from '@playwright/test'; import { deepStrictEqual, ok, strictEqual } from 'assert'; -import type { IDisposable } from 'xterm'; +import type { IDisposable } from '@xterm/xterm'; import { createTestContext, ITestContext, openTerminal, pollFor } from './TestUtils'; let ctx: ITestContext; diff --git a/test/playwright/Parser.test.ts b/test/playwright/Parser.test.ts index 42406270..b793b00e 100644 --- a/test/playwright/Parser.test.ts +++ b/test/playwright/Parser.test.ts @@ -4,7 +4,7 @@ */ import { test } from '@playwright/test'; import { deepStrictEqual, ok, strictEqual } from 'assert'; -import type { IDisposable } from 'xterm'; +import type { IDisposable } from '@xterm/xterm'; import { createTestContext, ITestContext, openTerminal, pollFor } from './TestUtils'; let ctx: ITestContext; diff --git a/test/playwright/SharedRendererTests.ts b/test/playwright/SharedRendererTests.ts index eaa54d12..377be163 100644 --- a/test/playwright/SharedRendererTests.ts +++ b/test/playwright/SharedRendererTests.ts @@ -5,7 +5,7 @@ import { IImage32, decodePng } from '@lunapaint/png-codec'; import { LocatorScreenshotOptions, test } from '@playwright/test'; -import { ITheme } from 'xterm'; +import { ITheme } from '@xterm/xterm'; import { ITestContext, MaybeAsync, openTerminal, pollFor, pollForApproximate } from './TestUtils'; export interface ISharedRendererTestContext { diff --git a/test/playwright/TestUtils.ts b/test/playwright/TestUtils.ts index 0a51757f..3e925f79 100644 --- a/test/playwright/TestUtils.ts +++ b/test/playwright/TestUtils.ts @@ -10,7 +10,7 @@ import type { IRenderService } from 'browser/services/Services'; import type { ICoreTerminal, IMarker } from 'common/Types'; import * as playwright from '@playwright/test'; import { PageFunction } from 'playwright-core/types/structs'; -import { IBuffer, IBufferCell, IBufferLine, IBufferNamespace, IBufferRange, IDecoration, IDecorationOptions, IModes, ITerminalInitOnlyOptions, ITerminalOptions, Terminal } from 'xterm'; +import { IBuffer, IBufferCell, IBufferLine, IBufferNamespace, IBufferRange, IDecoration, IDecorationOptions, IModes, ITerminalInitOnlyOptions, ITerminalOptions, Terminal } from '@xterm/xterm'; import { EventEmitter } from '../../out/common/EventEmitter'; export interface ITestContext { From efbcd41fab983c4a19c44d913288d00c68d75d9c Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 06:50:48 -0700 Subject: [PATCH 42/73] from xterm-headless -> from scoped --- headless/README.md | 2 +- src/headless/public/Terminal.test.ts | 2 +- src/headless/public/Terminal.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/headless/README.md b/headless/README.md index 1d2d6156..205fd79c 100644 --- a/headless/README.md +++ b/headless/README.md @@ -15,7 +15,7 @@ npm install xterm-headless Then import as you would a regular node package. The recommended way to load `xterm-headless` is with TypeScript and the ES6 module syntax: ```javascript -import { Terminal } from 'xterm-headless'; +import { Terminal } from '@xterm/headless'; ``` ## API diff --git a/src/headless/public/Terminal.test.ts b/src/headless/public/Terminal.test.ts index f869a991..2175c668 100644 --- a/src/headless/public/Terminal.test.ts +++ b/src/headless/public/Terminal.test.ts @@ -5,7 +5,7 @@ import { deepStrictEqual, strictEqual, throws } from 'assert'; import { Terminal } from 'headless/public/Terminal'; -import { ITerminalOptions } from 'xterm-headless'; +import { ITerminalOptions } from '@xterm/headless'; let term: Terminal; diff --git a/src/headless/public/Terminal.ts b/src/headless/public/Terminal.ts index b018d37c..df202660 100644 --- a/src/headless/public/Terminal.ts +++ b/src/headless/public/Terminal.ts @@ -7,7 +7,7 @@ import { IEvent } from 'common/EventEmitter'; import { BufferNamespaceApi } from 'common/public/BufferNamespaceApi'; import { ParserApi } from 'common/public/ParserApi'; import { UnicodeApi } from 'common/public/UnicodeApi'; -import { IBufferNamespace as IBufferNamespaceApi, IMarker, IModes, IParser, ITerminalAddon, ITerminalInitOnlyOptions, IUnicodeHandling, Terminal as ITerminalApi } from 'xterm-headless'; +import { IBufferNamespace as IBufferNamespaceApi, IMarker, IModes, IParser, ITerminalAddon, ITerminalInitOnlyOptions, IUnicodeHandling, Terminal as ITerminalApi } from '@xterm/headless'; import { Terminal as TerminalCore } from 'headless/Terminal'; import { AddonManager } from 'common/public/AddonManager'; import { ITerminalOptions } from 'common/Types'; From cef869a206e9c0c45e053d2614d0fda0d153a209 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 06:55:21 -0700 Subject: [PATCH 43/73] Force beta build for now --- bin/publish.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/publish.js b/bin/publish.js index c9ce5e51..810ae02a 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -57,7 +57,7 @@ function checkAndPublishPackage(packageDir) { // Determine if this is a stable or beta release const publishedVersions = getPublishedVersions(packageJson); - const isStableRelease = !publishedVersions.includes(packageJson.version); + const isStableRelease = false; // !publishedVersions.includes(packageJson.version); // Get the next version let nextVersion = isStableRelease ? packageJson.version : getNextBetaVersion(packageJson); From 8c6d16486da335e06f491d389b084f3c9342207b Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 06:57:44 -0700 Subject: [PATCH 44/73] Don't fetch beta versions --- bin/publish.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/publish.js b/bin/publish.js index 810ae02a..0ad738e2 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -56,7 +56,7 @@ function checkAndPublishPackage(packageDir) { const packageJson = require(path.join(packageDir, 'package.json')); // Determine if this is a stable or beta release - const publishedVersions = getPublishedVersions(packageJson); + // const publishedVersions = getPublishedVersions(packageJson); const isStableRelease = false; // !publishedVersions.includes(packageJson.version); // Get the next version @@ -119,7 +119,7 @@ function getPublishedVersions(packageJson, version, tag) { if (tag) { return versionsJson.filter(v => !v.search(new RegExp(`${version}-${tag}.[0-9]+`))); } - return versionsJson; + return versionsJson ?? []; } function getChangedFilesInCommit(commit) { From 9db2178d0577118f371862047d3b949640532b09 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 07:00:23 -0700 Subject: [PATCH 45/73] Return [] when no versions are published --- bin/publish.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/bin/publish.js b/bin/publish.js index 0ad738e2..660d66ce 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -116,10 +116,13 @@ function getNextBetaVersion(packageJson) { function getPublishedVersions(packageJson, version, tag) { const versionsProcess = cp.spawnSync('npm', ['view', packageJson.name, 'versions', '--json']); const versionsJson = JSON.parse(versionsProcess.stdout); + if (!versions || versions.length === 0) { + return []; + } if (tag) { return versionsJson.filter(v => !v.search(new RegExp(`${version}-${tag}.[0-9]+`))); } - return versionsJson ?? []; + return versionsJson; } function getChangedFilesInCommit(commit) { From 5196ac5c8ff2ee3cc6c388f6736538c7fa1094df Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 07:02:14 -0700 Subject: [PATCH 46/73] Fix variable name --- bin/publish.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/publish.js b/bin/publish.js index 660d66ce..74986b95 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -116,7 +116,7 @@ function getNextBetaVersion(packageJson) { function getPublishedVersions(packageJson, version, tag) { const versionsProcess = cp.spawnSync('npm', ['view', packageJson.name, 'versions', '--json']); const versionsJson = JSON.parse(versionsProcess.stdout); - if (!versions || versions.length === 0) { + if (!versionsJson || versionsJson.length === 0) { return []; } if (tag) { From 2fb9702a3a51fe45270310b04b358a786c94ed13 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 07:14:19 -0700 Subject: [PATCH 47/73] Force dry run temporarily --- .github/workflows/release.yml | 2 +- bin/publish.js | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 21526c2c..e6077a4e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,4 +29,4 @@ jobs: - name: Publish to npm env: NPM_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - run: node ./bin/publish.js + run: node ./bin/publish.js --dry diff --git a/bin/publish.js b/bin/publish.js index 74986b95..1b520b0f 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -41,10 +41,10 @@ const addonPackageDirs = [ console.log(`Checking if addons need to be published`); for (const p of addonPackageDirs) { const addon = path.basename(p); - if (changedFiles.some(e => e.includes(addon))) { + // if (changedFiles.some(e => e.includes(addon))) { console.log(`Try publish ${addon}`); checkAndPublishPackage(p); - } + // } } // Publish website if it's a stable release @@ -94,8 +94,7 @@ function checkAndPublishPackage(packageDir) { function getNextBetaVersion(packageJson) { if (!/^\d+\.\d+\.\d+$/.exec(packageJson.version)) { - console.error('The package.json version must be of the form x.y.z'); - process.exit(1); + throw new Error('The package.json version must be of the form x.y.z'); } const tag = 'beta'; const stableVersion = packageJson.version.split('.'); From a1f87809b28d09ccd6add1e82655c7dd62f5d6c5 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 07:19:23 -0700 Subject: [PATCH 48/73] Log versionsJson --- bin/publish.js | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/publish.js b/bin/publish.js index 1b520b0f..eac330a0 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -118,6 +118,7 @@ function getPublishedVersions(packageJson, version, tag) { if (!versionsJson || versionsJson.length === 0) { return []; } + console.log('versionsJson', versionsJson); if (tag) { return versionsJson.filter(v => !v.search(new RegExp(`${version}-${tag}.[0-9]+`))); } From 059acb2da6fe7d32c67dbc9089ebc1770dca15e0 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 07:22:28 -0700 Subject: [PATCH 49/73] Handle versionsJson error --- bin/publish.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bin/publish.js b/bin/publish.js index eac330a0..1103797f 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -115,10 +115,9 @@ function getNextBetaVersion(packageJson) { function getPublishedVersions(packageJson, version, tag) { const versionsProcess = cp.spawnSync('npm', ['view', packageJson.name, 'versions', '--json']); const versionsJson = JSON.parse(versionsProcess.stdout); - if (!versionsJson || versionsJson.length === 0) { + if (!versionsJson || !Array.isArray(versionsJson) || versionsJson.length === 0) { return []; } - console.log('versionsJson', versionsJson); if (tag) { return versionsJson.filter(v => !v.search(new RegExp(`${version}-${tag}.[0-9]+`))); } From dcc940c32ebf313a1a8166c6de1f456ad350500f Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 07:24:49 -0700 Subject: [PATCH 50/73] headless -> scoped --- bin/package_headless.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/package_headless.js b/bin/package_headless.js index d002a95e..6f891f05 100644 --- a/bin/package_headless.js +++ b/bin/package_headless.js @@ -14,7 +14,7 @@ console.log('> headless/package.json'); const xtermPackageJson = require('../package.json'); const xtermHeadlessPackageJson = { ...xtermPackageJson, - name: 'xterm-headless', + name: '@xterm/headless', description: 'A headless terminal component that runs in Node.js', main: 'lib-headless/xterm-headless.js', types: 'typings/xterm-headless.d.ts', From 765a8b21a3a897f1dd06b2a28b45dd8f025c3a21 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 07:25:58 -0700 Subject: [PATCH 51/73] real run --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e6077a4e..21526c2c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,4 +29,4 @@ jobs: - name: Publish to npm env: NPM_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - run: node ./bin/publish.js --dry + run: node ./bin/publish.js From 485fb455d6282126d8d612a556b23a6affbf9f69 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 07:29:42 -0700 Subject: [PATCH 52/73] Add release dry run job to CI --- .github/workflows/ci.yml | 20 ++++++++++++++++++++ .github/workflows/release.yml | 2 -- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cd3fa512..114123b4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -306,3 +306,23 @@ jobs: ls -R - name: Integration tests (${{ matrix.browser }}) run: yarn test-api-${{ matrix.browser }} --headless --forbid-only + + release-dry-run: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Use Node.js 18.x + uses: actions/setup-node@v3 + with: + node-version: 18.x + cache: 'yarn' + - name: Install dependencies + run: yarn --frozen-lockfile + - name: Build + run: yarn setup + - name: Package headless + run: | + yarn package-headless + node ./bin/package_headless.js + - name: Publish to npm (dry run) + run: node ./bin/publish.js --dry diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 21526c2c..1e26e438 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,8 +5,6 @@ on: # If a commit reaches master, assume it has passed CI via PR and publish # without running tests to save time to publish branches: [ "master" ] - pull_request: - branches: [ "master" ] jobs: release: From 4abb4c674f29f4884410852c1862fe512d3d6cbf Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 07:31:39 -0700 Subject: [PATCH 53/73] Use build artifacts in dry run --- .github/workflows/ci.yml | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 114123b4..a4c76a97 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -308,18 +308,36 @@ jobs: run: yarn test-api-${{ matrix.browser }} --headless --forbid-only release-dry-run: + needs: build runs-on: ubuntu-latest + strategy: + matrix: + node-version: [18] steps: - uses: actions/checkout@v3 - - name: Use Node.js 18.x + - name: Use Node.js ${{ matrix.node-version }}.x uses: actions/setup-node@v3 with: - node-version: 18.x + node-version: ${{ matrix.node-version }}.x cache: 'yarn' - name: Install dependencies - run: yarn --frozen-lockfile - - name: Build - run: yarn setup + run: | + yarn --frozen-lockfile + yarn install-addons + - name: Install playwright + run: npx playwright install + - uses: actions/download-artifact@v3 + with: + name: build-artifacts + - name: Unzip artifacts + shell: bash + run: | + if [ "$RUNNER_OS" == "Windows" ]; then + pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}" + else + unzip -o compressed-build.zip + fi + ls -R - name: Package headless run: | yarn package-headless From 0fd04aa76dededc952a37a622a50d88ae1559181 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 10:35:10 -0700 Subject: [PATCH 54/73] Replace all instances of xterm-addon --- .eslintrc.json | 42 ++++++++--------- .github/workflows/ci.yml | 44 +++++++++--------- README.md | 12 ++--- .../.gitignore | 0 .../.npmignore | 0 .../LICENSE | 0 .../README.md | 8 ++-- .../package.json | 8 ++-- .../src/AttachAddon.ts | 0 .../src/tsconfig.json | 0 .../test/AttachAddon.api.ts | 0 .../test/tsconfig.json | 0 .../tsconfig.json | 0 .../typings/addon-attach.d.ts} | 2 +- .../webpack.config.js | 2 +- .../.gitignore | 0 .../.npmignore | 0 .../LICENSE | 0 addons/addon-canvas/README.md | 28 +++++++++++ .../package.json | 8 ++-- .../src/BaseRenderLayer.ts | 0 .../src/CanvasAddon.ts | 0 .../src/CanvasRenderer.ts | 0 .../src/CursorRenderLayer.ts | 0 .../src/GridCache.test.ts | 0 .../src/GridCache.ts | 0 .../src/LinkRenderLayer.ts | 0 .../src/SelectionRenderLayer.ts | 0 .../src/TextRenderLayer.ts | 0 .../src/Types.d.ts | 0 .../src/tsconfig.json | 0 .../test/CanvasRenderer.test.ts | 0 .../test/playwright.config.ts | 0 .../test/tsconfig.json | 0 .../tsconfig.json | 0 .../typings/addon-canvas.d.ts} | 2 +- .../webpack.config.js | 2 +- .../{xterm-addon-fit => addon-fit}/.gitignore | 0 .../{xterm-addon-fit => addon-fit}/.npmignore | 0 addons/{xterm-addon-fit => addon-fit}/LICENSE | 0 .../{xterm-addon-fit => addon-fit}/README.md | 8 ++-- .../package.json | 8 ++-- .../src/FitAddon.ts | 0 .../src/tsconfig.json | 0 .../test/FitAddon.api.ts | 0 .../test/tsconfig.json | 0 .../tsconfig.json | 0 .../typings/addon-fit.d.ts} | 2 +- .../webpack.config.js | 2 +- .../.gitignore | 0 .../.npmignore | 0 .../LICENSE | 0 .../README.md | 8 ++-- .../fixture/endless.sh | 0 .../fixture/example.png | Bin .../fixture/gcrglf.sh | 0 .../fixture/growing_rect.js | 0 .../fixture/iip/palette.iip | 0 .../fixture/iip/spinfox.iip | 0 .../fixture/iip/w3c_gif.iip | 0 .../fixture/iip/w3c_jpg.iip | 0 .../fixture/iip/w3c_png.iip | 0 .../fixture/inspect_palette.sh | 0 .../fixture/overdraw.sh | 0 .../fixture/palette.blob | Bin .../fixture/palette.png | Bin .../fixture/palette.sixel | 0 .../fixture/testimages/agfa-makernotes.jpg | Bin .../fixture/testimages/iphone_hdr_YES.jpg | Bin .../fixture/testimages/nikon-e950.jpg | Bin .../fixture/testimages/sony-alpha-6000.jpg | Bin .../fixture/testimages/spinfox.png | Bin .../fixture/testimages/w3c_home.gif | Bin .../fixture/testimages/w3c_home.jpg | Bin .../fixture/testimages/w3c_home.png | Bin .../fixture/testimages/w3c_home_2.gif | Bin .../fixture/testimages/w3c_home_2.jpg | Bin .../fixture/testimages/w3c_home_2.png | Bin .../fixture/testimages/w3c_home_256.gif | Bin .../fixture/testimages/w3c_home_256.jpg | Bin .../fixture/testimages/w3c_home_256.png | Bin .../fixture/testimages/w3c_home_animation.gif | Bin .../fixture/testimages/w3c_home_gray.gif | Bin .../fixture/testimages/w3c_home_gray.jpg | Bin .../fixture/testimages/w3c_home_gray.png | Bin .../fixture/textcursor.sh | 0 .../package.json | 8 ++-- .../src/IIPHandler.ts | 0 .../src/IIPHeaderParser.test.ts | 0 .../src/IIPHeaderParser.ts | 0 .../src/IIPMetrics.test.ts | 2 +- .../src/IIPMetrics.ts | 0 .../src/ImageAddon.ts | 0 .../src/ImageRenderer.ts | 0 .../src/ImageStorage.ts | 0 .../src/SixelHandler.ts | 0 .../src/Types.d.ts | 0 .../src/tsconfig.json | 0 .../test/ImageAddon.api.ts | 12 ++--- .../test/tsconfig.json | 0 .../tsconfig.json | 0 .../typings/addon-image.d.ts} | 2 +- .../webpack.config.js | 2 +- .../.gitignore | 0 .../.npmignore | 0 .../LICENSE | 0 .../README.md | 6 +-- .../bin/download-fonts.js | 0 .../package.json | 8 ++-- .../src/LigaturesAddon.ts | 0 .../src/Types.d.ts | 0 .../src/font.ts | 0 .../src/index.test.ts | 2 +- .../src/index.ts | 0 .../src/parse.test.ts | 0 .../src/parse.ts | 0 .../src/tsconfig.json | 0 .../tsconfig.json | 0 .../typings/addon-ligatures.d.ts} | 4 +- .../webpack.config.js | 2 +- .../yarn.lock | 0 .../.gitignore | 0 .../.npmignore | 0 .../LICENSE | 0 .../README.md | 8 ++-- .../fixtures/issue-2444 | 0 .../package.json | 8 ++-- .../src/SearchAddon.ts | 0 .../src/tsconfig.json | 0 .../test/SearchAddon.api.ts | 0 .../test/tsconfig.json | 0 .../tsconfig.json | 0 .../typings/addon-search.d.ts} | 2 +- .../webpack.config.js | 2 +- .../.gitignore | 0 .../.npmignore | 0 .../README.md | 12 ++--- .../benchmark/SerializeAddon.benchmark.ts | 0 .../benchmark/benchmark.json | 0 .../benchmark/tsconfig.json | 0 .../package.json | 8 ++-- .../src/SerializeAddon.test.ts | 2 +- .../src/SerializeAddon.ts | 0 .../src/tsconfig.json | 0 .../test/SerializeAddon.api.ts | 0 .../test/tsconfig.json | 0 .../tsconfig.json | 0 .../typings/addon-serialize.d.ts} | 2 +- .../webpack.config.js | 2 +- .../.gitignore | 0 .../.npmignore | 0 .../LICENSE | 0 .../README.md | 4 +- .../UnicodeGraphemeAddon.benchmark.ts | 0 .../benchmark/benchmark.json | 0 .../benchmark/tsconfig.json | 0 .../package.json | 8 ++-- .../src/UnicodeGraphemeProvider.ts | 0 .../src/UnicodeGraphemesAddon.ts | 0 .../src/third-party/UnicodeProperties.ts | 0 .../src/third-party/tiny-inflate.ts | 0 .../src/third-party/unicode-trie.ts | 0 .../src/tsconfig.json | 0 .../test/UnicodeGraphemesAddon.api.ts | 0 .../test/tsconfig.json | 0 .../tsconfig.json | 0 .../typings/addon-unicode-graphemes.d.ts} | 2 +- .../webpack.config.js | 2 +- .../.gitignore | 0 .../.npmignore | 0 .../LICENSE | 0 .../README.md | 6 +-- .../package.json | 8 ++-- .../src/Unicode11Addon.ts | 0 .../src/UnicodeV11.ts | 0 .../src/tsconfig.json | 0 .../test/Unicode11Addon.api.ts | 0 .../test/tsconfig.json | 0 .../tsconfig.json | 0 .../typings/addon-unicode11.d.ts} | 2 +- .../webpack.config.js | 2 +- .../.gitignore | 0 .../.npmignore | 0 .../LICENSE | 0 .../README.md | 8 ++-- .../package.json | 8 ++-- .../src/WebLinkProvider.ts | 0 .../src/WebLinksAddon.ts | 0 .../src/tsconfig.json | 0 .../test/WebLinksAddon.api.ts | 0 .../test/tsconfig.json | 0 .../tsconfig.json | 0 .../typings/addon-web-links.d.ts} | 2 +- .../webpack.config.js | 2 +- addons/addon-webgl/README.md | 2 +- addons/xterm-addon-canvas/README.md | 28 ----------- bin/publish.js | 19 ++++---- bin/test_playwright.js | 2 +- demo/client.ts | 42 ++++++++--------- demo/tsconfig.json | 12 ++--- src/common/InputHandler.ts | 2 +- tsconfig.all.json | 20 ++++---- 202 files changed, 231 insertions(+), 230 deletions(-) rename addons/{xterm-addon-attach => addon-attach}/.gitignore (100%) rename addons/{xterm-addon-attach => addon-attach}/.npmignore (100%) rename addons/{xterm-addon-attach => addon-attach}/LICENSE (100%) rename addons/{xterm-addon-attach => addon-attach}/README.md (67%) rename addons/{xterm-addon-attach => addon-attach}/package.json (77%) rename addons/{xterm-addon-attach => addon-attach}/src/AttachAddon.ts (100%) rename addons/{xterm-addon-attach => addon-attach}/src/tsconfig.json (100%) rename addons/{xterm-addon-attach => addon-attach}/test/AttachAddon.api.ts (100%) rename addons/{xterm-addon-attach => addon-attach}/test/tsconfig.json (100%) rename addons/{xterm-addon-attach => addon-attach}/tsconfig.json (100%) rename addons/{xterm-addon-attach/typings/xterm-addon-attach.d.ts => addon-attach/typings/addon-attach.d.ts} (92%) rename addons/{xterm-addon-attach => addon-attach}/webpack.config.js (92%) rename addons/{xterm-addon-canvas => addon-canvas}/.gitignore (100%) rename addons/{xterm-addon-canvas => addon-canvas}/.npmignore (100%) rename addons/{xterm-addon-canvas => addon-canvas}/LICENSE (100%) create mode 100644 addons/addon-canvas/README.md rename addons/{xterm-addon-canvas => addon-canvas}/package.json (80%) rename addons/{xterm-addon-canvas => addon-canvas}/src/BaseRenderLayer.ts (100%) rename addons/{xterm-addon-canvas => addon-canvas}/src/CanvasAddon.ts (100%) rename addons/{xterm-addon-canvas => addon-canvas}/src/CanvasRenderer.ts (100%) rename addons/{xterm-addon-canvas => addon-canvas}/src/CursorRenderLayer.ts (100%) rename addons/{xterm-addon-canvas => addon-canvas}/src/GridCache.test.ts (100%) rename addons/{xterm-addon-canvas => addon-canvas}/src/GridCache.ts (100%) rename addons/{xterm-addon-canvas => addon-canvas}/src/LinkRenderLayer.ts (100%) rename addons/{xterm-addon-canvas => addon-canvas}/src/SelectionRenderLayer.ts (100%) rename addons/{xterm-addon-canvas => addon-canvas}/src/TextRenderLayer.ts (100%) rename addons/{xterm-addon-canvas => addon-canvas}/src/Types.d.ts (100%) rename addons/{xterm-addon-canvas => addon-canvas}/src/tsconfig.json (100%) rename addons/{xterm-addon-canvas => addon-canvas}/test/CanvasRenderer.test.ts (100%) rename addons/{xterm-addon-canvas => addon-canvas}/test/playwright.config.ts (100%) rename addons/{xterm-addon-canvas => addon-canvas}/test/tsconfig.json (100%) rename addons/{xterm-addon-canvas => addon-canvas}/tsconfig.json (100%) rename addons/{xterm-addon-canvas/typings/xterm-addon-canvas.d.ts => addon-canvas/typings/addon-canvas.d.ts} (96%) rename addons/{xterm-addon-canvas => addon-canvas}/webpack.config.js (94%) rename addons/{xterm-addon-fit => addon-fit}/.gitignore (100%) rename addons/{xterm-addon-fit => addon-fit}/.npmignore (100%) rename addons/{xterm-addon-fit => addon-fit}/LICENSE (100%) rename addons/{xterm-addon-fit => addon-fit}/README.md (72%) rename addons/{xterm-addon-fit => addon-fit}/package.json (79%) rename addons/{xterm-addon-fit => addon-fit}/src/FitAddon.ts (100%) rename addons/{xterm-addon-fit => addon-fit}/src/tsconfig.json (100%) rename addons/{xterm-addon-fit => addon-fit}/test/FitAddon.api.ts (100%) rename addons/{xterm-addon-fit => addon-fit}/test/tsconfig.json (100%) rename addons/{xterm-addon-fit => addon-fit}/tsconfig.json (100%) rename addons/{xterm-addon-fit/typings/xterm-addon-fit.d.ts => addon-fit/typings/addon-fit.d.ts} (96%) rename addons/{xterm-addon-fit => addon-fit}/webpack.config.js (93%) rename addons/{xterm-addon-image => addon-image}/.gitignore (100%) rename addons/{xterm-addon-image => addon-image}/.npmignore (100%) rename addons/{xterm-addon-image => addon-image}/LICENSE (100%) rename addons/{xterm-addon-image => addon-image}/README.md (98%) rename addons/{xterm-addon-image => addon-image}/fixture/endless.sh (100%) mode change 100755 => 100644 rename addons/{xterm-addon-image => addon-image}/fixture/example.png (100%) rename addons/{xterm-addon-image => addon-image}/fixture/gcrglf.sh (100%) mode change 100755 => 100644 rename addons/{xterm-addon-image => addon-image}/fixture/growing_rect.js (100%) rename addons/{xterm-addon-image => addon-image}/fixture/iip/palette.iip (100%) rename addons/{xterm-addon-image => addon-image}/fixture/iip/spinfox.iip (100%) rename addons/{xterm-addon-image => addon-image}/fixture/iip/w3c_gif.iip (100%) rename addons/{xterm-addon-image => addon-image}/fixture/iip/w3c_jpg.iip (100%) rename addons/{xterm-addon-image => addon-image}/fixture/iip/w3c_png.iip (100%) rename addons/{xterm-addon-image => addon-image}/fixture/inspect_palette.sh (100%) mode change 100755 => 100644 rename addons/{xterm-addon-image => addon-image}/fixture/overdraw.sh (100%) mode change 100755 => 100644 rename addons/{xterm-addon-image => addon-image}/fixture/palette.blob (100%) rename addons/{xterm-addon-image => addon-image}/fixture/palette.png (100%) rename addons/{xterm-addon-image => addon-image}/fixture/palette.sixel (100%) rename addons/{xterm-addon-image => addon-image}/fixture/testimages/agfa-makernotes.jpg (100%) rename addons/{xterm-addon-image => addon-image}/fixture/testimages/iphone_hdr_YES.jpg (100%) rename addons/{xterm-addon-image => addon-image}/fixture/testimages/nikon-e950.jpg (100%) rename addons/{xterm-addon-image => addon-image}/fixture/testimages/sony-alpha-6000.jpg (100%) rename addons/{xterm-addon-image => addon-image}/fixture/testimages/spinfox.png (100%) rename addons/{xterm-addon-image => addon-image}/fixture/testimages/w3c_home.gif (100%) rename addons/{xterm-addon-image => addon-image}/fixture/testimages/w3c_home.jpg (100%) rename addons/{xterm-addon-image => addon-image}/fixture/testimages/w3c_home.png (100%) rename addons/{xterm-addon-image => addon-image}/fixture/testimages/w3c_home_2.gif (100%) rename addons/{xterm-addon-image => addon-image}/fixture/testimages/w3c_home_2.jpg (100%) rename addons/{xterm-addon-image => addon-image}/fixture/testimages/w3c_home_2.png (100%) rename addons/{xterm-addon-image => addon-image}/fixture/testimages/w3c_home_256.gif (100%) rename addons/{xterm-addon-image => addon-image}/fixture/testimages/w3c_home_256.jpg (100%) rename addons/{xterm-addon-image => addon-image}/fixture/testimages/w3c_home_256.png (100%) rename addons/{xterm-addon-image => addon-image}/fixture/testimages/w3c_home_animation.gif (100%) rename addons/{xterm-addon-image => addon-image}/fixture/testimages/w3c_home_gray.gif (100%) rename addons/{xterm-addon-image => addon-image}/fixture/testimages/w3c_home_gray.jpg (100%) rename addons/{xterm-addon-image => addon-image}/fixture/testimages/w3c_home_gray.png (100%) rename addons/{xterm-addon-image => addon-image}/fixture/textcursor.sh (100%) mode change 100755 => 100644 rename addons/{xterm-addon-image => addon-image}/package.json (80%) rename addons/{xterm-addon-image => addon-image}/src/IIPHandler.ts (100%) rename addons/{xterm-addon-image => addon-image}/src/IIPHeaderParser.test.ts (100%) rename addons/{xterm-addon-image => addon-image}/src/IIPHeaderParser.ts (100%) rename addons/{xterm-addon-image => addon-image}/src/IIPMetrics.test.ts (94%) rename addons/{xterm-addon-image => addon-image}/src/IIPMetrics.ts (100%) rename addons/{xterm-addon-image => addon-image}/src/ImageAddon.ts (100%) rename addons/{xterm-addon-image => addon-image}/src/ImageRenderer.ts (100%) rename addons/{xterm-addon-image => addon-image}/src/ImageStorage.ts (100%) rename addons/{xterm-addon-image => addon-image}/src/SixelHandler.ts (100%) rename addons/{xterm-addon-image => addon-image}/src/Types.d.ts (100%) rename addons/{xterm-addon-image => addon-image}/src/tsconfig.json (100%) rename addons/{xterm-addon-image => addon-image}/test/ImageAddon.api.ts (95%) rename addons/{xterm-addon-image => addon-image}/test/tsconfig.json (100%) rename addons/{xterm-addon-image => addon-image}/tsconfig.json (100%) rename addons/{xterm-addon-image/typings/xterm-addon-image.d.ts => addon-image/typings/addon-image.d.ts} (99%) rename addons/{xterm-addon-image => addon-image}/webpack.config.js (93%) rename addons/{xterm-addon-ligatures => addon-ligatures}/.gitignore (100%) rename addons/{xterm-addon-ligatures => addon-ligatures}/.npmignore (100%) rename addons/{xterm-addon-ligatures => addon-ligatures}/LICENSE (100%) rename addons/{xterm-addon-ligatures => addon-ligatures}/README.md (95%) rename addons/{xterm-addon-ligatures => addon-ligatures}/bin/download-fonts.js (100%) rename addons/{xterm-addon-ligatures => addon-ligatures}/package.json (86%) rename addons/{xterm-addon-ligatures => addon-ligatures}/src/LigaturesAddon.ts (100%) rename addons/{xterm-addon-ligatures => addon-ligatures}/src/Types.d.ts (100%) rename addons/{xterm-addon-ligatures => addon-ligatures}/src/font.ts (100%) rename addons/{xterm-addon-ligatures => addon-ligatures}/src/index.test.ts (99%) rename addons/{xterm-addon-ligatures => addon-ligatures}/src/index.ts (100%) rename addons/{xterm-addon-ligatures => addon-ligatures}/src/parse.test.ts (100%) rename addons/{xterm-addon-ligatures => addon-ligatures}/src/parse.ts (100%) rename addons/{xterm-addon-ligatures => addon-ligatures}/src/tsconfig.json (100%) rename addons/{xterm-addon-ligatures => addon-ligatures}/tsconfig.json (100%) rename addons/{xterm-addon-ligatures/typings/xterm-addon-ligatures.d.ts => addon-ligatures/typings/addon-ligatures.d.ts} (92%) rename addons/{xterm-addon-ligatures => addon-ligatures}/webpack.config.js (95%) rename addons/{xterm-addon-ligatures => addon-ligatures}/yarn.lock (100%) rename addons/{xterm-addon-search => addon-search}/.gitignore (100%) rename addons/{xterm-addon-search => addon-search}/.npmignore (100%) rename addons/{xterm-addon-search => addon-search}/LICENSE (100%) rename addons/{xterm-addon-search => addon-search}/README.md (68%) rename addons/{xterm-addon-search => addon-search}/fixtures/issue-2444 (100%) rename addons/{xterm-addon-search => addon-search}/package.json (77%) rename addons/{xterm-addon-search => addon-search}/src/SearchAddon.ts (100%) rename addons/{xterm-addon-search => addon-search}/src/tsconfig.json (100%) rename addons/{xterm-addon-search => addon-search}/test/SearchAddon.api.ts (100%) rename addons/{xterm-addon-search => addon-search}/test/tsconfig.json (100%) rename addons/{xterm-addon-search => addon-search}/tsconfig.json (100%) rename addons/{xterm-addon-search/typings/xterm-addon-search.d.ts => addon-search/typings/addon-search.d.ts} (98%) rename addons/{xterm-addon-search => addon-search}/webpack.config.js (94%) rename addons/{xterm-addon-serialize => addon-serialize}/.gitignore (100%) rename addons/{xterm-addon-serialize => addon-serialize}/.npmignore (100%) rename addons/{xterm-addon-serialize => addon-serialize}/README.md (74%) rename addons/{xterm-addon-serialize => addon-serialize}/benchmark/SerializeAddon.benchmark.ts (100%) rename addons/{xterm-addon-serialize => addon-serialize}/benchmark/benchmark.json (100%) rename addons/{xterm-addon-serialize => addon-serialize}/benchmark/tsconfig.json (100%) rename addons/{xterm-addon-serialize => addon-serialize}/package.json (86%) rename addons/{xterm-addon-serialize => addon-serialize}/src/SerializeAddon.test.ts (99%) rename addons/{xterm-addon-serialize => addon-serialize}/src/SerializeAddon.ts (100%) rename addons/{xterm-addon-serialize => addon-serialize}/src/tsconfig.json (100%) rename addons/{xterm-addon-serialize => addon-serialize}/test/SerializeAddon.api.ts (100%) rename addons/{xterm-addon-serialize => addon-serialize}/test/tsconfig.json (100%) rename addons/{xterm-addon-serialize => addon-serialize}/tsconfig.json (100%) rename addons/{xterm-addon-serialize/typings/xterm-addon-serialize.d.ts => addon-serialize/typings/addon-serialize.d.ts} (98%) rename addons/{xterm-addon-serialize => addon-serialize}/webpack.config.js (94%) rename addons/{xterm-addon-unicode-graphemes => addon-unicode-graphemes}/.gitignore (100%) rename addons/{xterm-addon-unicode-graphemes => addon-unicode-graphemes}/.npmignore (100%) rename addons/{xterm-addon-unicode-graphemes => addon-unicode-graphemes}/LICENSE (100%) rename addons/{xterm-addon-unicode-graphemes => addon-unicode-graphemes}/README.md (86%) rename addons/{xterm-addon-unicode-graphemes => addon-unicode-graphemes}/benchmark/UnicodeGraphemeAddon.benchmark.ts (100%) rename addons/{xterm-addon-unicode-graphemes => addon-unicode-graphemes}/benchmark/benchmark.json (100%) rename addons/{xterm-addon-unicode-graphemes => addon-unicode-graphemes}/benchmark/tsconfig.json (100%) rename addons/{xterm-addon-unicode-graphemes => addon-unicode-graphemes}/package.json (84%) rename addons/{xterm-addon-unicode-graphemes => addon-unicode-graphemes}/src/UnicodeGraphemeProvider.ts (100%) rename addons/{xterm-addon-unicode-graphemes => addon-unicode-graphemes}/src/UnicodeGraphemesAddon.ts (100%) rename addons/{xterm-addon-unicode-graphemes => addon-unicode-graphemes}/src/third-party/UnicodeProperties.ts (100%) rename addons/{xterm-addon-unicode-graphemes => addon-unicode-graphemes}/src/third-party/tiny-inflate.ts (100%) rename addons/{xterm-addon-unicode-graphemes => addon-unicode-graphemes}/src/third-party/unicode-trie.ts (100%) rename addons/{xterm-addon-unicode-graphemes => addon-unicode-graphemes}/src/tsconfig.json (100%) rename addons/{xterm-addon-unicode-graphemes => addon-unicode-graphemes}/test/UnicodeGraphemesAddon.api.ts (100%) rename addons/{xterm-addon-unicode-graphemes => addon-unicode-graphemes}/test/tsconfig.json (100%) rename addons/{xterm-addon-unicode-graphemes => addon-unicode-graphemes}/tsconfig.json (100%) rename addons/{xterm-addon-unicode-graphemes/typings/xterm-addon-unicode-graphemes.d.ts => addon-unicode-graphemes/typings/addon-unicode-graphemes.d.ts} (86%) rename addons/{xterm-addon-unicode-graphemes => addon-unicode-graphemes}/webpack.config.js (92%) rename addons/{xterm-addon-unicode11 => addon-unicode11}/.gitignore (100%) rename addons/{xterm-addon-unicode11 => addon-unicode11}/.npmignore (100%) rename addons/{xterm-addon-unicode11 => addon-unicode11}/LICENSE (100%) rename addons/{xterm-addon-unicode11 => addon-unicode11}/README.md (72%) rename addons/{xterm-addon-unicode11 => addon-unicode11}/package.json (76%) rename addons/{xterm-addon-unicode11 => addon-unicode11}/src/Unicode11Addon.ts (100%) rename addons/{xterm-addon-unicode11 => addon-unicode11}/src/UnicodeV11.ts (100%) rename addons/{xterm-addon-unicode11 => addon-unicode11}/src/tsconfig.json (100%) rename addons/{xterm-addon-unicode11 => addon-unicode11}/test/Unicode11Addon.api.ts (100%) rename addons/{xterm-addon-unicode11 => addon-unicode11}/test/tsconfig.json (100%) rename addons/{xterm-addon-unicode11 => addon-unicode11}/tsconfig.json (100%) rename addons/{xterm-addon-unicode11/typings/xterm-addon-unicode11.d.ts => addon-unicode11/typings/addon-unicode11.d.ts} (87%) rename addons/{xterm-addon-unicode11 => addon-unicode11}/webpack.config.js (94%) rename addons/{xterm-addon-web-links => addon-web-links}/.gitignore (100%) rename addons/{xterm-addon-web-links => addon-web-links}/.npmignore (100%) rename addons/{xterm-addon-web-links => addon-web-links}/LICENSE (100%) rename addons/{xterm-addon-web-links => addon-web-links}/README.md (61%) rename addons/{xterm-addon-web-links => addon-web-links}/package.json (76%) rename addons/{xterm-addon-web-links => addon-web-links}/src/WebLinkProvider.ts (100%) rename addons/{xterm-addon-web-links => addon-web-links}/src/WebLinksAddon.ts (100%) rename addons/{xterm-addon-web-links => addon-web-links}/src/tsconfig.json (100%) rename addons/{xterm-addon-web-links => addon-web-links}/test/WebLinksAddon.api.ts (100%) rename addons/{xterm-addon-web-links => addon-web-links}/test/tsconfig.json (100%) rename addons/{xterm-addon-web-links => addon-web-links}/tsconfig.json (100%) rename addons/{xterm-addon-web-links/typings/xterm-addon-web-links.d.ts => addon-web-links/typings/addon-web-links.d.ts} (97%) rename addons/{xterm-addon-web-links => addon-web-links}/webpack.config.js (92%) delete mode 100644 addons/xterm-addon-canvas/README.md diff --git a/.eslintrc.json b/.eslintrc.json index 8ca2eccc..9ba50120 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -14,27 +14,27 @@ "test/api/tsconfig.json", "test/benchmark/tsconfig.json", "test/playwright/tsconfig.json", - "addons/xterm-addon-attach/src/tsconfig.json", - "addons/xterm-addon-attach/test/tsconfig.json", - "addons/xterm-addon-canvas/src/tsconfig.json", - "addons/xterm-addon-canvas/test/tsconfig.json", - "addons/xterm-addon-fit/src/tsconfig.json", - "addons/xterm-addon-fit/test/tsconfig.json", - "addons/xterm-addon-image/src/tsconfig.json", - "addons/xterm-addon-image/test/tsconfig.json", - "addons/xterm-addon-ligatures/src/tsconfig.json", - "addons/xterm-addon-search/src/tsconfig.json", - "addons/xterm-addon-search/test/tsconfig.json", - "addons/xterm-addon-serialize/src/tsconfig.json", - "addons/xterm-addon-serialize/test/tsconfig.json", - "addons/xterm-addon-serialize/benchmark/tsconfig.json", - "addons/xterm-addon-unicode11/src/tsconfig.json", - "addons/xterm-addon-unicode11/test/tsconfig.json", - "addons/xterm-addon-unicode-graphemes/src/tsconfig.json", - "addons/xterm-addon-unicode-graphemes/test/tsconfig.json", - "addons/xterm-addon-unicode-graphemes/benchmark/tsconfig.json", - "addons/xterm-addon-web-links/src/tsconfig.json", - "addons/xterm-addon-web-links/test/tsconfig.json", + "addons/addon-attach/src/tsconfig.json", + "addons/addon-attach/test/tsconfig.json", + "addons/addon-canvas/src/tsconfig.json", + "addons/addon-canvas/test/tsconfig.json", + "addons/addon-fit/src/tsconfig.json", + "addons/addon-fit/test/tsconfig.json", + "addons/addon-image/src/tsconfig.json", + "addons/addon-image/test/tsconfig.json", + "addons/addon-ligatures/src/tsconfig.json", + "addons/addon-search/src/tsconfig.json", + "addons/addon-search/test/tsconfig.json", + "addons/addon-serialize/src/tsconfig.json", + "addons/addon-serialize/test/tsconfig.json", + "addons/addon-serialize/benchmark/tsconfig.json", + "addons/addon-unicode11/src/tsconfig.json", + "addons/addon-unicode11/test/tsconfig.json", + "addons/addon-unicode-graphemes/src/tsconfig.json", + "addons/addon-unicode-graphemes/test/tsconfig.json", + "addons/addon-unicode-graphemes/benchmark/tsconfig.json", + "addons/addon-web-links/src/tsconfig.json", + "addons/addon-web-links/test/tsconfig.json", "addons/addon-webgl/src/tsconfig.json", "addons/addon-webgl/test/tsconfig.json" ], diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a4c76a97..0a64b6a7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,26 +26,26 @@ jobs: zip -r compressed-build \ ./out/* \ ./out-test/* \ - ./addons/xterm-addon-attach/out/* \ - ./addons/xterm-addon-attach/out-test/* \ - ./addons/xterm-addon-canvas/out/* \ - ./addons/xterm-addon-canvas/out-test/* \ - ./addons/xterm-addon-fit/out/* \ - ./addons/xterm-addon-fit/out-test/* \ - ./addons/xterm-addon-image/out/* \ - ./addons/xterm-addon-image/out-test/* \ - ./addons/xterm-addon-ligatures/out/* \ - ./addons/xterm-addon-ligatures/out-test/* \ - ./addons/xterm-addon-search/out/* \ - ./addons/xterm-addon-search/out-test/* \ - ./addons/xterm-addon-serialize/out/* \ - ./addons/xterm-addon-serialize/out-test/* \ - ./addons/xterm-addon-unicode11/out/* \ - ./addons/xterm-addon-unicode11/out-test/* \ - ./addons/xterm-addon-unicode-graphemes/out/* \ - ./addons/xterm-addon-unicode-graphemes/out-test/* \ - ./addons/xterm-addon-web-links/out/* \ - ./addons/xterm-addon-web-links/out-test/* \ + ./addons/addon-attach/out/* \ + ./addons/addon-attach/out-test/* \ + ./addons/addon-canvas/out/* \ + ./addons/addon-canvas/out-test/* \ + ./addons/addon-fit/out/* \ + ./addons/addon-fit/out-test/* \ + ./addons/addon-image/out/* \ + ./addons/addon-image/out-test/* \ + ./addons/addon-ligatures/out/* \ + ./addons/addon-ligatures/out-test/* \ + ./addons/addon-search/out/* \ + ./addons/addon-search/out-test/* \ + ./addons/addon-serialize/out/* \ + ./addons/addon-serialize/out-test/* \ + ./addons/addon-unicode11/out/* \ + ./addons/addon-unicode11/out-test/* \ + ./addons/addon-unicode-graphemes/out/* \ + ./addons/addon-unicode-graphemes/out-test/* \ + ./addons/addon-web-links/out/* \ + ./addons/addon-web-links/out-test/* \ ./addons/addon-webgl/out/* \ ./addons/addon-webgl/out-test/* - name: Upload artifacts @@ -265,8 +265,8 @@ jobs: run: yarn build-demo - name: Integration tests (core) # Tests use 50% workers to reduce flakiness run: yarn test-playwright-${{ matrix.browser }} --workers=50% --forbid-only --suite=core - - name: Integration tests (xterm-addon-canvas) - run: yarn test-playwright-${{ matrix.browser }} --workers=50% --forbid-only --suite=xterm-addon-canvas + - name: Integration tests (addon-canvas) + run: yarn test-playwright-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-canvas - name: Integration tests (addon-webgl) run: yarn test-playwright-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-webgl diff --git a/README.md b/README.md index 64dde4c1..47ede986 100644 --- a/README.md +++ b/README.md @@ -59,14 +59,14 @@ import { Terminal } from '@xterm/xterm'; Addons are separate modules that extend the `Terminal` by building on the [xterm.js API](https://github.com/xtermjs/xterm.js/blob/master/typings/xterm.d.ts). To use an addon, you first need to install it in your project: ```bash -npm i -S xterm-addon-web-links +npm i -S @xterm/addon-web-links ``` Then import the addon, instantiate it and call `Terminal.loadAddon`: ```ts import { Terminal } from '@xterm/xterm'; -import { WebLinksAddon } from 'xterm-addon-web-links'; +import { WebLinksAddon } from '@xterm/addon-web-links'; const terminal = new Terminal(); // Load WebLinksAddon on terminal, this is all that's needed to get web links @@ -76,10 +76,10 @@ terminal.loadAddon(new WebLinksAddon()); The xterm.js team maintains the following addons, but anyone can build them: -- [`xterm-addon-attach`](https://github.com/xtermjs/xterm.js/tree/master/addons/xterm-addon-attach): Attaches to a server running a process via a websocket -- [`xterm-addon-fit`](https://github.com/xtermjs/xterm.js/tree/master/addons/xterm-addon-fit): Fits the terminal to the containing element -- [`xterm-addon-search`](https://github.com/xtermjs/xterm.js/tree/master/addons/xterm-addon-search): Adds search functionality -- [`xterm-addon-web-links`](https://github.com/xtermjs/xterm.js/tree/master/addons/xterm-addon-web-links): Adds web link detection and interaction +- [`@xterm/addon-attach`](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-attach): Attaches to a server running a process via a websocket +- [`@xterm/addon-fit`](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-fit): Fits the terminal to the containing element +- [`@xterm/addon-search`](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-search): Adds search functionality +- [`@xterm/addon-web-links`](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-web-links): Adds web link detection and interaction ## Browser Support diff --git a/addons/xterm-addon-attach/.gitignore b/addons/addon-attach/.gitignore similarity index 100% rename from addons/xterm-addon-attach/.gitignore rename to addons/addon-attach/.gitignore diff --git a/addons/xterm-addon-attach/.npmignore b/addons/addon-attach/.npmignore similarity index 100% rename from addons/xterm-addon-attach/.npmignore rename to addons/addon-attach/.npmignore diff --git a/addons/xterm-addon-attach/LICENSE b/addons/addon-attach/LICENSE similarity index 100% rename from addons/xterm-addon-attach/LICENSE rename to addons/addon-attach/LICENSE diff --git a/addons/xterm-addon-attach/README.md b/addons/addon-attach/README.md similarity index 67% rename from addons/xterm-addon-attach/README.md rename to addons/addon-attach/README.md index a12c3c67..fa123fe2 100644 --- a/addons/xterm-addon-attach/README.md +++ b/addons/addon-attach/README.md @@ -1,22 +1,22 @@ -## xterm-addon-attach +## @xterm/addon-attach An addon for [xterm.js](https://github.com/xtermjs/xterm.js) that enables attaching to a web socket. This addon requires xterm.js v4+. ### Install ```bash -npm install --save xterm-addon-attach +npm install --save @xterm/addon-attach ``` ### Usage ```ts import { Terminal } from '@xterm/xterm'; -import { AttachAddon } from 'xterm-addon-attach'; +import { AttachAddon } from '@xterm/addon-attach'; const terminal = new Terminal(); const attachAddon = new AttachAddon(webSocket); terminal.loadAddon(attachAddon); ``` -See the full [API](https://github.com/xtermjs/xterm.js/blob/master/addons/xterm-addon-attach/typings/xterm-addon-attach.d.ts) for more advanced usage. +See the full [API](https://github.com/xtermjs/xterm.js/blob/master/addons/addon-attach/typings/addon-attach.d.ts) for more advanced usage. diff --git a/addons/xterm-addon-attach/package.json b/addons/addon-attach/package.json similarity index 77% rename from addons/xterm-addon-attach/package.json rename to addons/addon-attach/package.json index be92fc66..8e5a413e 100644 --- a/addons/xterm-addon-attach/package.json +++ b/addons/addon-attach/package.json @@ -1,13 +1,13 @@ { - "name": "xterm-addon-attach", + "name": "@xterm/addon-attach", "version": "0.9.0", "author": { "name": "The xterm.js authors", "url": "https://xtermjs.org/" }, - "main": "lib/xterm-addon-attach.js", - "types": "typings/xterm-addon-attach.d.ts", - "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/xterm-addon-attach", + "main": "lib/addon-attach.js", + "types": "typings/addon-attach.d.ts", + "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-attach", "license": "MIT", "keywords": [ "terminal", diff --git a/addons/xterm-addon-attach/src/AttachAddon.ts b/addons/addon-attach/src/AttachAddon.ts similarity index 100% rename from addons/xterm-addon-attach/src/AttachAddon.ts rename to addons/addon-attach/src/AttachAddon.ts diff --git a/addons/xterm-addon-attach/src/tsconfig.json b/addons/addon-attach/src/tsconfig.json similarity index 100% rename from addons/xterm-addon-attach/src/tsconfig.json rename to addons/addon-attach/src/tsconfig.json diff --git a/addons/xterm-addon-attach/test/AttachAddon.api.ts b/addons/addon-attach/test/AttachAddon.api.ts similarity index 100% rename from addons/xterm-addon-attach/test/AttachAddon.api.ts rename to addons/addon-attach/test/AttachAddon.api.ts diff --git a/addons/xterm-addon-attach/test/tsconfig.json b/addons/addon-attach/test/tsconfig.json similarity index 100% rename from addons/xterm-addon-attach/test/tsconfig.json rename to addons/addon-attach/test/tsconfig.json diff --git a/addons/xterm-addon-attach/tsconfig.json b/addons/addon-attach/tsconfig.json similarity index 100% rename from addons/xterm-addon-attach/tsconfig.json rename to addons/addon-attach/tsconfig.json diff --git a/addons/xterm-addon-attach/typings/xterm-addon-attach.d.ts b/addons/addon-attach/typings/addon-attach.d.ts similarity index 92% rename from addons/xterm-addon-attach/typings/xterm-addon-attach.d.ts rename to addons/addon-attach/typings/addon-attach.d.ts index 86296825..4e1b2fc3 100644 --- a/addons/xterm-addon-attach/typings/xterm-addon-attach.d.ts +++ b/addons/addon-attach/typings/addon-attach.d.ts @@ -5,7 +5,7 @@ import { Terminal, ITerminalAddon } from '@xterm/xterm'; -declare module 'xterm-addon-attach' { +declare module '@xterm/addon-attach' { export interface IAttachOptions { /** * Whether input should be written to the backend. Defaults to `true`. diff --git a/addons/xterm-addon-attach/webpack.config.js b/addons/addon-attach/webpack.config.js similarity index 92% rename from addons/xterm-addon-attach/webpack.config.js rename to addons/addon-attach/webpack.config.js index 65996f19..599bb142 100644 --- a/addons/xterm-addon-attach/webpack.config.js +++ b/addons/addon-attach/webpack.config.js @@ -6,7 +6,7 @@ const path = require('path'); const addonName = 'AttachAddon'; -const mainFile = 'xterm-addon-attach.js'; +const mainFile = 'addon-attach.js'; module.exports = { entry: `./out/${addonName}.js`, diff --git a/addons/xterm-addon-canvas/.gitignore b/addons/addon-canvas/.gitignore similarity index 100% rename from addons/xterm-addon-canvas/.gitignore rename to addons/addon-canvas/.gitignore diff --git a/addons/xterm-addon-canvas/.npmignore b/addons/addon-canvas/.npmignore similarity index 100% rename from addons/xterm-addon-canvas/.npmignore rename to addons/addon-canvas/.npmignore diff --git a/addons/xterm-addon-canvas/LICENSE b/addons/addon-canvas/LICENSE similarity index 100% rename from addons/xterm-addon-canvas/LICENSE rename to addons/addon-canvas/LICENSE diff --git a/addons/addon-canvas/README.md b/addons/addon-canvas/README.md new file mode 100644 index 00000000..502ade25 --- /dev/null +++ b/addons/addon-canvas/README.md @@ -0,0 +1,28 @@ +## @xterm/addon-canvas + +An addon for [xterm.js](https://github.com/xtermjs/xterm.js) that enables a canvas-based renderer using a 2d context to draw. This addon requires xterm.js v5+. + +The purpose of this addon is to be used as a fallback for the [webgl addon](https://www.npmjs.com/package/@xterm/addon-webgl) when better performance is desired over the default DOM renderer, but WebGL2 isn't supported or performant for some reason. + +### Install + +```bash +npm install --save @xterm/addon-canvas +``` + +### Usage + +```ts +import { Terminal } from '@xterm/xterm'; +import { CanvasAddon } from '@xterm/addon-canvas'; + +const terminal = new Terminal(); +terminal.open(element); +terminal.loadAddon(new CanvasAddon()); +``` + +See the full [API](https://github.com/xtermjs/xterm.js/blob/master/addons/addon-canvas/typings/addon-canvas.d.ts) for more advanced usage. + +### See also + +- [@xterm/addon-webgl](https://www.npmjs.com/package/@xterm/addon-webgl) A renderer for xterm.js that uses WebGL diff --git a/addons/xterm-addon-canvas/package.json b/addons/addon-canvas/package.json similarity index 80% rename from addons/xterm-addon-canvas/package.json rename to addons/addon-canvas/package.json index eefdf375..a614c281 100644 --- a/addons/xterm-addon-canvas/package.json +++ b/addons/addon-canvas/package.json @@ -1,13 +1,13 @@ { - "name": "xterm-addon-canvas", + "name": "@xterm/addon-canvas", "version": "0.5.0", "author": { "name": "The xterm.js authors", "url": "https://xtermjs.org/" }, - "main": "lib/xterm-addon-canvas.js", - "types": "typings/xterm-addon-canvas.d.ts", - "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/xterm-addon-canvas", + "main": "lib/addon-canvas.js", + "types": "typings/addon-canvas.d.ts", + "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-canvas", "license": "MIT", "keywords": [ "terminal", diff --git a/addons/xterm-addon-canvas/src/BaseRenderLayer.ts b/addons/addon-canvas/src/BaseRenderLayer.ts similarity index 100% rename from addons/xterm-addon-canvas/src/BaseRenderLayer.ts rename to addons/addon-canvas/src/BaseRenderLayer.ts diff --git a/addons/xterm-addon-canvas/src/CanvasAddon.ts b/addons/addon-canvas/src/CanvasAddon.ts similarity index 100% rename from addons/xterm-addon-canvas/src/CanvasAddon.ts rename to addons/addon-canvas/src/CanvasAddon.ts diff --git a/addons/xterm-addon-canvas/src/CanvasRenderer.ts b/addons/addon-canvas/src/CanvasRenderer.ts similarity index 100% rename from addons/xterm-addon-canvas/src/CanvasRenderer.ts rename to addons/addon-canvas/src/CanvasRenderer.ts diff --git a/addons/xterm-addon-canvas/src/CursorRenderLayer.ts b/addons/addon-canvas/src/CursorRenderLayer.ts similarity index 100% rename from addons/xterm-addon-canvas/src/CursorRenderLayer.ts rename to addons/addon-canvas/src/CursorRenderLayer.ts diff --git a/addons/xterm-addon-canvas/src/GridCache.test.ts b/addons/addon-canvas/src/GridCache.test.ts similarity index 100% rename from addons/xterm-addon-canvas/src/GridCache.test.ts rename to addons/addon-canvas/src/GridCache.test.ts diff --git a/addons/xterm-addon-canvas/src/GridCache.ts b/addons/addon-canvas/src/GridCache.ts similarity index 100% rename from addons/xterm-addon-canvas/src/GridCache.ts rename to addons/addon-canvas/src/GridCache.ts diff --git a/addons/xterm-addon-canvas/src/LinkRenderLayer.ts b/addons/addon-canvas/src/LinkRenderLayer.ts similarity index 100% rename from addons/xterm-addon-canvas/src/LinkRenderLayer.ts rename to addons/addon-canvas/src/LinkRenderLayer.ts diff --git a/addons/xterm-addon-canvas/src/SelectionRenderLayer.ts b/addons/addon-canvas/src/SelectionRenderLayer.ts similarity index 100% rename from addons/xterm-addon-canvas/src/SelectionRenderLayer.ts rename to addons/addon-canvas/src/SelectionRenderLayer.ts diff --git a/addons/xterm-addon-canvas/src/TextRenderLayer.ts b/addons/addon-canvas/src/TextRenderLayer.ts similarity index 100% rename from addons/xterm-addon-canvas/src/TextRenderLayer.ts rename to addons/addon-canvas/src/TextRenderLayer.ts diff --git a/addons/xterm-addon-canvas/src/Types.d.ts b/addons/addon-canvas/src/Types.d.ts similarity index 100% rename from addons/xterm-addon-canvas/src/Types.d.ts rename to addons/addon-canvas/src/Types.d.ts diff --git a/addons/xterm-addon-canvas/src/tsconfig.json b/addons/addon-canvas/src/tsconfig.json similarity index 100% rename from addons/xterm-addon-canvas/src/tsconfig.json rename to addons/addon-canvas/src/tsconfig.json diff --git a/addons/xterm-addon-canvas/test/CanvasRenderer.test.ts b/addons/addon-canvas/test/CanvasRenderer.test.ts similarity index 100% rename from addons/xterm-addon-canvas/test/CanvasRenderer.test.ts rename to addons/addon-canvas/test/CanvasRenderer.test.ts diff --git a/addons/xterm-addon-canvas/test/playwright.config.ts b/addons/addon-canvas/test/playwright.config.ts similarity index 100% rename from addons/xterm-addon-canvas/test/playwright.config.ts rename to addons/addon-canvas/test/playwright.config.ts diff --git a/addons/xterm-addon-canvas/test/tsconfig.json b/addons/addon-canvas/test/tsconfig.json similarity index 100% rename from addons/xterm-addon-canvas/test/tsconfig.json rename to addons/addon-canvas/test/tsconfig.json diff --git a/addons/xterm-addon-canvas/tsconfig.json b/addons/addon-canvas/tsconfig.json similarity index 100% rename from addons/xterm-addon-canvas/tsconfig.json rename to addons/addon-canvas/tsconfig.json diff --git a/addons/xterm-addon-canvas/typings/xterm-addon-canvas.d.ts b/addons/addon-canvas/typings/addon-canvas.d.ts similarity index 96% rename from addons/xterm-addon-canvas/typings/xterm-addon-canvas.d.ts rename to addons/addon-canvas/typings/addon-canvas.d.ts index 9a444d27..a679f0a5 100644 --- a/addons/xterm-addon-canvas/typings/xterm-addon-canvas.d.ts +++ b/addons/addon-canvas/typings/addon-canvas.d.ts @@ -5,7 +5,7 @@ import { Terminal, ITerminalAddon, IEvent } from '@xterm/xterm'; -declare module 'xterm-addon-canvas' { +declare module '@xterm/addon-canvas' { /** * An xterm.js addon that provides search functionality. */ diff --git a/addons/xterm-addon-canvas/webpack.config.js b/addons/addon-canvas/webpack.config.js similarity index 94% rename from addons/xterm-addon-canvas/webpack.config.js rename to addons/addon-canvas/webpack.config.js index 9c98760a..9daa08f9 100644 --- a/addons/xterm-addon-canvas/webpack.config.js +++ b/addons/addon-canvas/webpack.config.js @@ -6,7 +6,7 @@ const path = require('path'); const addonName = 'CanvasAddon'; -const mainFile = 'xterm-addon-canvas.js'; +const mainFile = 'addon-canvas.js'; module.exports = { entry: `./out/${addonName}.js`, diff --git a/addons/xterm-addon-fit/.gitignore b/addons/addon-fit/.gitignore similarity index 100% rename from addons/xterm-addon-fit/.gitignore rename to addons/addon-fit/.gitignore diff --git a/addons/xterm-addon-fit/.npmignore b/addons/addon-fit/.npmignore similarity index 100% rename from addons/xterm-addon-fit/.npmignore rename to addons/addon-fit/.npmignore diff --git a/addons/xterm-addon-fit/LICENSE b/addons/addon-fit/LICENSE similarity index 100% rename from addons/xterm-addon-fit/LICENSE rename to addons/addon-fit/LICENSE diff --git a/addons/xterm-addon-fit/README.md b/addons/addon-fit/README.md similarity index 72% rename from addons/xterm-addon-fit/README.md rename to addons/addon-fit/README.md index 0b858fb4..076e5127 100644 --- a/addons/xterm-addon-fit/README.md +++ b/addons/addon-fit/README.md @@ -1,18 +1,18 @@ -## xterm-addon-fit +## @xterm/addon-fit An addon for [xterm.js](https://github.com/xtermjs/xterm.js) that enables fitting the terminal's dimensions to a containing element. This addon requires xterm.js v4+. ### Install ```bash -npm install --save xterm-addon-fit +npm install --save @xterm/addon-fit ``` ### Usage ```ts import { Terminal } from '@xterm/xterm'; -import { FitAddon } from 'xterm-addon-fit'; +import { FitAddon } from '@xterm/addon-fit'; const terminal = new Terminal(); const fitAddon = new FitAddon(); @@ -21,4 +21,4 @@ terminal.open(containerElement); fitAddon.fit(); ``` -See the full [API](https://github.com/xtermjs/xterm.js/blob/master/addons/xterm-addon-fit/typings/xterm-addon-fit.d.ts) for more advanced usage. +See the full [API](https://github.com/xtermjs/xterm.js/blob/master/addons/addon-fit/typings/addon-fit.d.ts) for more advanced usage. diff --git a/addons/xterm-addon-fit/package.json b/addons/addon-fit/package.json similarity index 79% rename from addons/xterm-addon-fit/package.json rename to addons/addon-fit/package.json index b2652aae..046ef4d8 100644 --- a/addons/xterm-addon-fit/package.json +++ b/addons/addon-fit/package.json @@ -1,13 +1,13 @@ { - "name": "xterm-addon-fit", + "name": "@xterm/addon-fit", "version": "0.8.0", "author": { "name": "The xterm.js authors", "url": "https://xtermjs.org/" }, - "main": "lib/xterm-addon-fit.js", - "types": "typings/xterm-addon-fit.d.ts", - "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/xterm-addon-fit", + "main": "lib/addon-fit.js", + "types": "typings/addon-fit.d.ts", + "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-fit", "license": "MIT", "keywords": [ "terminal", diff --git a/addons/xterm-addon-fit/src/FitAddon.ts b/addons/addon-fit/src/FitAddon.ts similarity index 100% rename from addons/xterm-addon-fit/src/FitAddon.ts rename to addons/addon-fit/src/FitAddon.ts diff --git a/addons/xterm-addon-fit/src/tsconfig.json b/addons/addon-fit/src/tsconfig.json similarity index 100% rename from addons/xterm-addon-fit/src/tsconfig.json rename to addons/addon-fit/src/tsconfig.json diff --git a/addons/xterm-addon-fit/test/FitAddon.api.ts b/addons/addon-fit/test/FitAddon.api.ts similarity index 100% rename from addons/xterm-addon-fit/test/FitAddon.api.ts rename to addons/addon-fit/test/FitAddon.api.ts diff --git a/addons/xterm-addon-fit/test/tsconfig.json b/addons/addon-fit/test/tsconfig.json similarity index 100% rename from addons/xterm-addon-fit/test/tsconfig.json rename to addons/addon-fit/test/tsconfig.json diff --git a/addons/xterm-addon-fit/tsconfig.json b/addons/addon-fit/tsconfig.json similarity index 100% rename from addons/xterm-addon-fit/tsconfig.json rename to addons/addon-fit/tsconfig.json diff --git a/addons/xterm-addon-fit/typings/xterm-addon-fit.d.ts b/addons/addon-fit/typings/addon-fit.d.ts similarity index 96% rename from addons/xterm-addon-fit/typings/xterm-addon-fit.d.ts rename to addons/addon-fit/typings/addon-fit.d.ts index 605a7b1d..e3d20e29 100644 --- a/addons/xterm-addon-fit/typings/xterm-addon-fit.d.ts +++ b/addons/addon-fit/typings/addon-fit.d.ts @@ -5,7 +5,7 @@ import { Terminal, ITerminalAddon } from '@xterm/xterm'; -declare module 'xterm-addon-fit' { +declare module '@xterm/addon-fit' { /** * An xterm.js addon that enables resizing the terminal to the dimensions of * its containing element. diff --git a/addons/xterm-addon-fit/webpack.config.js b/addons/addon-fit/webpack.config.js similarity index 93% rename from addons/xterm-addon-fit/webpack.config.js rename to addons/addon-fit/webpack.config.js index 4b542150..e220668c 100644 --- a/addons/xterm-addon-fit/webpack.config.js +++ b/addons/addon-fit/webpack.config.js @@ -6,7 +6,7 @@ const path = require('path'); const addonName = 'FitAddon'; -const mainFile = 'xterm-addon-fit.js'; +const mainFile = 'addon-fit.js'; module.exports = { entry: `./out/${addonName}.js`, diff --git a/addons/xterm-addon-image/.gitignore b/addons/addon-image/.gitignore similarity index 100% rename from addons/xterm-addon-image/.gitignore rename to addons/addon-image/.gitignore diff --git a/addons/xterm-addon-image/.npmignore b/addons/addon-image/.npmignore similarity index 100% rename from addons/xterm-addon-image/.npmignore rename to addons/addon-image/.npmignore diff --git a/addons/xterm-addon-image/LICENSE b/addons/addon-image/LICENSE similarity index 100% rename from addons/xterm-addon-image/LICENSE rename to addons/addon-image/LICENSE diff --git a/addons/xterm-addon-image/README.md b/addons/addon-image/README.md similarity index 98% rename from addons/xterm-addon-image/README.md rename to addons/addon-image/README.md index f9ccd637..9fd327e3 100644 --- a/addons/xterm-addon-image/README.md +++ b/addons/addon-image/README.md @@ -1,4 +1,4 @@ -## xterm-addon-image +## @xterm/addon-image Inline image output in xterm.js. Supports SIXEL and iTerm's inline image protocol (IIP). @@ -9,7 +9,7 @@ Inline image output in xterm.js. Supports SIXEL and iTerm's inline image protoco ### Install from npm ```bash -npm install --save xterm-addon-image +npm install --save @xterm/addon-image ``` @@ -17,7 +17,7 @@ npm install --save xterm-addon-image ```ts import { Terminal } from '@xterm/xterm'; -import { ImageAddon, IImageAddonOptions } from 'xterm-addon-image'; +import { ImageAddon, IImageAddonOptions } from '@xterm/addon-image'; // customize as needed (showing addon defaults) const customSettings: IImageAddonOptions = { @@ -227,5 +227,5 @@ _How can I adjust the memory usage?_ - 0.1.2 bugfix: reset clear flag - 0.1.1 bugfixes: - clear sticky image tiles on render - - create xterm-addon-image folder from bootstrap.sh + - create folder from bootstrap.sh - fix peer dependency in package.json diff --git a/addons/xterm-addon-image/fixture/endless.sh b/addons/addon-image/fixture/endless.sh old mode 100755 new mode 100644 similarity index 100% rename from addons/xterm-addon-image/fixture/endless.sh rename to addons/addon-image/fixture/endless.sh diff --git a/addons/xterm-addon-image/fixture/example.png b/addons/addon-image/fixture/example.png similarity index 100% rename from addons/xterm-addon-image/fixture/example.png rename to addons/addon-image/fixture/example.png diff --git a/addons/xterm-addon-image/fixture/gcrglf.sh b/addons/addon-image/fixture/gcrglf.sh old mode 100755 new mode 100644 similarity index 100% rename from addons/xterm-addon-image/fixture/gcrglf.sh rename to addons/addon-image/fixture/gcrglf.sh diff --git a/addons/xterm-addon-image/fixture/growing_rect.js b/addons/addon-image/fixture/growing_rect.js similarity index 100% rename from addons/xterm-addon-image/fixture/growing_rect.js rename to addons/addon-image/fixture/growing_rect.js diff --git a/addons/xterm-addon-image/fixture/iip/palette.iip b/addons/addon-image/fixture/iip/palette.iip similarity index 100% rename from addons/xterm-addon-image/fixture/iip/palette.iip rename to addons/addon-image/fixture/iip/palette.iip diff --git a/addons/xterm-addon-image/fixture/iip/spinfox.iip b/addons/addon-image/fixture/iip/spinfox.iip similarity index 100% rename from addons/xterm-addon-image/fixture/iip/spinfox.iip rename to addons/addon-image/fixture/iip/spinfox.iip diff --git a/addons/xterm-addon-image/fixture/iip/w3c_gif.iip b/addons/addon-image/fixture/iip/w3c_gif.iip similarity index 100% rename from addons/xterm-addon-image/fixture/iip/w3c_gif.iip rename to addons/addon-image/fixture/iip/w3c_gif.iip diff --git a/addons/xterm-addon-image/fixture/iip/w3c_jpg.iip b/addons/addon-image/fixture/iip/w3c_jpg.iip similarity index 100% rename from addons/xterm-addon-image/fixture/iip/w3c_jpg.iip rename to addons/addon-image/fixture/iip/w3c_jpg.iip diff --git a/addons/xterm-addon-image/fixture/iip/w3c_png.iip b/addons/addon-image/fixture/iip/w3c_png.iip similarity index 100% rename from addons/xterm-addon-image/fixture/iip/w3c_png.iip rename to addons/addon-image/fixture/iip/w3c_png.iip diff --git a/addons/xterm-addon-image/fixture/inspect_palette.sh b/addons/addon-image/fixture/inspect_palette.sh old mode 100755 new mode 100644 similarity index 100% rename from addons/xterm-addon-image/fixture/inspect_palette.sh rename to addons/addon-image/fixture/inspect_palette.sh diff --git a/addons/xterm-addon-image/fixture/overdraw.sh b/addons/addon-image/fixture/overdraw.sh old mode 100755 new mode 100644 similarity index 100% rename from addons/xterm-addon-image/fixture/overdraw.sh rename to addons/addon-image/fixture/overdraw.sh diff --git a/addons/xterm-addon-image/fixture/palette.blob b/addons/addon-image/fixture/palette.blob similarity index 100% rename from addons/xterm-addon-image/fixture/palette.blob rename to addons/addon-image/fixture/palette.blob diff --git a/addons/xterm-addon-image/fixture/palette.png b/addons/addon-image/fixture/palette.png similarity index 100% rename from addons/xterm-addon-image/fixture/palette.png rename to addons/addon-image/fixture/palette.png diff --git a/addons/xterm-addon-image/fixture/palette.sixel b/addons/addon-image/fixture/palette.sixel similarity index 100% rename from addons/xterm-addon-image/fixture/palette.sixel rename to addons/addon-image/fixture/palette.sixel diff --git a/addons/xterm-addon-image/fixture/testimages/agfa-makernotes.jpg b/addons/addon-image/fixture/testimages/agfa-makernotes.jpg similarity index 100% rename from addons/xterm-addon-image/fixture/testimages/agfa-makernotes.jpg rename to addons/addon-image/fixture/testimages/agfa-makernotes.jpg diff --git a/addons/xterm-addon-image/fixture/testimages/iphone_hdr_YES.jpg b/addons/addon-image/fixture/testimages/iphone_hdr_YES.jpg similarity index 100% rename from addons/xterm-addon-image/fixture/testimages/iphone_hdr_YES.jpg rename to addons/addon-image/fixture/testimages/iphone_hdr_YES.jpg diff --git a/addons/xterm-addon-image/fixture/testimages/nikon-e950.jpg b/addons/addon-image/fixture/testimages/nikon-e950.jpg similarity index 100% rename from addons/xterm-addon-image/fixture/testimages/nikon-e950.jpg rename to addons/addon-image/fixture/testimages/nikon-e950.jpg diff --git a/addons/xterm-addon-image/fixture/testimages/sony-alpha-6000.jpg b/addons/addon-image/fixture/testimages/sony-alpha-6000.jpg similarity index 100% rename from addons/xterm-addon-image/fixture/testimages/sony-alpha-6000.jpg rename to addons/addon-image/fixture/testimages/sony-alpha-6000.jpg diff --git a/addons/xterm-addon-image/fixture/testimages/spinfox.png b/addons/addon-image/fixture/testimages/spinfox.png similarity index 100% rename from addons/xterm-addon-image/fixture/testimages/spinfox.png rename to addons/addon-image/fixture/testimages/spinfox.png diff --git a/addons/xterm-addon-image/fixture/testimages/w3c_home.gif b/addons/addon-image/fixture/testimages/w3c_home.gif similarity index 100% rename from addons/xterm-addon-image/fixture/testimages/w3c_home.gif rename to addons/addon-image/fixture/testimages/w3c_home.gif diff --git a/addons/xterm-addon-image/fixture/testimages/w3c_home.jpg b/addons/addon-image/fixture/testimages/w3c_home.jpg similarity index 100% rename from addons/xterm-addon-image/fixture/testimages/w3c_home.jpg rename to addons/addon-image/fixture/testimages/w3c_home.jpg diff --git a/addons/xterm-addon-image/fixture/testimages/w3c_home.png b/addons/addon-image/fixture/testimages/w3c_home.png similarity index 100% rename from addons/xterm-addon-image/fixture/testimages/w3c_home.png rename to addons/addon-image/fixture/testimages/w3c_home.png diff --git a/addons/xterm-addon-image/fixture/testimages/w3c_home_2.gif b/addons/addon-image/fixture/testimages/w3c_home_2.gif similarity index 100% rename from addons/xterm-addon-image/fixture/testimages/w3c_home_2.gif rename to addons/addon-image/fixture/testimages/w3c_home_2.gif diff --git a/addons/xterm-addon-image/fixture/testimages/w3c_home_2.jpg b/addons/addon-image/fixture/testimages/w3c_home_2.jpg similarity index 100% rename from addons/xterm-addon-image/fixture/testimages/w3c_home_2.jpg rename to addons/addon-image/fixture/testimages/w3c_home_2.jpg diff --git a/addons/xterm-addon-image/fixture/testimages/w3c_home_2.png b/addons/addon-image/fixture/testimages/w3c_home_2.png similarity index 100% rename from addons/xterm-addon-image/fixture/testimages/w3c_home_2.png rename to addons/addon-image/fixture/testimages/w3c_home_2.png diff --git a/addons/xterm-addon-image/fixture/testimages/w3c_home_256.gif b/addons/addon-image/fixture/testimages/w3c_home_256.gif similarity index 100% rename from addons/xterm-addon-image/fixture/testimages/w3c_home_256.gif rename to addons/addon-image/fixture/testimages/w3c_home_256.gif diff --git a/addons/xterm-addon-image/fixture/testimages/w3c_home_256.jpg b/addons/addon-image/fixture/testimages/w3c_home_256.jpg similarity index 100% rename from addons/xterm-addon-image/fixture/testimages/w3c_home_256.jpg rename to addons/addon-image/fixture/testimages/w3c_home_256.jpg diff --git a/addons/xterm-addon-image/fixture/testimages/w3c_home_256.png b/addons/addon-image/fixture/testimages/w3c_home_256.png similarity index 100% rename from addons/xterm-addon-image/fixture/testimages/w3c_home_256.png rename to addons/addon-image/fixture/testimages/w3c_home_256.png diff --git a/addons/xterm-addon-image/fixture/testimages/w3c_home_animation.gif b/addons/addon-image/fixture/testimages/w3c_home_animation.gif similarity index 100% rename from addons/xterm-addon-image/fixture/testimages/w3c_home_animation.gif rename to addons/addon-image/fixture/testimages/w3c_home_animation.gif diff --git a/addons/xterm-addon-image/fixture/testimages/w3c_home_gray.gif b/addons/addon-image/fixture/testimages/w3c_home_gray.gif similarity index 100% rename from addons/xterm-addon-image/fixture/testimages/w3c_home_gray.gif rename to addons/addon-image/fixture/testimages/w3c_home_gray.gif diff --git a/addons/xterm-addon-image/fixture/testimages/w3c_home_gray.jpg b/addons/addon-image/fixture/testimages/w3c_home_gray.jpg similarity index 100% rename from addons/xterm-addon-image/fixture/testimages/w3c_home_gray.jpg rename to addons/addon-image/fixture/testimages/w3c_home_gray.jpg diff --git a/addons/xterm-addon-image/fixture/testimages/w3c_home_gray.png b/addons/addon-image/fixture/testimages/w3c_home_gray.png similarity index 100% rename from addons/xterm-addon-image/fixture/testimages/w3c_home_gray.png rename to addons/addon-image/fixture/testimages/w3c_home_gray.png diff --git a/addons/xterm-addon-image/fixture/textcursor.sh b/addons/addon-image/fixture/textcursor.sh old mode 100755 new mode 100644 similarity index 100% rename from addons/xterm-addon-image/fixture/textcursor.sh rename to addons/addon-image/fixture/textcursor.sh diff --git a/addons/xterm-addon-image/package.json b/addons/addon-image/package.json similarity index 80% rename from addons/xterm-addon-image/package.json rename to addons/addon-image/package.json index b07b5b6b..4b0f8cdc 100644 --- a/addons/xterm-addon-image/package.json +++ b/addons/addon-image/package.json @@ -1,13 +1,13 @@ { - "name": "xterm-addon-image", + "name": "@xterm/addon-image", "version": "0.6.0", "author": { "name": "The xterm.js authors", "url": "https://xtermjs.org/" }, - "main": "lib/xterm-addon-image.js", - "types": "typings/xterm-addon-image.d.ts", - "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/xterm-addon-image", + "main": "lib/addon-image.js", + "types": "typings/addon-image.d.ts", + "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-image", "license": "MIT", "keywords": [ "terminal", diff --git a/addons/xterm-addon-image/src/IIPHandler.ts b/addons/addon-image/src/IIPHandler.ts similarity index 100% rename from addons/xterm-addon-image/src/IIPHandler.ts rename to addons/addon-image/src/IIPHandler.ts diff --git a/addons/xterm-addon-image/src/IIPHeaderParser.test.ts b/addons/addon-image/src/IIPHeaderParser.test.ts similarity index 100% rename from addons/xterm-addon-image/src/IIPHeaderParser.test.ts rename to addons/addon-image/src/IIPHeaderParser.test.ts diff --git a/addons/xterm-addon-image/src/IIPHeaderParser.ts b/addons/addon-image/src/IIPHeaderParser.ts similarity index 100% rename from addons/xterm-addon-image/src/IIPHeaderParser.ts rename to addons/addon-image/src/IIPHeaderParser.ts diff --git a/addons/xterm-addon-image/src/IIPMetrics.test.ts b/addons/addon-image/src/IIPMetrics.test.ts similarity index 94% rename from addons/xterm-addon-image/src/IIPMetrics.test.ts rename to addons/addon-image/src/IIPMetrics.test.ts index 688d8d39..8ad5f05c 100644 --- a/addons/xterm-addon-image/src/IIPMetrics.test.ts +++ b/addons/addon-image/src/IIPMetrics.test.ts @@ -36,7 +36,7 @@ const TEST_IMAGES: [string, IMetrics][] = [ describe('IIPMetrics', () => { it('bunch of testimages', () => { for (let i = 0; i < TEST_IMAGES.length; ++i) { - const imageData = fs.readFileSync('./addons/xterm-addon-image/fixture/testimages/' + TEST_IMAGES[i][0]); + const imageData = fs.readFileSync('./addons/addon-image/fixture/testimages/' + TEST_IMAGES[i][0]); assert.deepStrictEqual(imageType(imageData), TEST_IMAGES[i][1]); } }); diff --git a/addons/xterm-addon-image/src/IIPMetrics.ts b/addons/addon-image/src/IIPMetrics.ts similarity index 100% rename from addons/xterm-addon-image/src/IIPMetrics.ts rename to addons/addon-image/src/IIPMetrics.ts diff --git a/addons/xterm-addon-image/src/ImageAddon.ts b/addons/addon-image/src/ImageAddon.ts similarity index 100% rename from addons/xterm-addon-image/src/ImageAddon.ts rename to addons/addon-image/src/ImageAddon.ts diff --git a/addons/xterm-addon-image/src/ImageRenderer.ts b/addons/addon-image/src/ImageRenderer.ts similarity index 100% rename from addons/xterm-addon-image/src/ImageRenderer.ts rename to addons/addon-image/src/ImageRenderer.ts diff --git a/addons/xterm-addon-image/src/ImageStorage.ts b/addons/addon-image/src/ImageStorage.ts similarity index 100% rename from addons/xterm-addon-image/src/ImageStorage.ts rename to addons/addon-image/src/ImageStorage.ts diff --git a/addons/xterm-addon-image/src/SixelHandler.ts b/addons/addon-image/src/SixelHandler.ts similarity index 100% rename from addons/xterm-addon-image/src/SixelHandler.ts rename to addons/addon-image/src/SixelHandler.ts diff --git a/addons/xterm-addon-image/src/Types.d.ts b/addons/addon-image/src/Types.d.ts similarity index 100% rename from addons/xterm-addon-image/src/Types.d.ts rename to addons/addon-image/src/Types.d.ts diff --git a/addons/xterm-addon-image/src/tsconfig.json b/addons/addon-image/src/tsconfig.json similarity index 100% rename from addons/xterm-addon-image/src/tsconfig.json rename to addons/addon-image/src/tsconfig.json diff --git a/addons/xterm-addon-image/test/ImageAddon.api.ts b/addons/addon-image/test/ImageAddon.api.ts similarity index 95% rename from addons/xterm-addon-image/test/ImageAddon.api.ts rename to addons/addon-image/test/ImageAddon.api.ts index 43334bbb..776e96bf 100644 --- a/addons/xterm-addon-image/test/ImageAddon.api.ts +++ b/addons/addon-image/test/ImageAddon.api.ts @@ -39,7 +39,7 @@ interface IDimensions { // image: 640 x 80, 512 color const TESTDATA: ITestData = (() => { - const data8 = readFileSync('./addons/xterm-addon-image/fixture/palette.blob'); + const data8 = readFileSync('./addons/addon-image/fixture/palette.blob'); const data32 = new Uint32Array(data8.buffer); const palette = new Set(); for (let i = 0; i < data32.length; ++i) palette.add(data32[i]); @@ -58,11 +58,11 @@ const SIXEL_SEQ_0 = introducer(0) + TESTDATA.sixel + FINALIZER; // NOTE: the data is loaded as string for easier transport through playwright const TESTDATA_IIP: [string, [number, number]][] = [ - [readFileSync('./addons/xterm-addon-image/fixture/iip/palette.iip', { encoding: 'utf-8' }), [640, 80]], - [readFileSync('./addons/xterm-addon-image/fixture/iip/spinfox.iip', { encoding: 'utf-8' }), [148, 148]], - [readFileSync('./addons/xterm-addon-image/fixture/iip/w3c_gif.iip', { encoding: 'utf-8' }), [72, 48]], - [readFileSync('./addons/xterm-addon-image/fixture/iip/w3c_jpg.iip', { encoding: 'utf-8' }), [72, 48]], - [readFileSync('./addons/xterm-addon-image/fixture/iip/w3c_png.iip', { encoding: 'utf-8' }), [72, 48]] + [readFileSync('./addons/addon-image/fixture/iip/palette.iip', { encoding: 'utf-8' }), [640, 80]], + [readFileSync('./addons/addon-image/fixture/iip/spinfox.iip', { encoding: 'utf-8' }), [148, 148]], + [readFileSync('./addons/addon-image/fixture/iip/w3c_gif.iip', { encoding: 'utf-8' }), [72, 48]], + [readFileSync('./addons/addon-image/fixture/iip/w3c_jpg.iip', { encoding: 'utf-8' }), [72, 48]], + [readFileSync('./addons/addon-image/fixture/iip/w3c_png.iip', { encoding: 'utf-8' }), [72, 48]] ]; describe('ImageAddon', () => { diff --git a/addons/xterm-addon-image/test/tsconfig.json b/addons/addon-image/test/tsconfig.json similarity index 100% rename from addons/xterm-addon-image/test/tsconfig.json rename to addons/addon-image/test/tsconfig.json diff --git a/addons/xterm-addon-image/tsconfig.json b/addons/addon-image/tsconfig.json similarity index 100% rename from addons/xterm-addon-image/tsconfig.json rename to addons/addon-image/tsconfig.json diff --git a/addons/xterm-addon-image/typings/xterm-addon-image.d.ts b/addons/addon-image/typings/addon-image.d.ts similarity index 99% rename from addons/xterm-addon-image/typings/xterm-addon-image.d.ts rename to addons/addon-image/typings/addon-image.d.ts index 608eb9fd..48ba488c 100644 --- a/addons/xterm-addon-image/typings/xterm-addon-image.d.ts +++ b/addons/addon-image/typings/addon-image.d.ts @@ -5,7 +5,7 @@ import { Terminal, ITerminalAddon } from '@xterm/xterm'; -declare module 'xterm-addon-image' { +declare module '@xterm/addon-image' { export interface IImageAddonOptions { /** * Enable size reports in windowOptions: diff --git a/addons/xterm-addon-image/webpack.config.js b/addons/addon-image/webpack.config.js similarity index 93% rename from addons/xterm-addon-image/webpack.config.js rename to addons/addon-image/webpack.config.js index fff66bec..bcd52db2 100644 --- a/addons/xterm-addon-image/webpack.config.js +++ b/addons/addon-image/webpack.config.js @@ -6,7 +6,7 @@ const path = require('path'); const addonName = 'ImageAddon'; -const mainFile = 'xterm-addon-image.js'; +const mainFile = 'addon-image.js'; const addon = { entry: `./out/${addonName}.js`, diff --git a/addons/xterm-addon-ligatures/.gitignore b/addons/addon-ligatures/.gitignore similarity index 100% rename from addons/xterm-addon-ligatures/.gitignore rename to addons/addon-ligatures/.gitignore diff --git a/addons/xterm-addon-ligatures/.npmignore b/addons/addon-ligatures/.npmignore similarity index 100% rename from addons/xterm-addon-ligatures/.npmignore rename to addons/addon-ligatures/.npmignore diff --git a/addons/xterm-addon-ligatures/LICENSE b/addons/addon-ligatures/LICENSE similarity index 100% rename from addons/xterm-addon-ligatures/LICENSE rename to addons/addon-ligatures/LICENSE diff --git a/addons/xterm-addon-ligatures/README.md b/addons/addon-ligatures/README.md similarity index 95% rename from addons/xterm-addon-ligatures/README.md rename to addons/addon-ligatures/README.md index 1c14976b..3b5521e0 100644 --- a/addons/xterm-addon-ligatures/README.md +++ b/addons/addon-ligatures/README.md @@ -1,4 +1,4 @@ -## xterm-addon-ligatures +## @xterm/addon-ligatures Add support for programming ligatures to [xterm.js] when running in environments with access to [Node.js] APIs (such as [Electron]). @@ -10,14 +10,14 @@ Add support for programming ligatures to [xterm.js] when running in environments ### Install ```bash -npm install --save xterm-addon-ligatures +npm install --save @xterm/addon-ligatures ``` ### Usage ```ts import { Terminal } from '@xterm/xterm'; -import { LigaturesAddon } from 'xterm-addon-ligatures'; +import { LigaturesAddon } from '@xterm/addon-ligatures'; const terminal = new Terminal(); const ligaturesAddon = new LigaturesAddon(); diff --git a/addons/xterm-addon-ligatures/bin/download-fonts.js b/addons/addon-ligatures/bin/download-fonts.js similarity index 100% rename from addons/xterm-addon-ligatures/bin/download-fonts.js rename to addons/addon-ligatures/bin/download-fonts.js diff --git a/addons/xterm-addon-ligatures/package.json b/addons/addon-ligatures/package.json similarity index 86% rename from addons/xterm-addon-ligatures/package.json rename to addons/addon-ligatures/package.json index 57c0cd56..c62f9e08 100644 --- a/addons/xterm-addon-ligatures/package.json +++ b/addons/addon-ligatures/package.json @@ -1,14 +1,14 @@ { - "name": "xterm-addon-ligatures", + "name": "@xterm/addon-ligatures", "version": "0.7.0", "description": "Add support for programming ligatures to xterm.js", "author": { "name": "The xterm.js authors", "url": "https://xtermjs.org/" }, - "main": "lib/xterm-addon-ligatures.js", - "types": "typings/xterm-addon-ligatures.d.ts", - "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/xterm-addon-ligatures", + "main": "lib/addon-ligatures.js", + "types": "typings/addon-ligatures.d.ts", + "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-ligatures", "engines": { "node": ">8.0.0" }, diff --git a/addons/xterm-addon-ligatures/src/LigaturesAddon.ts b/addons/addon-ligatures/src/LigaturesAddon.ts similarity index 100% rename from addons/xterm-addon-ligatures/src/LigaturesAddon.ts rename to addons/addon-ligatures/src/LigaturesAddon.ts diff --git a/addons/xterm-addon-ligatures/src/Types.d.ts b/addons/addon-ligatures/src/Types.d.ts similarity index 100% rename from addons/xterm-addon-ligatures/src/Types.d.ts rename to addons/addon-ligatures/src/Types.d.ts diff --git a/addons/xterm-addon-ligatures/src/font.ts b/addons/addon-ligatures/src/font.ts similarity index 100% rename from addons/xterm-addon-ligatures/src/font.ts rename to addons/addon-ligatures/src/font.ts diff --git a/addons/xterm-addon-ligatures/src/index.test.ts b/addons/addon-ligatures/src/index.test.ts similarity index 99% rename from addons/xterm-addon-ligatures/src/index.test.ts rename to addons/addon-ligatures/src/index.test.ts index c7bf09ce..c6aead98 100644 --- a/addons/xterm-addon-ligatures/src/index.test.ts +++ b/addons/addon-ligatures/src/index.test.ts @@ -11,7 +11,7 @@ import * as fontLigatures from 'font-ligatures'; import * as ligatureSupport from '.'; -describe('xterm-addon-ligatures', () => { +describe('LigaturesAddon', () => { let onRefresh: sinon.SinonStub; let term: MockTerminal; diff --git a/addons/xterm-addon-ligatures/src/index.ts b/addons/addon-ligatures/src/index.ts similarity index 100% rename from addons/xterm-addon-ligatures/src/index.ts rename to addons/addon-ligatures/src/index.ts diff --git a/addons/xterm-addon-ligatures/src/parse.test.ts b/addons/addon-ligatures/src/parse.test.ts similarity index 100% rename from addons/xterm-addon-ligatures/src/parse.test.ts rename to addons/addon-ligatures/src/parse.test.ts diff --git a/addons/xterm-addon-ligatures/src/parse.ts b/addons/addon-ligatures/src/parse.ts similarity index 100% rename from addons/xterm-addon-ligatures/src/parse.ts rename to addons/addon-ligatures/src/parse.ts diff --git a/addons/xterm-addon-ligatures/src/tsconfig.json b/addons/addon-ligatures/src/tsconfig.json similarity index 100% rename from addons/xterm-addon-ligatures/src/tsconfig.json rename to addons/addon-ligatures/src/tsconfig.json diff --git a/addons/xterm-addon-ligatures/tsconfig.json b/addons/addon-ligatures/tsconfig.json similarity index 100% rename from addons/xterm-addon-ligatures/tsconfig.json rename to addons/addon-ligatures/tsconfig.json diff --git a/addons/xterm-addon-ligatures/typings/xterm-addon-ligatures.d.ts b/addons/addon-ligatures/typings/addon-ligatures.d.ts similarity index 92% rename from addons/xterm-addon-ligatures/typings/xterm-addon-ligatures.d.ts rename to addons/addon-ligatures/typings/addon-ligatures.d.ts index 2b967a33..2fd4f3e7 100644 --- a/addons/xterm-addon-ligatures/typings/xterm-addon-ligatures.d.ts +++ b/addons/addon-ligatures/typings/addon-ligatures.d.ts @@ -2,7 +2,7 @@ * Copyright (c) 2018 The xterm.js authors. All rights reserved. * @license MIT * - * This contains the type declarations for the xterm-addon-ligatures library. + * This contains the type declarations for the @xterm/addon-ligatures library. * Note that some interfaces may differ between this file and the actual * implementation in src/, that's because this file declares the *public* API * which is intended to be stable and consumed by external programs. @@ -10,7 +10,7 @@ import { Terminal, ITerminalAddon } from '@xterm/xterm'; -declare module 'xterm-addon-ligatures' { +declare module '@xterm/addon-ligatures' { /** * An xterm.js addon that enables web links. */ diff --git a/addons/xterm-addon-ligatures/webpack.config.js b/addons/addon-ligatures/webpack.config.js similarity index 95% rename from addons/xterm-addon-ligatures/webpack.config.js rename to addons/addon-ligatures/webpack.config.js index 5aeebe2e..6ec7f42d 100644 --- a/addons/xterm-addon-ligatures/webpack.config.js +++ b/addons/addon-ligatures/webpack.config.js @@ -6,7 +6,7 @@ const path = require('path'); const addonName = 'LigaturesAddon'; -const mainFile = 'xterm-addon-ligatures.js'; +const mainFile = 'addon-ligatures.js'; module.exports = { entry: `./out/${addonName}.js`, diff --git a/addons/xterm-addon-ligatures/yarn.lock b/addons/addon-ligatures/yarn.lock similarity index 100% rename from addons/xterm-addon-ligatures/yarn.lock rename to addons/addon-ligatures/yarn.lock diff --git a/addons/xterm-addon-search/.gitignore b/addons/addon-search/.gitignore similarity index 100% rename from addons/xterm-addon-search/.gitignore rename to addons/addon-search/.gitignore diff --git a/addons/xterm-addon-search/.npmignore b/addons/addon-search/.npmignore similarity index 100% rename from addons/xterm-addon-search/.npmignore rename to addons/addon-search/.npmignore diff --git a/addons/xterm-addon-search/LICENSE b/addons/addon-search/LICENSE similarity index 100% rename from addons/xterm-addon-search/LICENSE rename to addons/addon-search/LICENSE diff --git a/addons/xterm-addon-search/README.md b/addons/addon-search/README.md similarity index 68% rename from addons/xterm-addon-search/README.md rename to addons/addon-search/README.md index 51ce20b4..fab0b03f 100644 --- a/addons/xterm-addon-search/README.md +++ b/addons/addon-search/README.md @@ -1,18 +1,18 @@ -## xterm-addon-search +## @xterm/addon-search An addon for [xterm.js](https://github.com/xtermjs/xterm.js) that enables searching the buffer. This addon requires xterm.js v4+. ### Install ```bash -npm install --save xterm-addon-search +npm install --save @xterm/addon-search ``` ### Usage ```ts import { Terminal } from '@xterm/xterm'; -import { SearchAddon } from 'xterm-addon-search'; +import { SearchAddon } from '@xterm/addon-search'; const terminal = new Terminal(); const searchAddon = new SearchAddon(); @@ -20,4 +20,4 @@ terminal.loadAddon(searchAddon); searchAddon.findNext('foo'); ``` -See the full [API](https://github.com/xtermjs/xterm.js/blob/master/addons/xterm-addon-search/typings/xterm-addon-search.d.ts) for more advanced usage. +See the full [API](https://github.com/xtermjs/xterm.js/blob/master/addons/addon-search/typings/addon-search.d.ts) for more advanced usage. diff --git a/addons/xterm-addon-search/fixtures/issue-2444 b/addons/addon-search/fixtures/issue-2444 similarity index 100% rename from addons/xterm-addon-search/fixtures/issue-2444 rename to addons/addon-search/fixtures/issue-2444 diff --git a/addons/xterm-addon-search/package.json b/addons/addon-search/package.json similarity index 77% rename from addons/xterm-addon-search/package.json rename to addons/addon-search/package.json index f846874d..9fab82af 100644 --- a/addons/xterm-addon-search/package.json +++ b/addons/addon-search/package.json @@ -1,13 +1,13 @@ { - "name": "xterm-addon-search", + "name": "@xterm/addon-search", "version": "0.13.0", "author": { "name": "The xterm.js authors", "url": "https://xtermjs.org/" }, - "main": "lib/xterm-addon-search.js", - "types": "typings/xterm-addon-search.d.ts", - "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/xterm-addon-search", + "main": "lib/addon-search.js", + "types": "typings/addon-search.d.ts", + "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-search", "license": "MIT", "keywords": [ "terminal", diff --git a/addons/xterm-addon-search/src/SearchAddon.ts b/addons/addon-search/src/SearchAddon.ts similarity index 100% rename from addons/xterm-addon-search/src/SearchAddon.ts rename to addons/addon-search/src/SearchAddon.ts diff --git a/addons/xterm-addon-search/src/tsconfig.json b/addons/addon-search/src/tsconfig.json similarity index 100% rename from addons/xterm-addon-search/src/tsconfig.json rename to addons/addon-search/src/tsconfig.json diff --git a/addons/xterm-addon-search/test/SearchAddon.api.ts b/addons/addon-search/test/SearchAddon.api.ts similarity index 100% rename from addons/xterm-addon-search/test/SearchAddon.api.ts rename to addons/addon-search/test/SearchAddon.api.ts diff --git a/addons/xterm-addon-search/test/tsconfig.json b/addons/addon-search/test/tsconfig.json similarity index 100% rename from addons/xterm-addon-search/test/tsconfig.json rename to addons/addon-search/test/tsconfig.json diff --git a/addons/xterm-addon-search/tsconfig.json b/addons/addon-search/tsconfig.json similarity index 100% rename from addons/xterm-addon-search/tsconfig.json rename to addons/addon-search/tsconfig.json diff --git a/addons/xterm-addon-search/typings/xterm-addon-search.d.ts b/addons/addon-search/typings/addon-search.d.ts similarity index 98% rename from addons/xterm-addon-search/typings/xterm-addon-search.d.ts rename to addons/addon-search/typings/addon-search.d.ts index c3774bf5..282004a2 100644 --- a/addons/xterm-addon-search/typings/xterm-addon-search.d.ts +++ b/addons/addon-search/typings/addon-search.d.ts @@ -5,7 +5,7 @@ import { Terminal, ITerminalAddon, IEvent } from '@xterm/xterm'; -declare module 'xterm-addon-search' { +declare module '@xterm/addon-search' { /** * Options for a search. */ diff --git a/addons/xterm-addon-search/webpack.config.js b/addons/addon-search/webpack.config.js similarity index 94% rename from addons/xterm-addon-search/webpack.config.js rename to addons/addon-search/webpack.config.js index 30526812..a770f93f 100644 --- a/addons/xterm-addon-search/webpack.config.js +++ b/addons/addon-search/webpack.config.js @@ -6,7 +6,7 @@ const path = require('path'); const addonName = 'SearchAddon'; -const mainFile = 'xterm-addon-search.js'; +const mainFile = 'addon-search.js'; module.exports = { entry: `./out/${addonName}.js`, diff --git a/addons/xterm-addon-serialize/.gitignore b/addons/addon-serialize/.gitignore similarity index 100% rename from addons/xterm-addon-serialize/.gitignore rename to addons/addon-serialize/.gitignore diff --git a/addons/xterm-addon-serialize/.npmignore b/addons/addon-serialize/.npmignore similarity index 100% rename from addons/xterm-addon-serialize/.npmignore rename to addons/addon-serialize/.npmignore diff --git a/addons/xterm-addon-serialize/README.md b/addons/addon-serialize/README.md similarity index 74% rename from addons/xterm-addon-serialize/README.md rename to addons/addon-serialize/README.md index 12e0ac87..f0116893 100644 --- a/addons/xterm-addon-serialize/README.md +++ b/addons/addon-serialize/README.md @@ -1,4 +1,4 @@ -## xterm-addon-serialize +## @xterm/addon-serialize An addon for [xterm.js](https://github.com/xtermjs/xterm.js) that enables xterm.js to serialize a terminal framebuffer into string or html. This addon requires xterm.js v4+. @@ -7,14 +7,14 @@ An addon for [xterm.js](https://github.com/xtermjs/xterm.js) that enables xterm. ### Install ```bash -npm install --save xterm-addon-serialize +npm install --save @xterm/addon-serialize ``` ### Usage ```ts import { Terminal } from "xterm"; -import { SerializeAddon } from "xterm-addon-serialize"; +import { SerializeAddon } from "@xterm/addon-serialize"; const terminal = new Terminal(); const serializeAddon = new SerializeAddon(); @@ -25,7 +25,7 @@ terminal.write("something...", () => { }); ``` -See the full [API](https://github.com/xtermjs/xterm.js/blob/master/addons/xterm-addon-serialize/typings/xterm-addon-serialize.d.ts) for more advanced usage. +See the full [API](https://github.com/xtermjs/xterm.js/blob/master/addons/addon-serialize/typings/addon-serialize.d.ts) for more advanced usage. ### Benchmark @@ -35,8 +35,8 @@ See the full [API](https://github.com/xtermjs/xterm.js/blob/master/addons/xterm- $ git clone https://github.com/xtermjs/xterm.js.git $ cd xterm.js $ yarn -$ cd addons/xterm-addon-serialize +$ cd addons/addon-serialize $ yarn benchmark && yarn benchmark-baseline -$ # change some code in `xterm-addon-serialize` +$ # change some code in `@xterm/addon-serialize` $ yarn benchmark-eval ``` diff --git a/addons/xterm-addon-serialize/benchmark/SerializeAddon.benchmark.ts b/addons/addon-serialize/benchmark/SerializeAddon.benchmark.ts similarity index 100% rename from addons/xterm-addon-serialize/benchmark/SerializeAddon.benchmark.ts rename to addons/addon-serialize/benchmark/SerializeAddon.benchmark.ts diff --git a/addons/xterm-addon-serialize/benchmark/benchmark.json b/addons/addon-serialize/benchmark/benchmark.json similarity index 100% rename from addons/xterm-addon-serialize/benchmark/benchmark.json rename to addons/addon-serialize/benchmark/benchmark.json diff --git a/addons/xterm-addon-serialize/benchmark/tsconfig.json b/addons/addon-serialize/benchmark/tsconfig.json similarity index 100% rename from addons/xterm-addon-serialize/benchmark/tsconfig.json rename to addons/addon-serialize/benchmark/tsconfig.json diff --git a/addons/xterm-addon-serialize/package.json b/addons/addon-serialize/package.json similarity index 86% rename from addons/xterm-addon-serialize/package.json rename to addons/addon-serialize/package.json index 8f914865..c95bc531 100644 --- a/addons/xterm-addon-serialize/package.json +++ b/addons/addon-serialize/package.json @@ -1,13 +1,13 @@ { - "name": "xterm-addon-serialize", + "name": "@xterm/addon-serialize", "version": "0.11.0", "author": { "name": "The xterm.js authors", "url": "https://xtermjs.org/" }, - "main": "lib/xterm-addon-serialize.js", - "types": "typings/xterm-addon-serialize.d.ts", - "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/xterm-addon-serialize", + "main": "lib/addon-serialize.js", + "types": "typings/addon-serialize.d.ts", + "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-serialize", "license": "MIT", "keywords": [ "terminal", diff --git a/addons/xterm-addon-serialize/src/SerializeAddon.test.ts b/addons/addon-serialize/src/SerializeAddon.test.ts similarity index 99% rename from addons/xterm-addon-serialize/src/SerializeAddon.test.ts rename to addons/addon-serialize/src/SerializeAddon.test.ts index 75148ab9..d41cfa12 100644 --- a/addons/xterm-addon-serialize/src/SerializeAddon.test.ts +++ b/addons/addon-serialize/src/SerializeAddon.test.ts @@ -44,7 +44,7 @@ class TestSelectionService { } } -describe('xterm-addon-serialize', () => { +describe('SerializeAddon', () => { let dom: jsdom.JSDOM; let window: jsdom.DOMWindow; diff --git a/addons/xterm-addon-serialize/src/SerializeAddon.ts b/addons/addon-serialize/src/SerializeAddon.ts similarity index 100% rename from addons/xterm-addon-serialize/src/SerializeAddon.ts rename to addons/addon-serialize/src/SerializeAddon.ts diff --git a/addons/xterm-addon-serialize/src/tsconfig.json b/addons/addon-serialize/src/tsconfig.json similarity index 100% rename from addons/xterm-addon-serialize/src/tsconfig.json rename to addons/addon-serialize/src/tsconfig.json diff --git a/addons/xterm-addon-serialize/test/SerializeAddon.api.ts b/addons/addon-serialize/test/SerializeAddon.api.ts similarity index 100% rename from addons/xterm-addon-serialize/test/SerializeAddon.api.ts rename to addons/addon-serialize/test/SerializeAddon.api.ts diff --git a/addons/xterm-addon-serialize/test/tsconfig.json b/addons/addon-serialize/test/tsconfig.json similarity index 100% rename from addons/xterm-addon-serialize/test/tsconfig.json rename to addons/addon-serialize/test/tsconfig.json diff --git a/addons/xterm-addon-serialize/tsconfig.json b/addons/addon-serialize/tsconfig.json similarity index 100% rename from addons/xterm-addon-serialize/tsconfig.json rename to addons/addon-serialize/tsconfig.json diff --git a/addons/xterm-addon-serialize/typings/xterm-addon-serialize.d.ts b/addons/addon-serialize/typings/addon-serialize.d.ts similarity index 98% rename from addons/xterm-addon-serialize/typings/xterm-addon-serialize.d.ts rename to addons/addon-serialize/typings/addon-serialize.d.ts index a675cd14..0b127b50 100644 --- a/addons/xterm-addon-serialize/typings/xterm-addon-serialize.d.ts +++ b/addons/addon-serialize/typings/addon-serialize.d.ts @@ -5,7 +5,7 @@ import { Terminal, ITerminalAddon } from '@xterm/xterm'; -declare module 'xterm-addon-serialize' { +declare module '@xterm/addon-serialize' { /** * An xterm.js addon that enables serialization of terminal contents. */ diff --git a/addons/xterm-addon-serialize/webpack.config.js b/addons/addon-serialize/webpack.config.js similarity index 94% rename from addons/xterm-addon-serialize/webpack.config.js rename to addons/addon-serialize/webpack.config.js index fee297d8..bd08ca37 100644 --- a/addons/xterm-addon-serialize/webpack.config.js +++ b/addons/addon-serialize/webpack.config.js @@ -6,7 +6,7 @@ const path = require('path'); const addonName = 'SerializeAddon'; -const mainFile = 'xterm-addon-serialize.js'; +const mainFile = 'addon-serialize.js'; module.exports = { entry: `./out/${addonName}.js`, diff --git a/addons/xterm-addon-unicode-graphemes/.gitignore b/addons/addon-unicode-graphemes/.gitignore similarity index 100% rename from addons/xterm-addon-unicode-graphemes/.gitignore rename to addons/addon-unicode-graphemes/.gitignore diff --git a/addons/xterm-addon-unicode-graphemes/.npmignore b/addons/addon-unicode-graphemes/.npmignore similarity index 100% rename from addons/xterm-addon-unicode-graphemes/.npmignore rename to addons/addon-unicode-graphemes/.npmignore diff --git a/addons/xterm-addon-unicode-graphemes/LICENSE b/addons/addon-unicode-graphemes/LICENSE similarity index 100% rename from addons/xterm-addon-unicode-graphemes/LICENSE rename to addons/addon-unicode-graphemes/LICENSE diff --git a/addons/xterm-addon-unicode-graphemes/README.md b/addons/addon-unicode-graphemes/README.md similarity index 86% rename from addons/xterm-addon-unicode-graphemes/README.md rename to addons/addon-unicode-graphemes/README.md index 1f03e4e9..6e717c26 100644 --- a/addons/xterm-addon-unicode-graphemes/README.md +++ b/addons/addon-unicode-graphemes/README.md @@ -1,4 +1,4 @@ -## xterm-addon-unicode-graphemes +## @xterm/addon-unicode-graphemes ⚠️ **This addon is currently experimental and may introduce unexpected and non-standard behavior** @@ -14,7 +14,7 @@ This addon is not yet published to npm ```ts import { Terminal } from '@xterm/xterm'; -import { UnicodeGraphemesAddon } from 'xterm-addon-unicode-graphemes'; +import { UnicodeGraphemesAddon } from '@xterm/addon-unicode-graphemes'; const terminal = new Terminal(); const unicodeGraphemesAddon = new UnicodeGraphemesAddon(); diff --git a/addons/xterm-addon-unicode-graphemes/benchmark/UnicodeGraphemeAddon.benchmark.ts b/addons/addon-unicode-graphemes/benchmark/UnicodeGraphemeAddon.benchmark.ts similarity index 100% rename from addons/xterm-addon-unicode-graphemes/benchmark/UnicodeGraphemeAddon.benchmark.ts rename to addons/addon-unicode-graphemes/benchmark/UnicodeGraphemeAddon.benchmark.ts diff --git a/addons/xterm-addon-unicode-graphemes/benchmark/benchmark.json b/addons/addon-unicode-graphemes/benchmark/benchmark.json similarity index 100% rename from addons/xterm-addon-unicode-graphemes/benchmark/benchmark.json rename to addons/addon-unicode-graphemes/benchmark/benchmark.json diff --git a/addons/xterm-addon-unicode-graphemes/benchmark/tsconfig.json b/addons/addon-unicode-graphemes/benchmark/tsconfig.json similarity index 100% rename from addons/xterm-addon-unicode-graphemes/benchmark/tsconfig.json rename to addons/addon-unicode-graphemes/benchmark/tsconfig.json diff --git a/addons/xterm-addon-unicode-graphemes/package.json b/addons/addon-unicode-graphemes/package.json similarity index 84% rename from addons/xterm-addon-unicode-graphemes/package.json rename to addons/addon-unicode-graphemes/package.json index 38ea7271..5e270025 100644 --- a/addons/xterm-addon-unicode-graphemes/package.json +++ b/addons/addon-unicode-graphemes/package.json @@ -1,13 +1,13 @@ { - "name": "xterm-addon-unicode-graphemes", + "name": "@xterm/addon-unicode-graphemes", "version": "0.1.0", "author": { "name": "The xterm.js authors", "url": "https://xtermjs.org/" }, - "main": "lib/xterm-addon-unicode-graphemes.js", - "types": "typings/xterm-addon-unicode-graphemes.d.ts", - "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/xterm-addon-unicode-graphemes", + "main": "lib/addon-unicode-graphemes.js", + "types": "typings/addon-unicode-graphemes.d.ts", + "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-unicode-graphemes", "license": "MIT", "keywords": [ "terminal", diff --git a/addons/xterm-addon-unicode-graphemes/src/UnicodeGraphemeProvider.ts b/addons/addon-unicode-graphemes/src/UnicodeGraphemeProvider.ts similarity index 100% rename from addons/xterm-addon-unicode-graphemes/src/UnicodeGraphemeProvider.ts rename to addons/addon-unicode-graphemes/src/UnicodeGraphemeProvider.ts diff --git a/addons/xterm-addon-unicode-graphemes/src/UnicodeGraphemesAddon.ts b/addons/addon-unicode-graphemes/src/UnicodeGraphemesAddon.ts similarity index 100% rename from addons/xterm-addon-unicode-graphemes/src/UnicodeGraphemesAddon.ts rename to addons/addon-unicode-graphemes/src/UnicodeGraphemesAddon.ts diff --git a/addons/xterm-addon-unicode-graphemes/src/third-party/UnicodeProperties.ts b/addons/addon-unicode-graphemes/src/third-party/UnicodeProperties.ts similarity index 100% rename from addons/xterm-addon-unicode-graphemes/src/third-party/UnicodeProperties.ts rename to addons/addon-unicode-graphemes/src/third-party/UnicodeProperties.ts diff --git a/addons/xterm-addon-unicode-graphemes/src/third-party/tiny-inflate.ts b/addons/addon-unicode-graphemes/src/third-party/tiny-inflate.ts similarity index 100% rename from addons/xterm-addon-unicode-graphemes/src/third-party/tiny-inflate.ts rename to addons/addon-unicode-graphemes/src/third-party/tiny-inflate.ts diff --git a/addons/xterm-addon-unicode-graphemes/src/third-party/unicode-trie.ts b/addons/addon-unicode-graphemes/src/third-party/unicode-trie.ts similarity index 100% rename from addons/xterm-addon-unicode-graphemes/src/third-party/unicode-trie.ts rename to addons/addon-unicode-graphemes/src/third-party/unicode-trie.ts diff --git a/addons/xterm-addon-unicode-graphemes/src/tsconfig.json b/addons/addon-unicode-graphemes/src/tsconfig.json similarity index 100% rename from addons/xterm-addon-unicode-graphemes/src/tsconfig.json rename to addons/addon-unicode-graphemes/src/tsconfig.json diff --git a/addons/xterm-addon-unicode-graphemes/test/UnicodeGraphemesAddon.api.ts b/addons/addon-unicode-graphemes/test/UnicodeGraphemesAddon.api.ts similarity index 100% rename from addons/xterm-addon-unicode-graphemes/test/UnicodeGraphemesAddon.api.ts rename to addons/addon-unicode-graphemes/test/UnicodeGraphemesAddon.api.ts diff --git a/addons/xterm-addon-unicode-graphemes/test/tsconfig.json b/addons/addon-unicode-graphemes/test/tsconfig.json similarity index 100% rename from addons/xterm-addon-unicode-graphemes/test/tsconfig.json rename to addons/addon-unicode-graphemes/test/tsconfig.json diff --git a/addons/xterm-addon-unicode-graphemes/tsconfig.json b/addons/addon-unicode-graphemes/tsconfig.json similarity index 100% rename from addons/xterm-addon-unicode-graphemes/tsconfig.json rename to addons/addon-unicode-graphemes/tsconfig.json diff --git a/addons/xterm-addon-unicode-graphemes/typings/xterm-addon-unicode-graphemes.d.ts b/addons/addon-unicode-graphemes/typings/addon-unicode-graphemes.d.ts similarity index 86% rename from addons/xterm-addon-unicode-graphemes/typings/xterm-addon-unicode-graphemes.d.ts rename to addons/addon-unicode-graphemes/typings/addon-unicode-graphemes.d.ts index 3a6a9590..9443f1c8 100644 --- a/addons/xterm-addon-unicode-graphemes/typings/xterm-addon-unicode-graphemes.d.ts +++ b/addons/addon-unicode-graphemes/typings/addon-unicode-graphemes.d.ts @@ -5,7 +5,7 @@ import { Terminal, ITerminalAddon } from '@xterm/xterm'; -declare module 'xterm-addon-unicode-graphemes' { +declare module '@xterm/addon-unicode-graphemes' { export class UnicodeGraphemesAddon implements ITerminalAddon { constructor(); public activate(terminal: Terminal): void; diff --git a/addons/xterm-addon-unicode-graphemes/webpack.config.js b/addons/addon-unicode-graphemes/webpack.config.js similarity index 92% rename from addons/xterm-addon-unicode-graphemes/webpack.config.js rename to addons/addon-unicode-graphemes/webpack.config.js index 89abf53a..6a80bdea 100644 --- a/addons/xterm-addon-unicode-graphemes/webpack.config.js +++ b/addons/addon-unicode-graphemes/webpack.config.js @@ -6,7 +6,7 @@ const path = require('path'); const addonName = 'UnicodeGraphemesAddon'; -const mainFile = 'xterm-addon-unicode-graphemes.js'; +const mainFile = 'addon-unicode-graphemes.js'; module.exports = { entry: `./out/${addonName}.js`, diff --git a/addons/xterm-addon-unicode11/.gitignore b/addons/addon-unicode11/.gitignore similarity index 100% rename from addons/xterm-addon-unicode11/.gitignore rename to addons/addon-unicode11/.gitignore diff --git a/addons/xterm-addon-unicode11/.npmignore b/addons/addon-unicode11/.npmignore similarity index 100% rename from addons/xterm-addon-unicode11/.npmignore rename to addons/addon-unicode11/.npmignore diff --git a/addons/xterm-addon-unicode11/LICENSE b/addons/addon-unicode11/LICENSE similarity index 100% rename from addons/xterm-addon-unicode11/LICENSE rename to addons/addon-unicode11/LICENSE diff --git a/addons/xterm-addon-unicode11/README.md b/addons/addon-unicode11/README.md similarity index 72% rename from addons/xterm-addon-unicode11/README.md rename to addons/addon-unicode11/README.md index 52c2e0d9..ccfe77cf 100644 --- a/addons/xterm-addon-unicode11/README.md +++ b/addons/addon-unicode11/README.md @@ -1,18 +1,18 @@ -## xterm-addon-unicode11 +## @xterm/addon-unicode11 An addon providing Unicode version 11 rules for xterm.js. ### Install ```bash -npm install --save xterm-addon-unicode11 +npm install --save @xterm/addon-unicode11 ``` ### Usage ```ts import { Terminal } from '@xterm/xterm'; -import { Unicode11Addon } from 'xterm-addon-unicode11'; +import { Unicode11Addon } from '@xterm/addon-unicode11'; const terminal = new Terminal(); const unicode11Addon = new Unicode11Addon(); diff --git a/addons/xterm-addon-unicode11/package.json b/addons/addon-unicode11/package.json similarity index 76% rename from addons/xterm-addon-unicode11/package.json rename to addons/addon-unicode11/package.json index d187d8ed..b54f9ab4 100644 --- a/addons/xterm-addon-unicode11/package.json +++ b/addons/addon-unicode11/package.json @@ -1,13 +1,13 @@ { - "name": "xterm-addon-unicode11", + "name": "@xterm/addon-unicode11", "version": "0.6.0", "author": { "name": "The xterm.js authors", "url": "https://xtermjs.org/" }, - "main": "lib/xterm-addon-unicode11.js", - "types": "typings/xterm-addon-unicode11.d.ts", - "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/xterm-addon-unicode11", + "main": "lib/addon-unicode11.js", + "types": "typings/addon-unicode11.d.ts", + "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-unicode11", "license": "MIT", "keywords": [ "terminal", diff --git a/addons/xterm-addon-unicode11/src/Unicode11Addon.ts b/addons/addon-unicode11/src/Unicode11Addon.ts similarity index 100% rename from addons/xterm-addon-unicode11/src/Unicode11Addon.ts rename to addons/addon-unicode11/src/Unicode11Addon.ts diff --git a/addons/xterm-addon-unicode11/src/UnicodeV11.ts b/addons/addon-unicode11/src/UnicodeV11.ts similarity index 100% rename from addons/xterm-addon-unicode11/src/UnicodeV11.ts rename to addons/addon-unicode11/src/UnicodeV11.ts diff --git a/addons/xterm-addon-unicode11/src/tsconfig.json b/addons/addon-unicode11/src/tsconfig.json similarity index 100% rename from addons/xterm-addon-unicode11/src/tsconfig.json rename to addons/addon-unicode11/src/tsconfig.json diff --git a/addons/xterm-addon-unicode11/test/Unicode11Addon.api.ts b/addons/addon-unicode11/test/Unicode11Addon.api.ts similarity index 100% rename from addons/xterm-addon-unicode11/test/Unicode11Addon.api.ts rename to addons/addon-unicode11/test/Unicode11Addon.api.ts diff --git a/addons/xterm-addon-unicode11/test/tsconfig.json b/addons/addon-unicode11/test/tsconfig.json similarity index 100% rename from addons/xterm-addon-unicode11/test/tsconfig.json rename to addons/addon-unicode11/test/tsconfig.json diff --git a/addons/xterm-addon-unicode11/tsconfig.json b/addons/addon-unicode11/tsconfig.json similarity index 100% rename from addons/xterm-addon-unicode11/tsconfig.json rename to addons/addon-unicode11/tsconfig.json diff --git a/addons/xterm-addon-unicode11/typings/xterm-addon-unicode11.d.ts b/addons/addon-unicode11/typings/addon-unicode11.d.ts similarity index 87% rename from addons/xterm-addon-unicode11/typings/xterm-addon-unicode11.d.ts rename to addons/addon-unicode11/typings/addon-unicode11.d.ts index 2525dc23..74bd288d 100644 --- a/addons/xterm-addon-unicode11/typings/xterm-addon-unicode11.d.ts +++ b/addons/addon-unicode11/typings/addon-unicode11.d.ts @@ -5,7 +5,7 @@ import { Terminal, ITerminalAddon } from '@xterm/xterm'; -declare module 'xterm-addon-unicode11' { +declare module '@xterm/addon-unicode11' { export class Unicode11Addon implements ITerminalAddon { constructor(); public activate(terminal: Terminal): void; diff --git a/addons/xterm-addon-unicode11/webpack.config.js b/addons/addon-unicode11/webpack.config.js similarity index 94% rename from addons/xterm-addon-unicode11/webpack.config.js rename to addons/addon-unicode11/webpack.config.js index 10c0adc3..1913481d 100644 --- a/addons/xterm-addon-unicode11/webpack.config.js +++ b/addons/addon-unicode11/webpack.config.js @@ -6,7 +6,7 @@ const path = require('path'); const addonName = 'Unicode11Addon'; -const mainFile = 'xterm-addon-unicode11.js'; +const mainFile = 'addon-unicode11.js'; module.exports = { entry: `./out/${addonName}.js`, diff --git a/addons/xterm-addon-web-links/.gitignore b/addons/addon-web-links/.gitignore similarity index 100% rename from addons/xterm-addon-web-links/.gitignore rename to addons/addon-web-links/.gitignore diff --git a/addons/xterm-addon-web-links/.npmignore b/addons/addon-web-links/.npmignore similarity index 100% rename from addons/xterm-addon-web-links/.npmignore rename to addons/addon-web-links/.npmignore diff --git a/addons/xterm-addon-web-links/LICENSE b/addons/addon-web-links/LICENSE similarity index 100% rename from addons/xterm-addon-web-links/LICENSE rename to addons/addon-web-links/LICENSE diff --git a/addons/xterm-addon-web-links/README.md b/addons/addon-web-links/README.md similarity index 61% rename from addons/xterm-addon-web-links/README.md rename to addons/addon-web-links/README.md index 323c1f01..16dfa571 100644 --- a/addons/xterm-addon-web-links/README.md +++ b/addons/addon-web-links/README.md @@ -1,21 +1,21 @@ -## xterm-addon-web-links +## @xterm/addon-web-links An addon for [xterm.js](https://github.com/xtermjs/xterm.js) that enables web links. This addon requires xterm.js v4+. ### Install ```bash -npm install --save xterm-addon-web-links +npm install --save @xterm/addon-web-links ``` ### Usage ```ts import { Terminal } from '@xterm/xterm'; -import { WebLinksAddon } from 'xterm-addon-web-links'; +import { WebLinksAddon } from '@xterm/addon-web-links'; const terminal = new Terminal(); terminal.loadAddon(new WebLinksAddon()); ``` -See the full [API](https://github.com/xtermjs/xterm.js/blob/master/addons/xterm-addon-web-links/typings/xterm-addon-web-links.d.ts) for more advanced usage. +See the full [API](https://github.com/xtermjs/xterm.js/blob/master/addons/addon-web-links/typings/addon-web-links.d.ts) for more advanced usage. diff --git a/addons/xterm-addon-web-links/package.json b/addons/addon-web-links/package.json similarity index 76% rename from addons/xterm-addon-web-links/package.json rename to addons/addon-web-links/package.json index 783ee7e0..e1d60b02 100644 --- a/addons/xterm-addon-web-links/package.json +++ b/addons/addon-web-links/package.json @@ -1,13 +1,13 @@ { - "name": "xterm-addon-web-links", + "name": "@xterm/addon-web-links", "version": "0.9.0", "author": { "name": "The xterm.js authors", "url": "https://xtermjs.org/" }, - "main": "lib/xterm-addon-web-links.js", - "types": "typings/xterm-addon-web-links.d.ts", - "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/xterm-addon-web-links", + "main": "lib/addon-web-links.js", + "types": "typings/addon-web-links.d.ts", + "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-web-links", "license": "MIT", "keywords": [ "terminal", diff --git a/addons/xterm-addon-web-links/src/WebLinkProvider.ts b/addons/addon-web-links/src/WebLinkProvider.ts similarity index 100% rename from addons/xterm-addon-web-links/src/WebLinkProvider.ts rename to addons/addon-web-links/src/WebLinkProvider.ts diff --git a/addons/xterm-addon-web-links/src/WebLinksAddon.ts b/addons/addon-web-links/src/WebLinksAddon.ts similarity index 100% rename from addons/xterm-addon-web-links/src/WebLinksAddon.ts rename to addons/addon-web-links/src/WebLinksAddon.ts diff --git a/addons/xterm-addon-web-links/src/tsconfig.json b/addons/addon-web-links/src/tsconfig.json similarity index 100% rename from addons/xterm-addon-web-links/src/tsconfig.json rename to addons/addon-web-links/src/tsconfig.json diff --git a/addons/xterm-addon-web-links/test/WebLinksAddon.api.ts b/addons/addon-web-links/test/WebLinksAddon.api.ts similarity index 100% rename from addons/xterm-addon-web-links/test/WebLinksAddon.api.ts rename to addons/addon-web-links/test/WebLinksAddon.api.ts diff --git a/addons/xterm-addon-web-links/test/tsconfig.json b/addons/addon-web-links/test/tsconfig.json similarity index 100% rename from addons/xterm-addon-web-links/test/tsconfig.json rename to addons/addon-web-links/test/tsconfig.json diff --git a/addons/xterm-addon-web-links/tsconfig.json b/addons/addon-web-links/tsconfig.json similarity index 100% rename from addons/xterm-addon-web-links/tsconfig.json rename to addons/addon-web-links/tsconfig.json diff --git a/addons/xterm-addon-web-links/typings/xterm-addon-web-links.d.ts b/addons/addon-web-links/typings/addon-web-links.d.ts similarity index 97% rename from addons/xterm-addon-web-links/typings/xterm-addon-web-links.d.ts rename to addons/addon-web-links/typings/addon-web-links.d.ts index 11e6ffb2..4ae4934e 100644 --- a/addons/xterm-addon-web-links/typings/xterm-addon-web-links.d.ts +++ b/addons/addon-web-links/typings/addon-web-links.d.ts @@ -6,7 +6,7 @@ import { Terminal, ITerminalAddon, IViewportRange } from '@xterm/xterm'; -declare module 'xterm-addon-web-links' { +declare module '@xterm/addon-web-links' { /** * An xterm.js addon that enables web links. */ diff --git a/addons/xterm-addon-web-links/webpack.config.js b/addons/addon-web-links/webpack.config.js similarity index 92% rename from addons/xterm-addon-web-links/webpack.config.js rename to addons/addon-web-links/webpack.config.js index fd87d07e..4484dbf6 100644 --- a/addons/xterm-addon-web-links/webpack.config.js +++ b/addons/addon-web-links/webpack.config.js @@ -6,7 +6,7 @@ const path = require('path'); const addonName = 'WebLinksAddon'; -const mainFile = 'xterm-addon-web-links.js'; +const mainFile = 'addon-web-links.js'; module.exports = { entry: `./out/${addonName}.js`, diff --git a/addons/addon-webgl/README.md b/addons/addon-webgl/README.md index f944a17e..05d753e8 100644 --- a/addons/addon-webgl/README.md +++ b/addons/addon-webgl/README.md @@ -38,4 +38,4 @@ Read more about handling WebGL context losses on the [Khronos wiki](https://www. ### See also -- [xterm-addon-canvas](https://www.npmjs.com/package/xterm-addon-canvas) A renderer for xterm.js that uses a 2d canvas that can be used as a fallback when WebGL is not available +- [@xterm/addon-canvas](https://www.npmjs.com/package/@xterm/addon-canvas) A renderer for xterm.js that uses a 2d canvas that can be used as a fallback when WebGL is not available diff --git a/addons/xterm-addon-canvas/README.md b/addons/xterm-addon-canvas/README.md deleted file mode 100644 index 6d24c592..00000000 --- a/addons/xterm-addon-canvas/README.md +++ /dev/null @@ -1,28 +0,0 @@ -## xterm-addon-canvas - -An addon for [xterm.js](https://github.com/xtermjs/xterm.js) that enables a canvas-based renderer using a 2d context to draw. This addon requires xterm.js v5+. - -The purpose of this addon is to be used as a fallback for the [webgl addon](https://www.npmjs.com/package/xterm-addon-webgl) when better performance is desired over the default DOM renderer, but WebGL2 isn't supported or performant for some reason. - -### Install - -```bash -npm install --save xterm-addon-canvas -``` - -### Usage - -```ts -import { Terminal } from '@xterm/xterm'; -import { CanvasAddon } from 'xterm-addon-canvas'; - -const terminal = new Terminal(); -terminal.open(element); -terminal.loadAddon(new CanvasAddon()); -``` - -See the full [API](https://github.com/xtermjs/xterm.js/blob/master/addons/xterm-addon-canvas/typings/xterm-addon-canvas.d.ts) for more advanced usage. - -### See also - -- [xterm-addon-webgl](https://www.npmjs.com/package/xterm-addon-webgl) A renderer for xterm.js that uses WebGL diff --git a/bin/publish.js b/bin/publish.js index 1103797f..286e940d 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -27,15 +27,16 @@ if (changedFiles.some(e => e.search(/^addons\//) === -1)) { // Publish addons if any files were changed inside of the addon const addonPackageDirs = [ - // path.resolve(__dirname, '../addons/xterm-addon-attach'), - // path.resolve(__dirname, '../addons/xterm-addon-canvas'), - // path.resolve(__dirname, '../addons/xterm-addon-fit'), - // // path.resolve(__dirname, '../addons/xterm-addon-image'), - // path.resolve(__dirname, '../addons/xterm-addon-ligatures'), - // path.resolve(__dirname, '../addons/xterm-addon-search'), - // path.resolve(__dirname, '../addons/xterm-addon-serialize'), - // path.resolve(__dirname, '../addons/xterm-addon-unicode11'), - // path.resolve(__dirname, '../addons/xterm-addon-web-links'), + path.resolve(__dirname, '../addons/addon-attach'), + path.resolve(__dirname, '../addons/addon-canvas'), + path.resolve(__dirname, '../addons/addon-fit'), + // path.resolve(__dirname, '../addons/addon-image'), + path.resolve(__dirname, '../addons/addon-ligatures'), + path.resolve(__dirname, '../addons/addon-search'), + path.resolve(__dirname, '../addons/addon-serialize'), + path.resolve(__dirname, '../addons/addon-unicode11'), + // path.resolve(__dirname, '../addons/addon-unicode-graphemes'), + path.resolve(__dirname, '../addons/addon-web-links'), path.resolve(__dirname, '../addons/addon-webgl') ]; console.log(`Checking if addons need to be published`); diff --git a/bin/test_playwright.js b/bin/test_playwright.js index 12aa0cf0..0cd6f85c 100644 --- a/bin/test_playwright.js +++ b/bin/test_playwright.js @@ -19,7 +19,7 @@ while (argv.some(e => e.startsWith('--suite='))) { let configs = [ { name: 'core', path: 'out-test/playwright/playwright.config.js' }, - { name: 'xterm-addon-canvas', path: 'addons/xterm-addon-canvas/out-test/playwright.config.js' }, + { name: 'addon-canvas', path: 'addons/addon-canvas/out-test/playwright.config.js' }, { name: 'addon-webgl', path: 'addons/addon-webgl/out-test/playwright.config.js' } ]; diff --git a/demo/client.ts b/demo/client.ts index df169ffe..7e0830a5 100644 --- a/demo/client.ts +++ b/demo/client.ts @@ -10,37 +10,37 @@ // Use tsc version (yarn watch) import { Terminal } from '../out/browser/public/Terminal'; -import { AttachAddon } from '../addons/xterm-addon-attach/out/AttachAddon'; -import { CanvasAddon } from '../addons/xterm-addon-canvas/out/CanvasAddon'; -import { FitAddon } from '../addons/xterm-addon-fit/out/FitAddon'; -import { SearchAddon, ISearchOptions } from '../addons/xterm-addon-search/out/SearchAddon'; -import { SerializeAddon } from '../addons/xterm-addon-serialize/out/SerializeAddon'; -import { WebLinksAddon } from '../addons/xterm-addon-web-links/out/WebLinksAddon'; +import { AttachAddon } from '../addons/addon-attach/out/AttachAddon'; +import { CanvasAddon } from '../addons/addon-canvas/out/CanvasAddon'; +import { FitAddon } from '../addons/addon-fit/out/FitAddon'; +import { SearchAddon, ISearchOptions } from '../addons/addon-search/out/SearchAddon'; +import { SerializeAddon } from '../addons/addon-serialize/out/SerializeAddon'; +import { WebLinksAddon } from '../addons/addon-web-links/out/WebLinksAddon'; import { WebglAddon } from '../addons/addon-webgl/out/WebglAddon'; -import { Unicode11Addon } from '../addons/xterm-addon-unicode11/out/Unicode11Addon'; -import { UnicodeGraphemesAddon } from '../addons/xterm-addon-unicode-graphemes/out/UnicodeGraphemesAddon'; -import { LigaturesAddon } from '../addons/xterm-addon-ligatures/out/LigaturesAddon'; +import { Unicode11Addon } from '../addons/addon-unicode11/out/Unicode11Addon'; +import { UnicodeGraphemesAddon } from '../addons/addon-unicode-graphemes/out/UnicodeGraphemesAddon'; +import { LigaturesAddon } from '../addons/addon-ligatures/out/LigaturesAddon'; // Playwright/WebKit on Windows does not support WebAssembly https://stackoverflow.com/q/62311688/1156119 -import type { ImageAddonType, IImageAddonOptions } from '../addons/xterm-addon-image/out/ImageAddon'; +import type { ImageAddonType, IImageAddonOptions } from '../addons/addon-image/out/ImageAddon'; let ImageAddon: ImageAddonType | undefined; // eslint-disable-line @typescript-eslint/naming-convention if ('WebAssembly' in window) { - const imageAddon = require('../addons/xterm-addon-image/out/ImageAddon'); + const imageAddon = require('../addons/addon-image/out/ImageAddon'); ImageAddon = imageAddon.ImageAddon; } // Use webpacked version (yarn package) // import { Terminal } from '../lib/xterm'; -// import { AttachAddon } from 'xterm-addon-attach'; -// import { FitAddon } from 'xterm-addon-fit'; -// import { ImageAddon } from 'xterm-addon-image'; -// import { SearchAddon, ISearchOptions } from 'xterm-addon-search'; -// import { SerializeAddon } from 'xterm-addon-serialize'; -// import { WebLinksAddon } from 'xterm-addon-web-links'; -// import { WebglAddon } from '@xterm/addon-webgl'; -// import { Unicode11Addon } from 'xterm-addon-unicode11'; -// import { UnicodeGraphemesAddon } from 'xterm-addon-unicode-graphemes'; -// import { LigaturesAddon } from 'xterm-addon-ligatures'; +// import { AttachAddon } from '@xterm/addon-attach'; +// import { FitAddon } from '@xterm/addon-fit'; +// import { ImageAddon } from '@xterm/addon-image'; +// import { SearchAddon, ISearchOptions } from '@xterm/addon-search'; +// import { SerializeAddon } from '@xterm/addon-serialize'; +// import { WebLinksAddon } from '@xterm/addon-web-links'; +// import { WebglAddon } from '@@xterm/addon-webgl'; +// import { Unicode11Addon } from '@xterm/addon-unicode11'; +// import { UnicodeGraphemesAddon } from '@xterm/addon-unicode-graphemes'; +// import { LigaturesAddon } from '@xterm/addon-ligatures'; // Pulling in the module's types relies on the above, it's looks a // little weird here as we're importing "this" module diff --git a/demo/tsconfig.json b/demo/tsconfig.json index cd15a36d..f0aebb1f 100644 --- a/demo/tsconfig.json +++ b/demo/tsconfig.json @@ -6,12 +6,12 @@ "sourceMap": true, "baseUrl": ".", "paths": { - "xterm-addon-attach": ["../addons/xterm-addon-attach"], - "xterm-addon-fit": ["../addons/xterm-addon-fit"], - "xterm-addon-image": ["../addons/xterm-addon-image"], - "xterm-addon-search": ["../addons/xterm-addon-search"], - "xterm-addon-serialize": ["../addons/xterm-addon-serialize"], - "xterm-addon-web-links": ["../addons/xterm-addon-web-links"], + "addon-attach": ["../addons/addon-attach"], + "addon-fit": ["../addons/addon-fit"], + "addon-image": ["../addons/addon-image"], + "addon-search": ["../addons/addon-search"], + "addon-serialize": ["../addons/addon-serialize"], + "addon-web-links": ["../addons/addon-web-links"], "addon-webgl": ["../addons/addon-webgl"] } }, diff --git a/src/common/InputHandler.ts b/src/common/InputHandler.ts index b5c91bfb..a3b8fbec 100644 --- a/src/common/InputHandler.ts +++ b/src/common/InputHandler.ts @@ -49,7 +49,7 @@ const GLEVEL: { [key: string]: number } = { '(': 0, ')': 1, '*': 2, '+': 3, '-': /** * Document xterm VT features here that are currently unsupported */ -// @vt: #E[Supported via xterm-addon-image.] DCS SIXEL "SIXEL Graphics" "DCS Ps ; Ps ; Ps ; q Pt ST" "Draw SIXEL image." +// @vt: #E[Supported via @xterm/addon-image.] DCS SIXEL "SIXEL Graphics" "DCS Ps ; Ps ; Ps ; q Pt ST" "Draw SIXEL image." // @vt: #N DCS DECUDK "User Defined Keys" "DCS Ps ; Ps \| Pt ST" "Definitions for user-defined keys." // @vt: #N DCS XTGETTCAP "Request Terminfo String" "DCS + q Pt ST" "Request Terminfo String." // @vt: #N DCS XTSETTCAP "Set Terminfo Data" "DCS + p Pt ST" "Set Terminfo Data." diff --git a/tsconfig.all.json b/tsconfig.all.json index e3fc22cf..e2028479 100644 --- a/tsconfig.all.json +++ b/tsconfig.all.json @@ -7,16 +7,16 @@ { "path": "./test/api" }, { "path": "./test/benchmark" }, { "path": "./test/playwright" }, - { "path": "./addons/xterm-addon-attach" }, - { "path": "./addons/xterm-addon-canvas" }, - { "path": "./addons/xterm-addon-fit" }, - { "path": "./addons/xterm-addon-image" }, - { "path": "./addons/xterm-addon-ligatures" }, - { "path": "./addons/xterm-addon-search" }, - { "path": "./addons/xterm-addon-serialize" }, - { "path": "./addons/xterm-addon-unicode11" }, - { "path": "./addons/xterm-addon-unicode-graphemes" }, - { "path": "./addons/xterm-addon-web-links" }, + { "path": "./addons/addon-attach" }, + { "path": "./addons/addon-canvas" }, + { "path": "./addons/addon-fit" }, + { "path": "./addons/addon-image" }, + { "path": "./addons/addon-ligatures" }, + { "path": "./addons/addon-search" }, + { "path": "./addons/addon-serialize" }, + { "path": "./addons/addon-unicode11" }, + { "path": "./addons/addon-unicode-graphemes" }, + { "path": "./addons/addon-web-links" }, { "path": "./addons/addon-webgl" } ] } From b4b128709f2e367a5250b5a14d3d77d1d07208e8 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 10:37:20 -0700 Subject: [PATCH 55/73] Add other addons to the readme addon section --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 47ede986..7514e76c 100644 --- a/README.md +++ b/README.md @@ -77,9 +77,14 @@ terminal.loadAddon(new WebLinksAddon()); The xterm.js team maintains the following addons, but anyone can build them: - [`@xterm/addon-attach`](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-attach): Attaches to a server running a process via a websocket +- [`@xterm/addon-canvas`](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-canvas): Renders xterm.js using a `canvas` element's 2d context - [`@xterm/addon-fit`](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-fit): Fits the terminal to the containing element +- [`@xterm/addon-image`](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-image): Adds image support - [`@xterm/addon-search`](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-search): Adds search functionality +- [`@xterm/addon-serialize`](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-serialize): Serializes the terminal's buffer to a VT sequences or HTML +- [`@xterm/addon-unicode11`](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-unicode11): Updates character widths to their unicode11 values - [`@xterm/addon-web-links`](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-web-links): Adds web link detection and interaction +- [`@xterm/addon-webgl`](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-webgl): Renders xterm.js using a `canvas` element's webgl2 context ## Browser Support From d95f0177c8207180922f2eb768e0344b998d56a7 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 10:49:21 -0700 Subject: [PATCH 56/73] Add todo comments for uncomment publish script --- bin/publish.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bin/publish.js b/bin/publish.js index 286e940d..4d60342d 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -42,6 +42,7 @@ const addonPackageDirs = [ console.log(`Checking if addons need to be published`); for (const p of addonPackageDirs) { const addon = path.basename(p); + // TODO: Uncomment after first publish // if (changedFiles.some(e => e.includes(addon))) { console.log(`Try publish ${addon}`); checkAndPublishPackage(p); @@ -57,6 +58,7 @@ function checkAndPublishPackage(packageDir) { const packageJson = require(path.join(packageDir, 'package.json')); // Determine if this is a stable or beta release + // TODO: Uncomment after first publish // const publishedVersions = getPublishedVersions(packageJson); const isStableRelease = false; // !publishedVersions.includes(packageJson.version); From 71ec21616195c231049de83b3966d0a37d6ca4e6 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 11:06:30 -0700 Subject: [PATCH 57/73] Uncomment first publish special cases, add missing (at)xterm Part of #4859 --- addons/addon-canvas/package.json | 2 +- addons/addon-fit/package.json | 2 +- addons/addon-image/package.json | 2 +- addons/addon-ligatures/package.json | 2 +- addons/addon-search/package.json | 2 +- addons/addon-serialize/README.md | 2 +- addons/addon-serialize/package.json | 2 +- addons/addon-unicode-graphemes/package.json | 2 +- addons/addon-unicode11/package.json | 2 +- addons/addon-web-links/package.json | 2 +- addons/addon-webgl/package.json | 3 +-- bin/publish.js | 10 ++++------ 12 files changed, 15 insertions(+), 18 deletions(-) diff --git a/addons/addon-canvas/package.json b/addons/addon-canvas/package.json index a614c281..9aabb001 100644 --- a/addons/addon-canvas/package.json +++ b/addons/addon-canvas/package.json @@ -23,6 +23,6 @@ "start-server-only": "node ../../demo/start-server-only" }, "peerDependencies": { - "xterm": "^5.0.0" + "@xterm/xterm": "^5.0.0" } } diff --git a/addons/addon-fit/package.json b/addons/addon-fit/package.json index 046ef4d8..585f3621 100644 --- a/addons/addon-fit/package.json +++ b/addons/addon-fit/package.json @@ -21,6 +21,6 @@ "prepublishOnly": "npm run package" }, "peerDependencies": { - "xterm": "^5.0.0" + "@xterm/xterm": "^5.0.0" } } diff --git a/addons/addon-image/package.json b/addons/addon-image/package.json index 4b0f8cdc..8572e330 100644 --- a/addons/addon-image/package.json +++ b/addons/addon-image/package.json @@ -22,7 +22,7 @@ "prepublishOnly": "npm run package" }, "peerDependencies": { - "xterm": "^5.2.0" + "@xterm/xterm": "^5.2.0" }, "devDependencies": { "sixel": "^0.16.0", diff --git a/addons/addon-ligatures/package.json b/addons/addon-ligatures/package.json index c62f9e08..30251888 100644 --- a/addons/addon-ligatures/package.json +++ b/addons/addon-ligatures/package.json @@ -42,6 +42,6 @@ "yauzl": "^2.10.0" }, "peerDependencies": { - "xterm": "^5.0.0" + "@xterm/xterm": "^5.0.0" } } diff --git a/addons/addon-search/package.json b/addons/addon-search/package.json index 9fab82af..ae4fb5d9 100644 --- a/addons/addon-search/package.json +++ b/addons/addon-search/package.json @@ -21,6 +21,6 @@ "prepublishOnly": "npm run package" }, "peerDependencies": { - "xterm": "^5.0.0" + "@xterm/xterm": "^5.0.0" } } diff --git a/addons/addon-serialize/README.md b/addons/addon-serialize/README.md index f0116893..862ebac3 100644 --- a/addons/addon-serialize/README.md +++ b/addons/addon-serialize/README.md @@ -13,7 +13,7 @@ npm install --save @xterm/addon-serialize ### Usage ```ts -import { Terminal } from "xterm"; +import { Terminal } from "@xterm/xterm"; import { SerializeAddon } from "@xterm/addon-serialize"; const terminal = new Terminal(); diff --git a/addons/addon-serialize/package.json b/addons/addon-serialize/package.json index c95bc531..763c52ca 100644 --- a/addons/addon-serialize/package.json +++ b/addons/addon-serialize/package.json @@ -24,6 +24,6 @@ "benchmark-eval": "NODE_PATH=../../out:./out:./out-benchmark/ ../../node_modules/.bin/xterm-benchmark -r 5 -c benchmark/benchmark.json --eval out-benchmark/benchmark/*benchmark.js" }, "peerDependencies": { - "xterm": "^5.0.0" + "@xterm/xterm": "^5.0.0" } } diff --git a/addons/addon-unicode-graphemes/package.json b/addons/addon-unicode-graphemes/package.json index 5e270025..d49eda87 100644 --- a/addons/addon-unicode-graphemes/package.json +++ b/addons/addon-unicode-graphemes/package.json @@ -24,6 +24,6 @@ "benchmark-eval": "NODE_PATH=../../out:./out:./out-benchmark/ ../../node_modules/.bin/xterm-benchmark -r 5 -c benchmark/benchmark.json --eval out-benchmark/benchmark/*benchmark.js" }, "peerDependencies": { - "xterm": "^5.0.0" + "@xterm/xterm": "^5.0.0" } } diff --git a/addons/addon-unicode11/package.json b/addons/addon-unicode11/package.json index b54f9ab4..ad6a4892 100644 --- a/addons/addon-unicode11/package.json +++ b/addons/addon-unicode11/package.json @@ -21,6 +21,6 @@ "prepublishOnly": "npm run package" }, "peerDependencies": { - "xterm": "^5.0.0" + "@xterm/xterm": "^5.0.0" } } diff --git a/addons/addon-web-links/package.json b/addons/addon-web-links/package.json index e1d60b02..6367907a 100644 --- a/addons/addon-web-links/package.json +++ b/addons/addon-web-links/package.json @@ -21,7 +21,7 @@ "prepublishOnly": "npm run package" }, "peerDependencies": { - "xterm": "^5.0.0" + "@xterm/xterm": "^5.0.0" } } diff --git a/addons/addon-webgl/package.json b/addons/addon-webgl/package.json index f52f8b59..9a31c306 100644 --- a/addons/addon-webgl/package.json +++ b/addons/addon-webgl/package.json @@ -23,7 +23,6 @@ "start-server-only": "node ../../demo/start-server-only" }, "peerDependencies": { - "xterm": "^5.0.0" + "@xterm/xterm": "^5.0.0" } - } diff --git a/bin/publish.js b/bin/publish.js index 4d60342d..8394362a 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -42,11 +42,10 @@ const addonPackageDirs = [ console.log(`Checking if addons need to be published`); for (const p of addonPackageDirs) { const addon = path.basename(p); - // TODO: Uncomment after first publish - // if (changedFiles.some(e => e.includes(addon))) { + if (changedFiles.some(e => e.includes(addon))) { console.log(`Try publish ${addon}`); checkAndPublishPackage(p); - // } + } } // Publish website if it's a stable release @@ -58,9 +57,8 @@ function checkAndPublishPackage(packageDir) { const packageJson = require(path.join(packageDir, 'package.json')); // Determine if this is a stable or beta release - // TODO: Uncomment after first publish - // const publishedVersions = getPublishedVersions(packageJson); - const isStableRelease = false; // !publishedVersions.includes(packageJson.version); + const publishedVersions = getPublishedVersions(packageJson); + const isStableRelease = !publishedVersions.includes(packageJson.version); // Get the next version let nextVersion = isStableRelease ? packageJson.version : getNextBetaVersion(packageJson); From 64534e1b7a151d666b24d14acc42be19e18cd763 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 11:07:41 -0700 Subject: [PATCH 58/73] Fix missing peer dep --- addons/addon-attach/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/addon-attach/package.json b/addons/addon-attach/package.json index 8e5a413e..94b483dd 100644 --- a/addons/addon-attach/package.json +++ b/addons/addon-attach/package.json @@ -21,6 +21,6 @@ "prepublishOnly": "npm run package" }, "peerDependencies": { - "xterm": "^5.0.0" + "@xterm/xterm": "^5.0.0" } } From eac8124320f38edd6295d86044c41d2ab9eda74f Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 11:27:04 -0700 Subject: [PATCH 59/73] Fix stable release check --- bin/publish.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bin/publish.js b/bin/publish.js index 8394362a..a934ffe2 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -57,8 +57,9 @@ function checkAndPublishPackage(packageDir) { const packageJson = require(path.join(packageDir, 'package.json')); // Determine if this is a stable or beta release - const publishedVersions = getPublishedVersions(packageJson); - const isStableRelease = !publishedVersions.includes(packageJson.version); + // TODO: Uncomment when publishing 5.4 + // const publishedVersions = getPublishedVersions(packageJson); + const isStableRelease = false; //!publishedVersions.includes(packageJson.version); // Get the next version let nextVersion = isStableRelease ? packageJson.version : getNextBetaVersion(packageJson); From bbbde9261f2939ec05dc5c1c0d59b494016f3630 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 11:59:42 -0700 Subject: [PATCH 60/73] Fix parsing of low version count --- bin/publish.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/bin/publish.js b/bin/publish.js index a934ffe2..7253dffb 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -114,12 +114,20 @@ function getNextBetaVersion(packageJson) { return `${nextStableVersion}-${tag}.${latestTagVersion + 1}`; } +function asArray(value) { + return Array.isArray(value) ? value : [value]; +} + function getPublishedVersions(packageJson, version, tag) { - const versionsProcess = cp.spawnSync('npm', ['view', packageJson.name, 'versions', '--json']); - const versionsJson = JSON.parse(versionsProcess.stdout); - if (!versionsJson || !Array.isArray(versionsJson) || versionsJson.length === 0) { - return []; + const versionsProcess = cp.spawnSync(os.platform === 'win32' ? 'npm.cmd' : 'npm', ['view', packageJson.name, 'versions', '--json']); + if (versionsProcess.stdout.length === 0 && versionsProcess.stderr) { + const err = versionsProcess.stderr.toString(); + if (err.indexOf('404 Not Found - GET https://registry.npmjs.org/@xterm') > 0) { + return []; + } + throw new Error('Could not get published versions\n' + err); } + const versionsJson = asArray(JSON.parse(versionsProcess.stdout)); if (tag) { return versionsJson.filter(v => !v.search(new RegExp(`${version}-${tag}.[0-9]+`))); } From 1c522e16a4bbe047d6bd70a577498ec33a3ef368 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 12:13:19 -0700 Subject: [PATCH 61/73] Fix image addon build Fixes #4761 Fixes #4802 --- addons/addon-image/webpack.config.js | 8 ++++++++ bin/publish.js | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/addons/addon-image/webpack.config.js b/addons/addon-image/webpack.config.js index bcd52db2..b4283b66 100644 --- a/addons/addon-image/webpack.config.js +++ b/addons/addon-image/webpack.config.js @@ -21,6 +21,14 @@ const addon = { } ] }, + resolve: { + modules: ['./node_modules'], + extensions: [ '.js' ], + alias: { + common: path.resolve('../../out/common'), + browser: path.resolve('../../out/browser') + } + }, output: { filename: mainFile, path: path.resolve('./lib'), diff --git a/bin/publish.js b/bin/publish.js index 7253dffb..d6eab003 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -30,7 +30,7 @@ const addonPackageDirs = [ path.resolve(__dirname, '../addons/addon-attach'), path.resolve(__dirname, '../addons/addon-canvas'), path.resolve(__dirname, '../addons/addon-fit'), - // path.resolve(__dirname, '../addons/addon-image'), + path.resolve(__dirname, '../addons/addon-image'), path.resolve(__dirname, '../addons/addon-ligatures'), path.resolve(__dirname, '../addons/addon-search'), path.resolve(__dirname, '../addons/addon-serialize'), From 2744549c0fe1253970ae8b22173909620ba89517 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 12:35:25 -0700 Subject: [PATCH 62/73] Return [] if versionsJson is falsy --- bin/publish.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bin/publish.js b/bin/publish.js index d6eab003..75edd635 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -128,6 +128,9 @@ function getPublishedVersions(packageJson, version, tag) { throw new Error('Could not get published versions\n' + err); } const versionsJson = asArray(JSON.parse(versionsProcess.stdout)); + if (!versionsJson) { + return []; + } if (tag) { return versionsJson.filter(v => !v.search(new RegExp(`${version}-${tag}.[0-9]+`))); } From c8b2783b85b8ecc7c817eea85211af05684f29d4 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 13:01:20 -0700 Subject: [PATCH 63/73] Tweak parsing versions --- bin/publish.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bin/publish.js b/bin/publish.js index 75edd635..e4e840e9 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -127,10 +127,11 @@ function getPublishedVersions(packageJson, version, tag) { } throw new Error('Could not get published versions\n' + err); } - const versionsJson = asArray(JSON.parse(versionsProcess.stdout)); - if (!versionsJson) { + const output = JSON.parse(versionsProcess.stdout); + if (!output || Array.isArray(output) && output.length === 0) { return []; } + const versionsJson = asArray(output); if (tag) { return versionsJson.filter(v => !v.search(new RegExp(`${version}-${tag}.[0-9]+`))); } From 88b0b4a5c757b8f507bf4fcc7b35f1be6e2bba21 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 13:07:59 -0700 Subject: [PATCH 64/73] Log publish script --- bin/publish.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bin/publish.js b/bin/publish.js index e4e840e9..f88b1b36 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -131,7 +131,9 @@ function getPublishedVersions(packageJson, version, tag) { if (!output || Array.isArray(output) && output.length === 0) { return []; } + console.log('output', output); const versionsJson = asArray(output); + console.log('versionsJson', versionsJson); if (tag) { return versionsJson.filter(v => !v.search(new RegExp(`${version}-${tag}.[0-9]+`))); } From 31925596f105b74482e1d8514805daf513a7aa62 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 13:15:28 -0700 Subject: [PATCH 65/73] Log publish script --- bin/publish.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/bin/publish.js b/bin/publish.js index f88b1b36..836c81af 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -128,6 +128,12 @@ function getPublishedVersions(packageJson, version, tag) { throw new Error('Could not get published versions\n' + err); } const output = JSON.parse(versionsProcess.stdout); + if (typeof output === 'object') { + if (output.error?.code === 'E404') { + return []; + } + throw new Error('Could not get published versions\n' + output); + } if (!output || Array.isArray(output) && output.length === 0) { return []; } From 92eb78230b54adfb15a0bab1a3052368990f5520 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 13:47:39 -0700 Subject: [PATCH 66/73] Verify it's not an array --- bin/publish.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bin/publish.js b/bin/publish.js index 836c81af..2ac60280 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -9,7 +9,7 @@ const os = require('os'); const path = require('path'); // Setup auth -fs.writeFileSync(`${process.env['HOME']}/.npmrc`, `//registry.npmjs.org/:_authToken=${process.env['NPM_AUTH_TOKEN']}`); +// fs.writeFileSync(`${process.env['HOME']}/.npmrc`, `//registry.npmjs.org/:_authToken=${process.env['NPM_AUTH_TOKEN']}`); const isDryRun = process.argv.includes('--dry'); if (isDryRun) { @@ -128,7 +128,9 @@ function getPublishedVersions(packageJson, version, tag) { throw new Error('Could not get published versions\n' + err); } const output = JSON.parse(versionsProcess.stdout); - if (typeof output === 'object') { + console.log('output', output); + console.log('typeof output', typeof output); + if (typeof output === 'object' && !Array.isArray(output)) { if (output.error?.code === 'E404') { return []; } From fbc51ae691bc27c5811f5c20532b31b5a5bd0458 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 14:24:38 -0700 Subject: [PATCH 67/73] Remove logs --- bin/publish.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/bin/publish.js b/bin/publish.js index 2ac60280..a4a15f63 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -128,8 +128,6 @@ function getPublishedVersions(packageJson, version, tag) { throw new Error('Could not get published versions\n' + err); } const output = JSON.parse(versionsProcess.stdout); - console.log('output', output); - console.log('typeof output', typeof output); if (typeof output === 'object' && !Array.isArray(output)) { if (output.error?.code === 'E404') { return []; @@ -139,9 +137,7 @@ function getPublishedVersions(packageJson, version, tag) { if (!output || Array.isArray(output) && output.length === 0) { return []; } - console.log('output', output); const versionsJson = asArray(output); - console.log('versionsJson', versionsJson); if (tag) { return versionsJson.filter(v => !v.search(new RegExp(`${version}-${tag}.[0-9]+`))); } From 45e7efce67efa8b225230b1813934fb9e47bc143 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 1 Nov 2023 14:29:32 -0700 Subject: [PATCH 68/73] Re-enable auth --- bin/publish.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/publish.js b/bin/publish.js index a4a15f63..360e09fe 100644 --- a/bin/publish.js +++ b/bin/publish.js @@ -9,7 +9,7 @@ const os = require('os'); const path = require('path'); // Setup auth -// fs.writeFileSync(`${process.env['HOME']}/.npmrc`, `//registry.npmjs.org/:_authToken=${process.env['NPM_AUTH_TOKEN']}`); +fs.writeFileSync(`${process.env['HOME']}/.npmrc`, `//registry.npmjs.org/:_authToken=${process.env['NPM_AUTH_TOKEN']}`); const isDryRun = process.argv.includes('--dry'); if (isDryRun) { From 4c275a287f177b10adcb584f7ba55f2bd8a84ddf Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 2 Nov 2023 08:52:09 -0700 Subject: [PATCH 69/73] Fix paths in benchmark tsconfigs --- addons/addon-serialize/benchmark/tsconfig.json | 4 ++-- addons/addon-unicode-graphemes/benchmark/tsconfig.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/addon-serialize/benchmark/tsconfig.json b/addons/addon-serialize/benchmark/tsconfig.json index 82a50b73..1f6429f6 100644 --- a/addons/addon-serialize/benchmark/tsconfig.json +++ b/addons/addon-serialize/benchmark/tsconfig.json @@ -15,8 +15,8 @@ "common/*": ["../../../src/common/*"], "browser/*": ["../../../src/browser/*"], "SerializeAddon": ["../src/SerializeAddon"], - "xterm-addon-serialize": [ - "../typings/xterm-addon-serialize.d.ts" + "@xterm/addon-serialize": [ + "../typings/addon-serialize.d.ts" ] } }, diff --git a/addons/addon-unicode-graphemes/benchmark/tsconfig.json b/addons/addon-unicode-graphemes/benchmark/tsconfig.json index d42be1c8..c6f37a6c 100644 --- a/addons/addon-unicode-graphemes/benchmark/tsconfig.json +++ b/addons/addon-unicode-graphemes/benchmark/tsconfig.json @@ -12,8 +12,8 @@ "common/*": ["../../../src/common/*"], "browser/*": ["../../../src/browser/*"], "UnicodeGraphemeProvider": ["../src/UnicodeGraphemeProvider"], - "xterm-addon-unicode-graphemes": [ - "../typings/xterm-addon-unicode-graphemes.d.ts" + "@xterm/addon-unicode-graphemes": [ + "../typings/addon-unicode-graphemes.d.ts" ] } }, From 4beb7d0595ea56ef38620185a04e75e0f410937e Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 2 Nov 2023 08:54:49 -0700 Subject: [PATCH 70/73] Make addon api imports consistent --- addons/addon-attach/src/AttachAddon.ts | 4 ++-- addons/addon-canvas/src/CanvasAddon.ts | 4 ++-- addons/addon-fit/src/FitAddon.ts | 4 ++-- addons/addon-image/src/ImageAddon.ts | 4 ++-- addons/addon-ligatures/src/LigaturesAddon.ts | 4 ++-- addons/addon-search/src/SearchAddon.ts | 4 ++-- addons/addon-serialize/src/SerializeAddon.ts | 4 ++-- addons/addon-unicode-graphemes/src/UnicodeGraphemesAddon.ts | 6 +++--- addons/addon-unicode11/src/Unicode11Addon.ts | 4 ++-- addons/addon-web-links/src/WebLinksAddon.ts | 4 ++-- addons/addon-webgl/src/WebglAddon.ts | 4 ++-- 11 files changed, 23 insertions(+), 23 deletions(-) diff --git a/addons/addon-attach/src/AttachAddon.ts b/addons/addon-attach/src/AttachAddon.ts index dbd7fdf9..37a10d17 100644 --- a/addons/addon-attach/src/AttachAddon.ts +++ b/addons/addon-attach/src/AttachAddon.ts @@ -5,8 +5,8 @@ * Implements the attach method, that attaches the terminal to a WebSocket stream. */ -import { Terminal, IDisposable, ITerminalAddon } from '@xterm/xterm'; -import { AttachAddon as IAttachApi } from '@xterm/addon-attach'; +import type { Terminal, IDisposable, ITerminalAddon } from '@xterm/xterm'; +import type { AttachAddon as IAttachApi } from '@xterm/addon-attach'; interface IAttachOptions { bidirectional?: boolean; diff --git a/addons/addon-canvas/src/CanvasAddon.ts b/addons/addon-canvas/src/CanvasAddon.ts index 71d798ef..7f7f679b 100644 --- a/addons/addon-canvas/src/CanvasAddon.ts +++ b/addons/addon-canvas/src/CanvasAddon.ts @@ -3,15 +3,15 @@ * @license MIT */ +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 { Disposable, toDisposable } from 'common/Lifecycle'; import { setTraceLogger } from 'common/services/LogService'; import { IBufferService, IDecorationService, ILogService } from 'common/services/Services'; -import { ITerminalAddon, Terminal } from '@xterm/xterm'; import { CanvasRenderer } from './CanvasRenderer'; -import { CanvasAddon as ICanvasApi } from '@xterm/addon-canvas'; export class CanvasAddon extends Disposable implements ITerminalAddon , ICanvasApi { private _terminal?: Terminal; diff --git a/addons/addon-fit/src/FitAddon.ts b/addons/addon-fit/src/FitAddon.ts index a81db002..2087e614 100644 --- a/addons/addon-fit/src/FitAddon.ts +++ b/addons/addon-fit/src/FitAddon.ts @@ -3,9 +3,9 @@ * @license MIT */ -import { Terminal, ITerminalAddon } from '@xterm/xterm'; +import type { Terminal, ITerminalAddon } from '@xterm/xterm'; +import type { FitAddon as IFitApi } from '@xterm/addon-fit'; import { IRenderDimensions } from 'browser/renderer/shared/Types'; -import { FitAddon as IFitApi } from '@xterm/addon-fit'; interface ITerminalDimensions { /** diff --git a/addons/addon-image/src/ImageAddon.ts b/addons/addon-image/src/ImageAddon.ts index e241c256..167e93a7 100644 --- a/addons/addon-image/src/ImageAddon.ts +++ b/addons/addon-image/src/ImageAddon.ts @@ -3,13 +3,13 @@ * @license MIT */ +import type { ITerminalAddon, IDisposable } from '@xterm/xterm'; +import type { ImageAddon as IImageApi } from '@xterm/addon-image'; import { IIPHandler } from './IIPHandler'; -import { ITerminalAddon, IDisposable } from '@xterm/xterm'; import { ImageRenderer } from './ImageRenderer'; import { ImageStorage, CELL_SIZE_DEFAULT } from './ImageStorage'; import { SixelHandler } from './SixelHandler'; import { ITerminalExt, IImageAddonOptions, IResetHandler } from './Types'; -import { ImageAddon as IImageApi } from '@xterm/addon-image'; // default values of addon ctor options const DEFAULT_OPTIONS: IImageAddonOptions = { diff --git a/addons/addon-ligatures/src/LigaturesAddon.ts b/addons/addon-ligatures/src/LigaturesAddon.ts index fd2d33ab..cb589303 100644 --- a/addons/addon-ligatures/src/LigaturesAddon.ts +++ b/addons/addon-ligatures/src/LigaturesAddon.ts @@ -3,8 +3,8 @@ * @license MIT */ -import { Terminal } from '@xterm/xterm'; -import { LigaturesAddon as ILigaturesApi } from '@xterm/addon-ligatures'; +import type { Terminal } from '@xterm/xterm'; +import type { LigaturesAddon as ILigaturesApi } from '@xterm/addon-ligatures'; import { enableLigatures } from '.'; import { ILigatureOptions } from './Types'; diff --git a/addons/addon-search/src/SearchAddon.ts b/addons/addon-search/src/SearchAddon.ts index 6b401736..3fae7373 100644 --- a/addons/addon-search/src/SearchAddon.ts +++ b/addons/addon-search/src/SearchAddon.ts @@ -3,8 +3,8 @@ * @license MIT */ -import { Terminal, IDisposable, ITerminalAddon, IDecoration } from '@xterm/xterm'; -import { SearchAddon as ISearchApi } from '@xterm/addon-search'; +import type { Terminal, IDisposable, ITerminalAddon, IDecoration } from '@xterm/xterm'; +import type { SearchAddon as ISearchApi } from '@xterm/addon-search'; import { EventEmitter } from 'common/EventEmitter'; import { Disposable, toDisposable, disposeArray, MutableDisposable } from 'common/Lifecycle'; diff --git a/addons/addon-serialize/src/SerializeAddon.ts b/addons/addon-serialize/src/SerializeAddon.ts index f69cc6ad..090aebf0 100644 --- a/addons/addon-serialize/src/SerializeAddon.ts +++ b/addons/addon-serialize/src/SerializeAddon.ts @@ -5,8 +5,8 @@ * (EXPERIMENTAL) This Addon is still under development */ -import { IBuffer, IBufferCell, IBufferRange, ITerminalAddon, Terminal } from '@xterm/xterm'; -import { SerializeAddon as ISerializeApi } from '@xterm/addon-serialize'; +import type { IBuffer, IBufferCell, IBufferRange, ITerminalAddon, Terminal } from '@xterm/xterm'; +import type { SerializeAddon as ISerializeApi } from '@xterm/addon-serialize'; import { DEFAULT_ANSI_COLORS } from 'browser/services/ThemeService'; import { IAttributeData, IColor } from 'common/Types'; diff --git a/addons/addon-unicode-graphemes/src/UnicodeGraphemesAddon.ts b/addons/addon-unicode-graphemes/src/UnicodeGraphemesAddon.ts index 5ab1b70e..6e4d2266 100644 --- a/addons/addon-unicode-graphemes/src/UnicodeGraphemesAddon.ts +++ b/addons/addon-unicode-graphemes/src/UnicodeGraphemesAddon.ts @@ -5,11 +5,11 @@ * UnicodeVersionProvider for V15 with grapeme cluster handleing. */ -import { Terminal, ITerminalAddon, IUnicodeHandling } from '@xterm/xterm'; -import { UnicodeGraphemesAddon as PublicApi } from '@xterm/addon-unicode-graphemes'; +import type { Terminal, ITerminalAddon, IUnicodeHandling } from '@xterm/xterm'; +import type { UnicodeGraphemesAddon as IUnicodeGraphemesApi } from '@xterm/addon-unicode-graphemes'; import { UnicodeGraphemeProvider } from './UnicodeGraphemeProvider'; -export class UnicodeGraphemesAddon implements ITerminalAddon , PublicApi { +export class UnicodeGraphemesAddon implements ITerminalAddon , IUnicodeGraphemesApi { private _provider15Graphemes?: UnicodeGraphemeProvider; private _provider15?: UnicodeGraphemeProvider; private _unicode?: IUnicodeHandling; diff --git a/addons/addon-unicode11/src/Unicode11Addon.ts b/addons/addon-unicode11/src/Unicode11Addon.ts index 6be46bad..301145ee 100644 --- a/addons/addon-unicode11/src/Unicode11Addon.ts +++ b/addons/addon-unicode11/src/Unicode11Addon.ts @@ -5,8 +5,8 @@ * UnicodeVersionProvider for V11. */ -import { Terminal, ITerminalAddon } from '@xterm/xterm'; -import { Unicode11Addon as IUnicode11Api } from '@xterm/addon-unicode11'; +import type { Terminal, ITerminalAddon } from '@xterm/xterm'; +import type { Unicode11Addon as IUnicode11Api } from '@xterm/addon-unicode11'; import { UnicodeV11 } from './UnicodeV11'; export class Unicode11Addon implements ITerminalAddon , IUnicode11Api { diff --git a/addons/addon-web-links/src/WebLinksAddon.ts b/addons/addon-web-links/src/WebLinksAddon.ts index 26c5c3e2..8902d8e0 100644 --- a/addons/addon-web-links/src/WebLinksAddon.ts +++ b/addons/addon-web-links/src/WebLinksAddon.ts @@ -3,8 +3,8 @@ * @license MIT */ -import { Terminal, ITerminalAddon, IDisposable } from '@xterm/xterm'; -import { WebLinksAddon as IWebLinksApi } from '@xterm/addon-web-links'; +import type { Terminal, ITerminalAddon, IDisposable } from '@xterm/xterm'; +import type { WebLinksAddon as IWebLinksApi } from '@xterm/addon-web-links'; import { ILinkProviderOptions, WebLinkProvider } from './WebLinkProvider'; // consider everthing starting with http:// or https:// diff --git a/addons/addon-webgl/src/WebglAddon.ts b/addons/addon-webgl/src/WebglAddon.ts index 9937592e..16b1e444 100644 --- a/addons/addon-webgl/src/WebglAddon.ts +++ b/addons/addon-webgl/src/WebglAddon.ts @@ -3,14 +3,14 @@ * @license MIT */ +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 { Disposable, toDisposable } from 'common/Lifecycle'; import { getSafariVersion, isSafari } from 'common/Platform'; import { ICoreService, IDecorationService, ILogService, IOptionsService } from 'common/services/Services'; -import { ITerminalAddon, Terminal } from '@xterm/xterm'; -import { WebglAddon as IWebglApi } from '@xterm/addon-webgl'; import { WebglRenderer } from './WebglRenderer'; import { setTraceLogger } from 'common/services/LogService'; From 6214f4c2e67cb588fb2a1104ed06d0cb3000dfee Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 2 Nov 2023 10:43:56 -0700 Subject: [PATCH 71/73] Varinat -> Variant --- addons/addon-image/src/ImageStorage.ts | 4 ++-- .../renderer/shared/RendererUtils.test.ts | 22 +++++++++---------- src/browser/renderer/shared/RendererUtils.ts | 2 +- src/browser/renderer/shared/TextureAtlas.ts | 6 ++--- src/common/Types.d.ts | 4 ++-- src/common/buffer/AttributeData.ts | 8 +++---- src/common/buffer/BufferLine.test.ts | 8 +++---- 7 files changed, 27 insertions(+), 27 deletions(-) diff --git a/addons/addon-image/src/ImageStorage.ts b/addons/addon-image/src/ImageStorage.ts index 39de0959..f9b6eef6 100644 --- a/addons/addon-image/src/ImageStorage.ts +++ b/addons/addon-image/src/ImageStorage.ts @@ -53,14 +53,14 @@ class ExtendedAttrsImage implements IExtendedAttrsImage { this._ext |= value & (Attributes.CM_MASK | Attributes.RGB_MASK); } - public get underlineVarinatOffset(): number { + public get underlineVariantOffset(): number { const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29; if (val < 0) { return val ^ 0xFFFFFFF8; } return val; } - public set underlineVarinatOffset(value: number) { + public set underlineVariantOffset(value: number) { this._ext &= ~ExtFlags.VARIANT_OFFSET; this._ext |= (value << 29) & ExtFlags.VARIANT_OFFSET; } diff --git a/src/browser/renderer/shared/RendererUtils.test.ts b/src/browser/renderer/shared/RendererUtils.test.ts index e7e49c1d..a050e8a9 100644 --- a/src/browser/renderer/shared/RendererUtils.test.ts +++ b/src/browser/renderer/shared/RendererUtils.test.ts @@ -3,15 +3,15 @@ * @license MIT */ -import { computeNextVarinatOffset } from 'browser/renderer/shared/RendererUtils'; +import { computeNextVariantOffset } from 'browser/renderer/shared/RendererUtils'; import { assert } from 'chai'; describe('RendererUtils', () => { - it('computeNextVarinatOffset', () => { + it('computeNextVariantOffset', () => { const cellWidth = 11; const doubleCellWidth = 22; let line = 1; - let varinatOffset = 0; + let variantOffset = 0; // should line 1 // =,_,=_,=_, @@ -19,32 +19,32 @@ describe('RendererUtils', () => { let result = [1, 0, 0, 0]; for (let index = 0; index < cells.length; index++) { const cell = cells[index]; - varinatOffset = computeNextVarinatOffset(cell, line, varinatOffset); - assert.equal(varinatOffset, result[index]); + variantOffset = computeNextVariantOffset(cell, line, variantOffset); + assert.equal(variantOffset, result[index]); } // should line 2 // ==__==__==_,_==__==__==,__==__==__==__==__==__,==__==__==__==__==__==, line = 2; - varinatOffset = 0; + variantOffset = 0; cells = [cellWidth, cellWidth, doubleCellWidth, doubleCellWidth]; result = [3, 2, 0 ,2]; for (let index = 0; index < cells.length; index++) { const cell = cells[index]; - varinatOffset = computeNextVarinatOffset(cell, line, varinatOffset); - assert.equal(varinatOffset, result[index]); + variantOffset = computeNextVariantOffset(cell, line, variantOffset); + assert.equal(variantOffset, result[index]); } // should line 3 // ===___===__,_===___===_,__===___===___===___==,=___===___===___===___, line = 3; - varinatOffset = 0; + variantOffset = 0; cells = [cellWidth, cellWidth, doubleCellWidth, doubleCellWidth]; result = [5, 4, 2, 0]; for (let index = 0; index < cells.length; index++) { const cell = cells[index]; - varinatOffset = computeNextVarinatOffset(cell, line, varinatOffset); - assert.equal(varinatOffset, result[index]); + variantOffset = computeNextVariantOffset(cell, line, variantOffset); + assert.equal(variantOffset, result[index]); } }); }); diff --git a/src/browser/renderer/shared/RendererUtils.ts b/src/browser/renderer/shared/RendererUtils.ts index b60fd011..59b87b0e 100644 --- a/src/browser/renderer/shared/RendererUtils.ts +++ b/src/browser/renderer/shared/RendererUtils.ts @@ -57,6 +57,6 @@ function createDimension(): IDimensions { }; } -export function computeNextVarinatOffset(cellWidth: number, lineWidth: number, currentOffset: number = 0): number { +export function computeNextVariantOffset(cellWidth: number, lineWidth: number, currentOffset: number = 0): number { return (cellWidth - (Math.round(lineWidth) * 2 - currentOffset)) % (Math.round(lineWidth) * 2); } diff --git a/src/browser/renderer/shared/TextureAtlas.ts b/src/browser/renderer/shared/TextureAtlas.ts index 66501255..d7f65d00 100644 --- a/src/browser/renderer/shared/TextureAtlas.ts +++ b/src/browser/renderer/shared/TextureAtlas.ts @@ -6,7 +6,7 @@ import { IColorContrastCache } from 'browser/Types'; import { DIM_OPACITY, TEXT_BASELINE } from 'browser/renderer/shared/Constants'; import { tryDrawCustomChar } from 'browser/renderer/shared/CustomGlyphs'; -import { computeNextVarinatOffset, excludeFromContrastRatioDemands, isPowerlineGlyph, isRestrictedPowerlineGlyph, throwIfFalsy } from 'browser/renderer/shared/RendererUtils'; +import { computeNextVariantOffset, excludeFromContrastRatioDemands, isPowerlineGlyph, isRestrictedPowerlineGlyph, throwIfFalsy } from 'browser/renderer/shared/RendererUtils'; import { IBoundingBox, ICharAtlasConfig, IRasterizedGlyph, ITextureAtlas } from 'browser/renderer/shared/Types'; import { NULL_COLOR, color, rgba } from 'common/Color'; import { EventEmitter } from 'common/EventEmitter'; @@ -545,7 +545,7 @@ export class TextureAtlas implements ITextureAtlas { const yTop = Math.ceil(padding + this._config.deviceCharHeight) - yOffset - (restrictToCellHeight ? lineWidth * 2 : 0); const yMid = yTop + lineWidth; const yBot = yTop + lineWidth * 2; - let nextOffset = this._workAttributeData.getUnderlineVarinatOffset(); + let nextOffset = this._workAttributeData.getUnderlineVariantOffset(); for (let i = 0; i < chWidth; i++) { this._tmpCtx.save(); @@ -610,7 +610,7 @@ export class TextureAtlas implements ITextureAtlas { this._tmpCtx.moveTo(xChLeft + offsetWidth + lineWidth, yTop); this._tmpCtx.lineTo(xChRight, yTop); } - nextOffset = computeNextVarinatOffset(xChRight - xChLeft, lineWidth, nextOffset); + nextOffset = computeNextVariantOffset(xChRight - xChLeft, lineWidth, nextOffset); break; case UnderlineStyle.DASHED: this._tmpCtx.setLineDash([this._config.devicePixelRatio * 4, this._config.devicePixelRatio * 3]); diff --git a/src/common/Types.d.ts b/src/common/Types.d.ts index 3e6476a3..bbe1c741 100644 --- a/src/common/Types.d.ts +++ b/src/common/Types.d.ts @@ -119,7 +119,7 @@ export interface IExtendedAttrs { ext: number; underlineStyle: UnderlineStyle; underlineColor: number; - underlineVarinatOffset: number; + underlineVariantOffset: number; urlId: number; clone(): IExtendedAttrs; isEmpty(): boolean; @@ -210,7 +210,7 @@ export interface IAttributeData { isUnderlineColorPalette(): boolean; isUnderlineColorDefault(): boolean; getUnderlineStyle(): number; - getUnderlineVarinatOffset(): number; + getUnderlineVariantOffset(): number; } /** Cell data */ diff --git a/src/common/buffer/AttributeData.ts b/src/common/buffer/AttributeData.ts index acc8a8c2..6221fb81 100644 --- a/src/common/buffer/AttributeData.ts +++ b/src/common/buffer/AttributeData.ts @@ -126,8 +126,8 @@ export class AttributeData implements IAttributeData { ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE) : UnderlineStyle.NONE; } - public getUnderlineVarinatOffset(): number { - return this.extended.underlineVarinatOffset; + public getUnderlineVariantOffset(): number { + return this.extended.underlineVariantOffset; } } @@ -177,14 +177,14 @@ export class ExtendedAttrs implements IExtendedAttrs { this._urlId = value; } - public get underlineVarinatOffset(): number { + public get underlineVariantOffset(): number { const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29; if (val < 0) { return val ^ 0xFFFFFFF8; } return val; } - public set underlineVarinatOffset(value: number) { + public set underlineVariantOffset(value: number) { this._ext &= ~ExtFlags.VARIANT_OFFSET; this._ext |= (value << 29) & ExtFlags.VARIANT_OFFSET; } diff --git a/src/common/buffer/BufferLine.test.ts b/src/common/buffer/BufferLine.test.ts index b8684b82..8b9ec63e 100644 --- a/src/common/buffer/BufferLine.test.ts +++ b/src/common/buffer/BufferLine.test.ts @@ -119,16 +119,16 @@ describe('AttributeData', () => { attrs.fg &= ~FgFlags.UNDERLINE; assert.equal(attrs.getUnderlineStyle(), UnderlineStyle.NONE); }); - it('getUnderlineVarinatOffset', () => { + it('getUnderlineVariantOffset', () => { const attrs = new AttributeData(); // defaults to no offset - assert.equal(attrs.getUnderlineVarinatOffset(), 0); + assert.equal(attrs.getUnderlineVariantOffset(), 0); // should return 0 - 7 for (let i = 0; i < 8; ++i) { - attrs.extended.underlineVarinatOffset = i; - assert.equal(attrs.getUnderlineVarinatOffset(), i); + attrs.extended.underlineVariantOffset = i; + assert.equal(attrs.getUnderlineVariantOffset(), i); } }); }); From 2f074b87f335014aa7c639a2cf9a7703a3d1899d Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 2 Nov 2023 10:45:46 -0700 Subject: [PATCH 72/73] Explain VARIANT_OFFSET --- src/common/buffer/Constants.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/common/buffer/Constants.ts b/src/common/buffer/Constants.ts index 3bfd850a..5ce075cf 100644 --- a/src/common/buffer/Constants.ts +++ b/src/common/buffer/Constants.ts @@ -140,6 +140,9 @@ export const enum ExtFlags { /** * bit 30..32 + * + * An optional variant for the glyph, this can be used for example to offset underlines by a + * number of pixels to create a perfect pattern. */ VARIANT_OFFSET = 0xE0000000 } From b16724f06a13d85ebb47c0b6f5e2a1786ef7107a Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 3 Nov 2023 08:53:53 -0700 Subject: [PATCH 73/73] Improve docs of BufferLine.translateToString --- src/common/buffer/BufferLine.ts | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/common/buffer/BufferLine.ts b/src/common/buffer/BufferLine.ts index 9a583277..ee3481a2 100644 --- a/src/common/buffer/BufferLine.ts +++ b/src/common/buffer/BufferLine.ts @@ -509,14 +509,17 @@ export class BufferLine implements IBufferLine { } /** - * If outColumns is specified, it will be filled with column numbers such that - * returnedString[i] is display at outColumns[i] column. - * outColumns[returnedString.length] is where the character following - * returnedString will be displayed. + * Translates the buffer line to a string. * - * When a single cell is translated to multiple UTF-16 code units (e.g. - * surrogate pair) in the returned string, the corresponding entries in - * outColumns will have the same column number. + * @param trimRight Whether to trim any empty cells on the right. + * @param startCol The column to start the string (0-based inclusive). + * @param endCol The column to end the string (0-based exclusive). + * @param outColumns if specified, this array will be filled with column numbers such that + * `returnedString[i]` is displayed at `outColumns[i]` column. `outColumns[returnedString.length]` + * is where the character following `returnedString` will be displayed. + * + * When a single cell is translated to multiple UTF-16 code units (e.g. surrogate pair) in the + * returned string, the corresponding entries in `outColumns` will have the same column number. */ public translateToString(trimRight?: boolean, startCol?: number, endCol?: number, outColumns?: number[]): string { startCol = startCol ?? 0;