From b39d24505010c99977e257ba9f3a0c780145b6dd Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 3 Feb 2022 08:32:24 -0800 Subject: [PATCH 1/2] Log parsing data string when using buffers --- src/common/InputHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/InputHandler.ts b/src/common/InputHandler.ts index 68660f88..88634048 100644 --- a/src/common/InputHandler.ts +++ b/src/common/InputHandler.ts @@ -546,7 +546,7 @@ export class InputHandler extends Disposable implements IInputHandler { // Log debug data, the log level gate is to prevent extra work in this hot path if (this._logService.logLevel <= LogLevelEnum.DEBUG) { - this._logService.debug(`parsing data${typeof data === 'string' ? ` "${data}"` : ''}`, typeof data === 'string' + this._logService.debug(`parsing data${typeof data === 'string' ? ` "${data}"` : ` "${Array.prototype.map.call(data, e => String.fromCharCode(e)).join('')}"`}`, typeof data === 'string' ? data.split('').map(e => e.charCodeAt(0)) : data ); From fea1079b1ec91b2406ea73a3cbda0e940436bf73 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Thu, 3 Feb 2022 08:33:22 -0800 Subject: [PATCH 2/2] Force clear of the glyph renderer when switching Fixes #3617 --- addons/xterm-addon-webgl/src/GlyphRenderer.ts | 43 +++++++++++-------- addons/xterm-addon-webgl/src/WebglRenderer.ts | 2 + src/browser/services/RenderService.ts | 3 +- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/addons/xterm-addon-webgl/src/GlyphRenderer.ts b/addons/xterm-addon-webgl/src/GlyphRenderer.ts index 71b3659e..e2c37be2 100644 --- a/addons/xterm-addon-webgl/src/GlyphRenderer.ts +++ b/addons/xterm-addon-webgl/src/GlyphRenderer.ts @@ -299,32 +299,37 @@ export class GlyphRenderer { return this._colors.ansi[idx]; } - public onResize(): void { + public clear(force?: boolean): void { const terminal = this._terminal; - const gl = this._gl; - - gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); - - // Update vertices const newCount = terminal.cols * terminal.rows * INDICES_PER_CELL; - if (this._vertices.count !== newCount) { - this._vertices.count = newCount; - this._vertices.attributes = new Float32Array(newCount); - for (let i = 0; i < this._vertices.attributesBuffers.length; i++) { - this._vertices.attributesBuffers[i] = new Float32Array(newCount); - } - let i = 0; - for (let y = 0; y < terminal.rows; y++) { - for (let x = 0; x < terminal.cols; x++) { - this._vertices.attributes[i + 8] = x / terminal.cols; - this._vertices.attributes[i + 9] = y / terminal.rows; - i += INDICES_PER_CELL; - } + // Don't clear if not forced and the array length is correct + if (!force && this._vertices.count === newCount) { + return; + } + + // Clear vertices + this._vertices.count = newCount; + this._vertices.attributes = new Float32Array(newCount); + for (let i = 0; i < this._vertices.attributesBuffers.length; i++) { + this._vertices.attributesBuffers[i] = new Float32Array(newCount); + } + let i = 0; + for (let y = 0; y < terminal.rows; y++) { + for (let x = 0; x < terminal.cols; x++) { + this._vertices.attributes[i + 8] = x / terminal.cols; + this._vertices.attributes[i + 9] = y / terminal.rows; + i += INDICES_PER_CELL; } } } + public onResize(): void { + const gl = this._gl; + gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); + this.clear(); + } + public setColors(): void { } diff --git a/addons/xterm-addon-webgl/src/WebglRenderer.ts b/addons/xterm-addon-webgl/src/WebglRenderer.ts index af1591a8..24e55fed 100644 --- a/addons/xterm-addon-webgl/src/WebglRenderer.ts +++ b/addons/xterm-addon-webgl/src/WebglRenderer.ts @@ -247,6 +247,8 @@ export class WebglRenderer extends Disposable implements IRenderer { } public clear(): void { + this._model.clear(); + this._glyphRenderer.clear(true); for (const l of this._renderLayers) { l.reset(this._terminal); } diff --git a/src/browser/services/RenderService.ts b/src/browser/services/RenderService.ts index b8283e0e..da458abc 100644 --- a/src/browser/services/RenderService.ts +++ b/src/browser/services/RenderService.ts @@ -65,7 +65,8 @@ export class RenderService extends Disposable implements IRenderService { this._screenDprMonitor.setListener(() => this.onDevicePixelRatioChange()); this.register(this._screenDprMonitor); - this.register(bufferService.onResize(e => this._fullRefresh())); + this.register(bufferService.onResize(() => this._fullRefresh())); + this.register(bufferService.buffers.onBufferActivate(() => this._renderer?.clear())); this.register(optionsService.onOptionChange(() => this._renderer.onOptionsChanged())); this.register(this._charSizeService.onCharSizeChange(() => this.onCharSizeChanged()));