diff --git a/addons/xterm-addon-webgl/src/WebglRenderer.ts b/addons/xterm-addon-webgl/src/WebglRenderer.ts index 9d8bde79..af1591a8 100644 --- a/addons/xterm-addon-webgl/src/WebglRenderer.ts +++ b/addons/xterm-addon-webgl/src/WebglRenderer.ts @@ -60,7 +60,7 @@ export class WebglRenderer extends Disposable implements IRenderer { this._renderLayers = [ new LinkRenderLayer(this._core.screenElement!, 2, this._colors, this._core), - new CursorRenderLayer(this._core.screenElement!, 3, this._colors, this._core, this._onRequestRedraw) + new CursorRenderLayer(_terminal, this._core.screenElement!, 3, this._colors, this._core, this._onRequestRedraw) ]; this.dimensions = { scaledCharWidth: 0, diff --git a/addons/xterm-addon-webgl/src/renderLayer/CursorRenderLayer.ts b/addons/xterm-addon-webgl/src/renderLayer/CursorRenderLayer.ts index 912c23c9..4199b7e1 100644 --- a/addons/xterm-addon-webgl/src/renderLayer/CursorRenderLayer.ts +++ b/addons/xterm-addon-webgl/src/renderLayer/CursorRenderLayer.ts @@ -31,6 +31,7 @@ export class CursorRenderLayer extends BaseRenderLayer { private _cell: ICellData = new CellData(); constructor( + terminal: Terminal, container: HTMLElement, zIndex: number, colors: IColorSet, @@ -50,7 +51,7 @@ export class CursorRenderLayer extends BaseRenderLayer { 'block': this._renderBlockCursor.bind(this), 'underline': this._renderUnderlineCursor.bind(this) }; - // TODO: Consider initial options? Maybe onOptionsChanged should be called at the end of open? + this.onOptionsChanged(terminal); } public resize(terminal: Terminal, dim: IRenderDimensions): void { @@ -67,25 +68,18 @@ export class CursorRenderLayer extends BaseRenderLayer { public reset(terminal: Terminal): void { this._clearCursor(); - if (this._cursorBlinkStateManager) { - this._cursorBlinkStateManager.dispose(); - this.onOptionsChanged(terminal); - } + this._cursorBlinkStateManager?.restartBlinkAnimation(terminal); + this.onOptionsChanged(terminal); } public onBlur(terminal: Terminal): void { - if (this._cursorBlinkStateManager) { - this._cursorBlinkStateManager.pause(); - } + this._cursorBlinkStateManager?.pause(); this._onRequestRefreshRowsEvent.fire({ start: terminal.buffer.active.cursorY, end: terminal.buffer.active.cursorY }); } public onFocus(terminal: Terminal): void { - if (this._cursorBlinkStateManager) { - this._cursorBlinkStateManager.resume(terminal); - } else { - this._onRequestRefreshRowsEvent.fire({ start: terminal.buffer.active.cursorY, end: terminal.buffer.active.cursorY }); - } + this._cursorBlinkStateManager?.resume(terminal); + this._onRequestRefreshRowsEvent.fire({ start: terminal.buffer.active.cursorY, end: terminal.buffer.active.cursorY }); } public onOptionsChanged(terminal: Terminal): void { @@ -105,9 +99,7 @@ export class CursorRenderLayer extends BaseRenderLayer { } public onCursorMove(terminal: Terminal): void { - if (this._cursorBlinkStateManager) { - this._cursorBlinkStateManager.restartBlinkAnimation(terminal); - } + this._cursorBlinkStateManager?.restartBlinkAnimation(terminal); } public onGridChanged(terminal: Terminal, startRow: number, endRow: number): void { @@ -302,6 +294,7 @@ class CursorBlinkStateManager { // Clear any existing interval if (this._blinkInterval) { window.clearInterval(this._blinkInterval); + this._blinkInterval = undefined; } // Setup the initial timeout which will hide the cursor, this is done before diff --git a/src/browser/renderer/CursorRenderLayer.ts b/src/browser/renderer/CursorRenderLayer.ts index 65109a80..c267f476 100644 --- a/src/browser/renderer/CursorRenderLayer.ts +++ b/src/browser/renderer/CursorRenderLayer.ts @@ -55,7 +55,6 @@ export class CursorRenderLayer extends BaseRenderLayer { 'block': this._renderBlockCursor.bind(this), 'underline': this._renderUnderlineCursor.bind(this) }; - // TODO: Consider initial options? Maybe onOptionsChanged should be called at the end of open? } public dispose(): void { @@ -80,26 +79,18 @@ export class CursorRenderLayer extends BaseRenderLayer { public reset(): void { this._clearCursor(); - if (this._cursorBlinkStateManager) { - this._cursorBlinkStateManager.dispose(); - this._cursorBlinkStateManager = undefined; - this.onOptionsChanged(); - } + this._cursorBlinkStateManager?.restartBlinkAnimation(); + this.onOptionsChanged(); } public onBlur(): void { - if (this._cursorBlinkStateManager) { - this._cursorBlinkStateManager.pause(); - } + this._cursorBlinkStateManager?.pause(); this._onRequestRedraw.fire({ start: this._bufferService.buffer.y, end: this._bufferService.buffer.y }); } public onFocus(): void { - if (this._cursorBlinkStateManager) { - this._cursorBlinkStateManager.resume(); - } else { - this._onRequestRedraw.fire({ start: this._bufferService.buffer.y, end: this._bufferService.buffer.y }); - } + this._cursorBlinkStateManager?.resume(); + this._onRequestRedraw.fire({ start: this._bufferService.buffer.y, end: this._bufferService.buffer.y }); } public onOptionsChanged(): void { @@ -119,9 +110,7 @@ export class CursorRenderLayer extends BaseRenderLayer { } public onCursorMove(): void { - if (this._cursorBlinkStateManager) { - this._cursorBlinkStateManager.restartBlinkAnimation(); - } + this._cursorBlinkStateManager?.restartBlinkAnimation(); } public onGridChanged(startRow: number, endRow: number): void { @@ -313,6 +302,7 @@ class CursorBlinkStateManager { // Clear any existing interval if (this._blinkInterval) { window.clearInterval(this._blinkInterval); + this._blinkInterval = undefined; } // Setup the initial timeout which will hide the cursor, this is done before