diff --git a/addons/xterm-addon-search/src/SearchAddon.ts b/addons/xterm-addon-search/src/SearchAddon.ts index 0fb08056..7d1b145c 100644 --- a/addons/xterm-addon-search/src/SearchAddon.ts +++ b/addons/xterm-addon-search/src/SearchAddon.ts @@ -128,7 +128,7 @@ export class SearchAddon implements ITerminalAddon { } this._lastSearchOptions = searchOptions; if (searchOptions?.decorations) { - if (this._resultIndex || this._cachedSearchTerm && term !== this._cachedSearchTerm) { + if (this._resultIndex !== undefined || this._cachedSearchTerm && term !== this._cachedSearchTerm) { this._highlightAllMatches(term, searchOptions); } } @@ -306,7 +306,7 @@ export class SearchAddon implements ITerminalAddon { throw new Error('Cannot use addon until it has been loaded'); } this._lastSearchOptions = searchOptions; - if (searchOptions?.decorations && (this._resultIndex || term !== this._cachedSearchTerm)) { + if (searchOptions?.decorations && (this._resultIndex !== undefined || term !== this._cachedSearchTerm)) { this._highlightAllMatches(term, searchOptions); } return this._fireResults(term, this._findPreviousAndSelect(term, searchOptions), searchOptions); @@ -694,7 +694,6 @@ export class SearchAddon implements ITerminalAddon { * @param element the decoration's element * @param backgroundColor the background color to apply * @param borderColor the border color to apply - * @param result the search result associated with the decoration * @returns */ private _applyStyles(element: HTMLElement, borderColor: string | undefined): void { @@ -712,7 +711,7 @@ export class SearchAddon implements ITerminalAddon { /** * Creates a decoration for the result and applies styles * @param result the search result for which to create the decoration - * @param color the color to use for the decoration + * @param options the options for the decoration * @returns the {@link IDecoration} or undefined if the marker has already been disposed of */ private _createResultDecoration(result: ISearchResult, options: ISearchDecorationOptions): IDecoration | undefined { diff --git a/src/browser/Decorations/BufferDecorationRenderer.ts b/src/browser/Decorations/BufferDecorationRenderer.ts index 22dc73e9..dbe30187 100644 --- a/src/browser/Decorations/BufferDecorationRenderer.ts +++ b/src/browser/Decorations/BufferDecorationRenderer.ts @@ -60,17 +60,7 @@ export class BufferDecorationRenderer extends Disposable { } private _renderDecoration(decoration: IInternalDecoration): void { - let element = this._decorationElements.get(decoration); - if (!element) { - element = this._createElement(decoration); - decoration.onDispose(() => this._removeDecoration(decoration)); - decoration.marker.onDispose(() => decoration.dispose()); - decoration.element = element; - this._decorationElements.set(decoration, element); - this._container.appendChild(element); - } - this._refreshStyle(decoration, element); - decoration.onRenderEmitter.fire(element); + this._refreshStyle(decoration); } private _createElement(decoration: IInternalDecoration): HTMLElement { @@ -95,14 +85,26 @@ export class BufferDecorationRenderer extends Disposable { return element; } - private _refreshStyle(decoration: IInternalDecoration, element: HTMLElement): void { + private _refreshStyle(decoration: IInternalDecoration): void { const line = decoration.marker.line - this._bufferService.buffers.active.ydisp; if (line < 0 || line >= this._bufferService.rows) { // outside of viewport - element.style.display = 'none'; + if (decoration.element) { + decoration.element.style.display = 'none'; + decoration.onRenderEmitter.fire(decoration.element); + } } else { + let element = this._decorationElements.get(decoration); + if (!element) { + decoration.onDispose(() => this._removeDecoration(decoration)); + element = this._createElement(decoration); + decoration.element = element; + this._decorationElements.set(decoration, element); + this._container.appendChild(element); + } element.style.top = `${line * this._renderService.dimensions.actualCellHeight}px`; element.style.display = this._altBufferIsActive ? 'none' : 'block'; + decoration.onRenderEmitter.fire(element); } } diff --git a/src/common/services/DecorationService.ts b/src/common/services/DecorationService.ts index fb7373bf..00ea3236 100644 --- a/src/common/services/DecorationService.ts +++ b/src/common/services/DecorationService.ts @@ -32,6 +32,7 @@ export class DecorationService extends Disposable implements IDecorationService } const decoration = new Decoration(options); if (decoration) { + const markerDispose = decoration.marker.onDispose(() => decoration.dispose()); decoration.onDispose(() => { if (decoration) { const index = this._decorations.indexOf(decoration); @@ -39,6 +40,7 @@ export class DecorationService extends Disposable implements IDecorationService this._decorations.splice(this._decorations.indexOf(decoration), 1); this._onDecorationRemoved.fire(decoration); } + markerDispose.dispose(); } }); this._decorations.push(decoration);