升级xterm相关npm包: 1.add xterm-addon-canvas; 2.update xterm,xterm-addon-search,xterm-addon-serialize,xterm-addon-unicode11,xterm-addon-webgl,xterm-headless. 3.xterm开启webgl使用gpuAcceleration模式有问题,改为默认使用canvas模式.

This commit is contained in:
wangpenglong 2023-10-20 17:14:33 +08:00 committed by chriswang521
parent 0fd9b24158
commit 8a3cd1c3a0
19 changed files with 249 additions and 132 deletions

View File

@ -256,6 +256,7 @@
"windows-process-tree",
"worker_threads",
"xterm",
"xterm-addon-canvas",
"xterm-addon-search",
"xterm-addon-serialize",
"xterm-addon-unicode11",

View File

@ -20,6 +20,9 @@ vscode-textmate/webpack.config.js
xterm/src/**
xterm-addon-canvas/src/**
xterm-addon-canvas/out/**
xterm-addon-search/src/**
xterm-addon-search/out/**
xterm-addon-search/fixtures/**

View File

@ -86,12 +86,13 @@
"vscode-proxy-agent": "^0.12.0",
"vscode-regexpp": "^3.1.0",
"vscode-textmate": "7.0.1",
"xterm": "4.19.0-beta.58",
"xterm-addon-search": "0.9.0-beta.39",
"xterm-addon-serialize": "0.7.0-beta.12",
"xterm-addon-unicode11": "0.4.0-beta.3",
"xterm-addon-webgl": "0.12.0-beta.37",
"xterm-headless": "4.19.0-beta.58",
"xterm": "5.4.0-beta.27",
"xterm-addon-canvas": "0.6.0-beta.27",
"xterm-addon-search": "0.14.0-beta.27",
"xterm-addon-serialize": "0.12.0-beta.26",
"xterm-addon-unicode11": "0.7.0-beta.26",
"xterm-addon-webgl": "0.17.0-beta.26",
"xterm-headless": "5.4.0-beta.27",
"yauzl": "^2.9.2",
"yazl": "^2.4.3"
},

View File

@ -24,12 +24,13 @@
"vscode-proxy-agent": "^0.12.0",
"vscode-regexpp": "^3.1.0",
"vscode-textmate": "7.0.1",
"xterm": "4.19.0-beta.58",
"xterm-addon-search": "0.9.0-beta.39",
"xterm-addon-serialize": "0.7.0-beta.12",
"xterm-addon-unicode11": "0.4.0-beta.3",
"xterm-addon-webgl": "0.12.0-beta.37",
"xterm-headless": "4.19.0-beta.58",
"xterm": "5.1.0-beta.46",
"xterm-addon-canvas": "0.3.0-beta.22",
"xterm-addon-search": "0.11.0-beta.7",
"xterm-addon-serialize": "0.9.0-beta.3",
"xterm-addon-unicode11": "0.5.0-beta.1",
"xterm-addon-webgl": "0.14.0-beta.31",
"xterm-headless": "5.1.0-beta.46",
"yauzl": "^2.9.2",
"yazl": "^2.4.3"
},

View File

@ -10,9 +10,10 @@
"tas-client-umd": "0.1.6",
"vscode-oniguruma": "1.6.1",
"vscode-textmate": "7.0.1",
"xterm": "4.19.0-beta.58",
"xterm-addon-search": "0.9.0-beta.39",
"xterm-addon-unicode11": "0.4.0-beta.3",
"xterm-addon-webgl": "0.12.0-beta.37"
"xterm": "5.1.0-beta.46",
"xterm-addon-canvas": "0.3.0-beta.22",
"xterm-addon-search": "0.11.0-beta.7",
"xterm-addon-unicode11": "0.5.0-beta.1",
"xterm-addon-webgl": "0.14.0-beta.31"
}
}

View File

@ -113,22 +113,27 @@ vscode-textmate@7.0.1:
resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-7.0.1.tgz#8118a32b02735dccd14f893b495fa5389ad7de79"
integrity sha512-zQ5U/nuXAAMsh691FtV0wPz89nSkHbs+IQV8FDk+wew9BlSDhf4UmWGlWJfTR2Ti6xZv87Tj5fENzKf6Qk7aLw==
xterm-addon-search@0.9.0-beta.39:
version "0.9.0-beta.39"
resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.9.0-beta.39.tgz#e8376e1485ee7d763c07d1a8f1354114f65b3e3e"
integrity sha512-h45wkecgfqXXoAUqgNytAfSd6g0xNT6rZy/enVaEU0aes7QoL9pxHUKkCry8PP6hs03Slk0VxQ4AGsbSZGvK/w==
xterm-addon-canvas@0.3.0-beta.22:
version "0.3.0-beta.22"
resolved "https://registry.yarnpkg.com/xterm-addon-canvas/-/xterm-addon-canvas-0.3.0-beta.22.tgz#8b145ad01a5e27b7b1d20eebed9929f9c9f51830"
integrity sha512-4F+XVbxlnyq8OGcdEoM+hz2B6+wdOSEdckNRgq9RRNgnk7YF/Gp0MhWN3orJUT/JqWJFemxVl2Giil8yTRqqEQ==
xterm-addon-unicode11@0.4.0-beta.3:
version "0.4.0-beta.3"
resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.3.tgz#f350184155fafd5ad0d6fbf31d13e6ca7dea1efa"
integrity sha512-FryZAVwbUjKTmwXnm1trch/2XO60F5JsDvOkZhzobV1hm10sFLVuZpFyHXiUx7TFeeFsvNP+S77LAtWoeT5z+Q==
xterm-addon-search@0.11.0-beta.7:
version "0.11.0-beta.7"
resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.11.0-beta.7.tgz#d90bcbe9e8f9238c18ba6145bd7ec2f8e3240052"
integrity sha512-i/c774V0/Eon3BIFRsRR3OjKTnMGkccBo12yDkOa40tnAD4aa8FjspE3bxW/Hh1mUEhCSgBSLnMDlK/GwnUC+g==
xterm-addon-webgl@0.12.0-beta.37:
version "0.12.0-beta.37"
resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.37.tgz#e465100041a7e0b1d32b01cd0b0ba5a516ac13c2"
integrity sha512-d4GfKlMrWZGzsMfMHd2siG+QiOvwikhwiu+JQlIhlnAShT/wU5BOGbNfDDA1tHmkW7G1UCFgucBuVxrs5wjuBQ==
xterm-addon-unicode11@0.5.0-beta.1:
version "0.5.0-beta.1"
resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.5.0-beta.1.tgz#8a9e9356018e082318abbe2be1f9599fcc6b46a2"
integrity sha512-uAErX4gwhW6N524stLG6oZR3yBGgPnFmZ2Tv4vyYy7tcgDuHRoc22xYSCDgO1ohz1FLlOm8JGXRjXliwO9ic3A==
xterm@4.19.0-beta.58:
version "4.19.0-beta.58"
resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.58.tgz#cbe535b0b85bc7f8ae3cc242df006bea04cdf541"
integrity sha512-fr3QC2qS2NBab8X7kwA/3QZELzQqhAKsngvK8NkhsrFN1DAuyEETkzqXuKbO7OKpCB6VqGDN6GPkNlUB9VrIDA==
xterm-addon-webgl@0.14.0-beta.31:
version "0.14.0-beta.31"
resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.14.0-beta.31.tgz#91c96efaf70bd9e6d3903202f81f5fbd0c3805aa"
integrity sha512-9jmGrkTXJzi4kmqd3pw9wOAS8MxmcuSmOxclmRr4GivYWe/Y/mapdGZtt4HAxEneZFjXMwZSMruOi72QX6QqPg==
xterm@5.1.0-beta.46:
version "5.1.0-beta.46"
resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.1.0-beta.46.tgz#76716e8ac88a4111781dee5108f5affa572cb4ab"
integrity sha512-4i9CzOWbDwQZVLJB3teNqw5PtB/BEB1N3t6T886M0N1IW0WXqIy3r4gXpmxWP+4cNuj4R4tFq+yeCTTJ3rHnFg==

View File

@ -919,35 +919,40 @@ wrappy@1:
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
xterm-addon-search@0.9.0-beta.39:
version "0.9.0-beta.39"
resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.9.0-beta.39.tgz#e8376e1485ee7d763c07d1a8f1354114f65b3e3e"
integrity sha512-h45wkecgfqXXoAUqgNytAfSd6g0xNT6rZy/enVaEU0aes7QoL9pxHUKkCry8PP6hs03Slk0VxQ4AGsbSZGvK/w==
xterm-addon-canvas@0.3.0-beta.22:
version "0.3.0-beta.22"
resolved "https://registry.yarnpkg.com/xterm-addon-canvas/-/xterm-addon-canvas-0.3.0-beta.22.tgz#8b145ad01a5e27b7b1d20eebed9929f9c9f51830"
integrity sha512-4F+XVbxlnyq8OGcdEoM+hz2B6+wdOSEdckNRgq9RRNgnk7YF/Gp0MhWN3orJUT/JqWJFemxVl2Giil8yTRqqEQ==
xterm-addon-serialize@0.7.0-beta.12:
version "0.7.0-beta.12"
resolved "https://registry.yarnpkg.com/xterm-addon-serialize/-/xterm-addon-serialize-0.7.0-beta.12.tgz#4f845d8b1a9f9b7ae3f910455ce8c58b041babc7"
integrity sha512-b4Ug0B/RSJMux+KAcp+PXVqubVyXjN1yCQw1FOkgVYTpmd9AH/X+EcxKml5Lz8DsKmsXqfD9AlV3WpEeT+OtMw==
xterm-addon-search@0.11.0-beta.7:
version "0.11.0-beta.7"
resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.11.0-beta.7.tgz#d90bcbe9e8f9238c18ba6145bd7ec2f8e3240052"
integrity sha512-i/c774V0/Eon3BIFRsRR3OjKTnMGkccBo12yDkOa40tnAD4aa8FjspE3bxW/Hh1mUEhCSgBSLnMDlK/GwnUC+g==
xterm-addon-unicode11@0.4.0-beta.3:
version "0.4.0-beta.3"
resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.3.tgz#f350184155fafd5ad0d6fbf31d13e6ca7dea1efa"
integrity sha512-FryZAVwbUjKTmwXnm1trch/2XO60F5JsDvOkZhzobV1hm10sFLVuZpFyHXiUx7TFeeFsvNP+S77LAtWoeT5z+Q==
xterm-addon-serialize@0.9.0-beta.3:
version "0.9.0-beta.3"
resolved "https://registry.yarnpkg.com/xterm-addon-serialize/-/xterm-addon-serialize-0.9.0-beta.3.tgz#bb4ed416db5748bcbe55a4b6d4c2151368fdae74"
integrity sha512-LaFuowtdxNdeuLm+KmtsoR4mgPOLu/I9k0hlWXbzAd1okJhthwMH4Y6cuL0/pFk1AclP5s+L42glv8PV0GnVsg==
xterm-addon-webgl@0.12.0-beta.37:
version "0.12.0-beta.37"
resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.37.tgz#e465100041a7e0b1d32b01cd0b0ba5a516ac13c2"
integrity sha512-d4GfKlMrWZGzsMfMHd2siG+QiOvwikhwiu+JQlIhlnAShT/wU5BOGbNfDDA1tHmkW7G1UCFgucBuVxrs5wjuBQ==
xterm-addon-unicode11@0.5.0-beta.1:
version "0.5.0-beta.1"
resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.5.0-beta.1.tgz#8a9e9356018e082318abbe2be1f9599fcc6b46a2"
integrity sha512-uAErX4gwhW6N524stLG6oZR3yBGgPnFmZ2Tv4vyYy7tcgDuHRoc22xYSCDgO1ohz1FLlOm8JGXRjXliwO9ic3A==
xterm-headless@4.19.0-beta.58:
version "4.19.0-beta.58"
resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.19.0-beta.58.tgz#3a38cf3b9cd2606fb342a5cf8f2a0cfb963a62e8"
integrity sha512-wKQW8VzkFjyYDvcaM26gulo+YghyocfkZnKMH7gc/+/mFn3YXUPBPuOcX6e0M7NibyMlewpQpZjHQUPLBjkzfw==
xterm-addon-webgl@0.14.0-beta.31:
version "0.14.0-beta.31"
resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.14.0-beta.31.tgz#91c96efaf70bd9e6d3903202f81f5fbd0c3805aa"
integrity sha512-9jmGrkTXJzi4kmqd3pw9wOAS8MxmcuSmOxclmRr4GivYWe/Y/mapdGZtt4HAxEneZFjXMwZSMruOi72QX6QqPg==
xterm@4.19.0-beta.58:
version "4.19.0-beta.58"
resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.58.tgz#cbe535b0b85bc7f8ae3cc242df006bea04cdf541"
integrity sha512-fr3QC2qS2NBab8X7kwA/3QZELzQqhAKsngvK8NkhsrFN1DAuyEETkzqXuKbO7OKpCB6VqGDN6GPkNlUB9VrIDA==
xterm-headless@5.1.0-beta.46:
version "5.1.0-beta.46"
resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-5.1.0-beta.46.tgz#dd1c0f99dec1224eca7e67428f47ceb54394dda5"
integrity sha512-BXA79FsGDZcrSgikeluzl0CWLP3pcUj5fo1WfUVphOc1LHdpKkNhIHG8UVmC5QJjfH7wb0XUWUFyz0rWZmA5yA==
xterm@5.1.0-beta.46:
version "5.1.0-beta.46"
resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.1.0-beta.46.tgz#76716e8ac88a4111781dee5108f5affa572cb4ab"
integrity sha512-4i9CzOWbDwQZVLJB3teNqw5PtB/BEB1N3t6T886M0N1IW0WXqIy3r4gXpmxWP+4cNuj4R4tFq+yeCTTJ3rHnFg==
yallist@^4.0.0:
version "4.0.0"

View File

@ -8,6 +8,7 @@ const path = require('path');
const moduleNames = [
'xterm',
'xterm-addon-canvas',
'xterm-addon-search',
'xterm-addon-unicode11',
'xterm-addon-webgl'

View File

@ -136,6 +136,7 @@
'vscode-textmate': `${baseNodeModulesPath}/vscode-textmate/release/main.js`,
'vscode-oniguruma': `${baseNodeModulesPath}/vscode-oniguruma/release/main.js`,
'xterm': `${baseNodeModulesPath}/xterm/lib/xterm.js`,
'xterm-addon-canvas': `${baseNodeModulesPath}/xterm-addon-canvas/lib/xterm-addon-canvas.js`,
'xterm-addon-search': `${baseNodeModulesPath}/xterm-addon-search/lib/xterm-addon-search.js`,
'xterm-addon-unicode11': `${baseNodeModulesPath}/xterm-addon-unicode11/lib/xterm-addon-unicode11.js`,
'xterm-addon-webgl': `${baseNodeModulesPath}/xterm-addon-webgl/lib/xterm-addon-webgl.js`,
@ -150,7 +151,7 @@
// which has a fallback to using node.js `require`
// (node.js enabled renderers only)
if (!safeProcess.sandboxed) {
loaderConfig.amdModulesPattern = /(^vs\/)|(^vscode-textmate$)|(^vscode-oniguruma$)|(^xterm$)|(^xterm-addon-search$)|(^xterm-addon-unicode11$)|(^xterm-addon-webgl$)|(^@vscode\/iconv-lite-umd$)|(^jschardet$)|(^@vscode\/vscode-languagedetection$)|(^vscode-regexp-languagedetection$)|(^tas-client-umd$)/;
loaderConfig.amdModulesPattern = /(^vs\/)|(^vscode-textmate$)|(^vscode-oniguruma$)|(^xterm$)|(^xterm-addon-canvas$)|(^xterm-addon-search$)|(^xterm-addon-unicode11$)|(^xterm-addon-webgl$)|(^@vscode\/iconv-lite-umd$)|(^jschardet$)|(^@vscode\/vscode-languagedetection$)|(^vscode-regexp-languagedetection$)|(^tas-client-umd$)/;
}
// Signal before require.config()

View File

@ -737,8 +737,14 @@ class XtermSerializer implements ITerminalSerializer {
reviveBuffer: string | undefined,
logService: ILogService
) {
this._xterm = new XtermTerminal({ cols, rows, scrollback });
this._xterm = new XtermTerminal({
cols,
rows,
scrollback,
allowProposedApi: true
});
if (reviveBuffer) {
// console.log('wpl reviveBuffer:' + reviveBuffer);
this._xterm.writeln(reviveBuffer);
}
this.setUnicodeVersion(unicodeVersion);
@ -747,6 +753,7 @@ class XtermSerializer implements ITerminalSerializer {
}
handleData(data: string): void {
// console.log('wpl handleData:' + data);
this._xterm.write(data);
}
@ -757,7 +764,7 @@ class XtermSerializer implements ITerminalSerializer {
async generateReplayEvent(normalBufferOnly?: boolean): Promise<IPtyHostProcessReplayEvent> {
const serialize = new (await this._getSerializeConstructor());
this._xterm.loadAddon(serialize);
const options: ISerializeOptions = { scrollback: this._xterm.getOption('scrollback') };
const options: ISerializeOptions = { scrollback: this._xterm.options.scrollback };
if (normalBufferOnly) {
options.excludeAltBuffer = true;
options.excludeModes = true;

View File

@ -202,8 +202,8 @@ export class TerminalLinkManager extends DisposableStore {
const core = (this._xterm as any)._core as IXtermCore;
const cellDimensions = {
width: core._renderService.dimensions.actualCellWidth,
height: core._renderService.dimensions.actualCellHeight
width: core._renderService.dimensions.css.cell.width,
height: core._renderService.dimensions.css.cell.height
};
const terminalDimensions = {
width: this._xterm.cols,

View File

@ -5,9 +5,9 @@
import { KeyCode, KeyMod } from 'vs/base/common/keyCodes';
import 'vs/css!./media/scrollbar';
import 'vs/css!./media/terminal';
import 'vs/css!./media/widgets';
import 'vs/css!./media/xterm';
import 'vs/css!./media/terminal';
import * as nls from 'vs/nls';
import { URI } from 'vs/base/common/uri';
import { CommandsRegistry } from 'vs/platform/commands/common/commands';

View File

@ -138,10 +138,10 @@ export class TerminalConfigHelper implements IBrowserTerminalConfigHelper {
if (this.config.gpuAcceleration === 'off') {
this._lastFontMeasurement.charWidth = rect.width;
} else {
const scaledCharWidth = Math.floor(rect.width * window.devicePixelRatio);
const scaledCellWidth = scaledCharWidth + Math.round(letterSpacing);
const actualCellWidth = scaledCellWidth / window.devicePixelRatio;
this._lastFontMeasurement.charWidth = actualCellWidth - Math.round(letterSpacing) / window.devicePixelRatio;
const deviceCharWidth = Math.floor(rect.width * window.devicePixelRatio);
const deviceCellWidth = deviceCharWidth + Math.round(letterSpacing);
const cssCellWidth = deviceCellWidth / window.devicePixelRatio;
this._lastFontMeasurement.charWidth = cssCellWidth - Math.round(letterSpacing) / window.devicePixelRatio;
}
}
@ -185,14 +185,14 @@ export class TerminalConfigHelper implements IBrowserTerminalConfigHelper {
// Get the character dimensions from xterm if it's available
if (xtermCore) {
if (xtermCore._renderService && xtermCore._renderService.dimensions?.actualCellWidth && xtermCore._renderService.dimensions?.actualCellHeight) {
if (xtermCore._renderService && xtermCore._renderService.dimensions?.css.cell.width && xtermCore._renderService.dimensions?.css.cell.height) {
return {
fontFamily,
fontSize,
letterSpacing,
lineHeight,
charHeight: xtermCore._renderService.dimensions.actualCellHeight / lineHeight,
charWidth: xtermCore._renderService.dimensions.actualCellWidth - Math.round(letterSpacing) / window.devicePixelRatio
charHeight: xtermCore._renderService.dimensions.css.cell.height / lineHeight,
charWidth: xtermCore._renderService.dimensions.css.cell.width - Math.round(letterSpacing) / window.devicePixelRatio
};
}
}

View File

@ -1134,7 +1134,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
// If IShellLaunchConfig.waitOnExit was true and the process finished before the terminal
// panel was initialized.
if (xterm.raw.getOption('disableStdin')) {
if (xterm.raw.options.disableStdin) {
this._attachPressAnyKeyToCloseListener(xterm.raw);
}
}

View File

@ -31,13 +31,17 @@ export interface IXtermCore {
_renderService: {
dimensions: {
actualCellWidth: number;
actualCellHeight: number;
css: {
cell: {
width: number;
height: number;
}
}
},
_renderer: {
_renderLayers?: any[];
};
_onIntersectionChange: any;
_handleIntersectionChange: any;
};
}

View File

@ -3,11 +3,12 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import type { IBuffer, ITheme, RendererType, Terminal as RawXtermTerminal } from 'xterm';
import type { IBuffer, ITheme, Terminal as RawXtermTerminal } from 'xterm';
import type { CanvasAddon as CanvasAddonType } from 'xterm-addon-canvas';
import type { ISearchOptions, SearchAddon as SearchAddonType } from 'xterm-addon-search';
import type { Unicode11Addon as Unicode11AddonType } from 'xterm-addon-unicode11';
import type { WebglAddon as WebglAddonType } from 'xterm-addon-webgl';
import { SerializeAddon as SerializeAddonType } from 'xterm-addon-serialize';
import type { SerializeAddon as SerializeAddonType } from 'xterm-addon-serialize';
import { IXtermCore } from 'vs/workbench/contrib/terminal/browser/xterm-private';
import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/terminalConfigHelper';
@ -41,10 +42,11 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
const SLOW_CANVAS_RENDER_THRESHOLD = 50;
const NUMBER_OF_FRAMES_TO_MEASURE = 20;
let CanvasAddon: typeof CanvasAddonType;
let SearchAddon: typeof SearchAddonType;
let SerializeAddon: typeof SerializeAddonType;
let Unicode11Addon: typeof Unicode11AddonType;
let WebglAddon: typeof WebglAddonType;
let SerializeAddon: typeof SerializeAddonType;
/**
* Wraps the xterm object with additional functionality. Interaction with the backing process is out
@ -56,6 +58,7 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal {
private _core: IXtermCore;
private static _suggestedRendererType: 'canvas' | 'dom' | undefined = undefined;
private static _checkedWebglCompatible = false;
private _container?: HTMLElement;
// Always on addons
@ -64,6 +67,7 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal {
private _decorationAddon: DecorationAddon | undefined;
// Optional addons
private _canvasAddon?: CanvasAddonType;
private _searchAddon?: SearchAddonType;
private _unicode11Addon?: Unicode11AddonType;
private _webglAddon?: WebglAddonType;
@ -116,6 +120,7 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal {
const editorOptions = this._configurationService.getValue<IEditorOptions>('editor');
this.raw = this.add(new xtermCtor({
allowProposedApi: true,
cols,
rows,
altClickMovesCursor: config.altClickMovesCursor && editorOptions.multiCursorModifier === 'alt',
@ -132,14 +137,12 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal {
cursorBlink: config.cursorBlinking,
cursorStyle: config.cursorStyle === 'line' ? 'bar' : config.cursorStyle,
cursorWidth: config.cursorWidth,
bellStyle: 'none',
macOptionIsMeta: config.macOptionIsMeta,
macOptionClickForcesSelection: config.macOptionClickForcesSelection,
rightClickSelectsWord: config.rightClickBehavior === 'selectWord',
fastScrollModifier: 'alt',
fastScrollSensitivity: config.fastScrollSensitivity,
scrollSensitivity: config.mouseWheelScrollSensitivity,
rendererType: this._getBuiltInXtermRenderer(config.gpuAcceleration, XtermTerminal._suggestedRendererType),
wordSeparator: config.wordSeparators,
overviewRulerWidth: 10
}));
@ -217,6 +220,9 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal {
this._container = container;
if (this._shouldLoadWebgl()) {
this._enableWebglRenderer();
} else if (this._shouldLoadCanvas()) {
this._enableCanvasRenderer();
// rendererType: this._getBuiltInXtermRenderer(config.gpuAcceleration, XtermTerminal._suggestedRendererType),
}
// Screen must be created at this point as xterm.open is called
return this._container.querySelector('.xterm-screen')!;
@ -244,7 +250,11 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal {
this._enableWebglRenderer();
} else {
this._disposeOfWebglRenderer();
this.raw.options.rendererType = this._getBuiltInXtermRenderer(config.gpuAcceleration, XtermTerminal._suggestedRendererType);
if (this._shouldLoadCanvas()) {
this._enableCanvasRenderer();
} else {
this._disposeOfCanvasRenderer();
}
}
}
@ -252,6 +262,10 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal {
return !isSafari && (this._configHelper.config.gpuAcceleration === 'auto' && XtermTerminal._suggestedRendererType === undefined) || this._configHelper.config.gpuAcceleration === 'on';
}
private _shouldLoadCanvas(): boolean {
return (this._configHelper.config.gpuAcceleration === 'auto' && (XtermTerminal._suggestedRendererType === undefined || XtermTerminal._suggestedRendererType === 'canvas')) || this._configHelper.config.gpuAcceleration === 'canvas';
}
forceRedraw() {
this._webglAddon?.clearTextureAtlas();
this.raw.clearTextureAtlas();
@ -270,8 +284,8 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal {
// This is to fix an issue where dragging the windpow to the top of the screen to
// maximize on Windows/Linux would fire an event saying that the terminal was not
// visible.
if (this.raw.getOption('rendererType') === 'canvas') {
this._core._renderService?._onIntersectionChange({ intersectionRatio: 1 });
if (!!this._canvasAddon) {
this._core._renderService?._handleIntersectionChange({ intersectionRatio: 1 });
// HACK: Force a refresh of the screen to ensure links are refresh corrected.
// This can probably be removed when the above hack is fixed in Chromium.
this.raw.refresh(0, this.raw.rows - 1);
@ -422,27 +436,49 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal {
}
}
private _getBuiltInXtermRenderer(gpuAcceleration: string, suggestedRendererType?: string): RendererType {
let rendererType: RendererType = 'canvas';
if (gpuAcceleration === 'off' || (gpuAcceleration === 'auto' && suggestedRendererType === 'dom')) {
rendererType = 'dom';
}
return rendererType;
}
// TODO: Fix renderer
// private _getBuiltInXtermRenderer(gpuAcceleration: string, suggestedRendererType?: string): RendererType {
// let rendererType: RendererType = 'canvas';
// if (gpuAcceleration === 'off' || (gpuAcceleration === 'auto' && suggestedRendererType === 'dom')) {
// rendererType = 'dom';
// }
// return rendererType;
// }
private async _enableWebglRenderer(): Promise<void> {
if (!this.raw.element || this._webglAddon) {
return;
}
// Check if the the WebGL renderer is compatible with xterm.js:
// - https://github.com/microsoft/vscode/issues/190195
// - https://github.com/xtermjs/xterm.js/issues/4665
// - https://bugs.chromium.org/p/chromium/issues/detail?id=1476475
if (!XtermTerminal._checkedWebglCompatible) {
XtermTerminal._checkedWebglCompatible = true;
const checkCanvas = document.createElement('canvas');
const checkGl = checkCanvas.getContext('webgl2');
const debugInfo = checkGl?.getExtension('WEBGL_debug_renderer_info');
if (checkGl && debugInfo) {
const renderer = checkGl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
if (renderer.startsWith('ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero)')) {
this._disableWebglForThisSession();
return;
}
}
}
const Addon = await this._getWebglAddonConstructor();
this._webglAddon = new Addon();
this._disposeOfCanvasRenderer();
try {
this.raw.loadAddon(this._webglAddon);
this._logService.trace('Webgl was loaded');
this._webglAddon.onContextLoss(() => {
this._logService.info(`Webgl lost context, disposing of webgl renderer`);
this._disposeOfWebglRenderer();
this.raw.options.rendererType = 'dom';
// TODO: Fix renderer
// this.raw.options.rendererType = 'dom';
});
// Uncomment to add the texture atlas to the DOM
// setTimeout(() => {
@ -457,12 +493,45 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal {
if (!neverMeasureRenderTime && this._configHelper.config.gpuAcceleration !== 'off') {
this._measureRenderTime();
}
this.raw.options.rendererType = 'canvas';
XtermTerminal._suggestedRendererType = 'canvas';
this._disposeOfWebglRenderer();
this._disableWebglForThisSession();
}
}
private _disableWebglForThisSession() {
XtermTerminal._suggestedRendererType = 'canvas';
this._disposeOfWebglRenderer();
this._enableCanvasRenderer();
}
private async _enableCanvasRenderer(): Promise<void> {
if (!this.raw.element || this._canvasAddon) {
return;
}
const Addon = await this._getCanvasAddonConstructor();
this._canvasAddon = new Addon();
this._disposeOfWebglRenderer();
try {
this.raw.loadAddon(this._canvasAddon);
this._logService.trace('Canvas was loaded');
} catch (e) {
this._logService.warn(`Canvas could not be loaded. Falling back to the dom renderer type.`, e);
const neverMeasureRenderTime = this._storageService.getBoolean(TerminalStorageKeys.NeverMeasureRenderTime, StorageScope.GLOBAL, false);
// if it's already set to dom, no need to measure render time
if (!neverMeasureRenderTime && this._configHelper.config.gpuAcceleration !== 'off') {
this._measureRenderTime();
}
XtermTerminal._suggestedRendererType = 'dom';
this._disposeOfCanvasRenderer();
}
}
protected async _getCanvasAddonConstructor(): Promise<typeof CanvasAddonType> {
if (!CanvasAddon) {
CanvasAddon = (await import('xterm-addon-canvas')).CanvasAddon;
}
return CanvasAddon;
}
protected async _getSearchAddonConstructor(): Promise<typeof SearchAddonType> {
if (!SearchAddon) {
SearchAddon = (await import('xterm-addon-search')).SearchAddon;
@ -491,6 +560,15 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal {
return SerializeAddon;
}
private _disposeOfCanvasRenderer(): void {
try {
this._canvasAddon?.dispose();
} catch {
// ignore
}
this._canvasAddon = undefined;
}
private _disposeOfWebglRenderer(): void {
try {
this._webglAddon?.dispose();
@ -576,7 +654,7 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal {
foreground: foregroundColor?.toString(),
cursor: cursorColor?.toString(),
cursorAccent: cursorAccentColor?.toString(),
selection: selectionBackgroundColor?.toString(),
selectionBackground: selectionBackgroundColor?.toString(),
selectionForeground: selectionForegroundColor?.toString(),
black: theme.getColor(ansiColorIdentifiers[0])?.toString(),
red: theme.getColor(ansiColorIdentifiers[1])?.toString(),
@ -598,7 +676,7 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal {
}
private _updateTheme(theme?: IColorTheme): void {
this.raw.setOption('theme', this._getXtermTheme(theme));
this.raw.options.theme = this._getXtermTheme(theme);
}
private async _updateUnicodeVersion(): Promise<void> {

View File

@ -28,9 +28,11 @@ import { TerminalCapabilityStore } from 'vs/platform/terminal/common/capabilitie
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
import { ContextMenuService } from 'vs/platform/contextview/browser/contextMenuService';
class TestWebglAddon {
class TestWebglAddon implements WebglAddon {
static shouldThrow = false;
static isEnabled = false;
readonly onChangeTextureAtlas = new Emitter().event as IEvent<HTMLCanvasElement>;
readonly onAddTextureAtlasCanvas = new Emitter().event as IEvent<HTMLCanvasElement>;
readonly onContextLoss = new Emitter().event as IEvent<void>;
activate() {
TestWebglAddon.isEnabled = !TestWebglAddon.shouldThrow;
@ -120,8 +122,8 @@ suite('XtermTerminal', () => {
});
test('should use fallback dimensions of 80x30', () => {
strictEqual(xterm.raw.options.cols, 80);
strictEqual(xterm.raw.options.rows, 30);
strictEqual(xterm.raw.cols, 80);
strictEqual(xterm.raw.rows, 30);
});
suite('theme', () => {
@ -243,7 +245,6 @@ suite('XtermTerminal', () => {
suite('renderers', () => {
test('should re-evaluate gpu acceleration auto when the setting is changed', async () => {
// Check initial state
strictEqual(xterm.raw.options.rendererType, 'dom');
strictEqual(TestWebglAddon.isEnabled, false);
// Open xterm as otherwise the webgl addon won't activate
@ -261,18 +262,17 @@ suite('XtermTerminal', () => {
}
// Turn off to reset state
// TODO: Fix renderer
await configurationService.setUserConfiguration('terminal', { integrated: { ...defaultTerminalConfig, gpuAcceleration: 'off' } });
configurationService.onDidChangeConfigurationEmitter.fire({ affectsConfiguration: () => true } as any);
await xterm.webglAddonPromise; // await addon activate
strictEqual(xterm.raw.options.rendererType, 'dom');
strictEqual(TestWebglAddon.isEnabled, false);
// Set to auto again but throw when activating the webgl addon
TestWebglAddon.shouldThrow = true;
// // Set to auto again but throw when activating the webgl addon
// TestWebglAddon.shouldThrow = true;
await configurationService.setUserConfiguration('terminal', { integrated: { ...defaultTerminalConfig, gpuAcceleration: 'auto' } });
configurationService.onDidChangeConfigurationEmitter.fire({ affectsConfiguration: () => true } as any);
await xterm.webglAddonPromise; // await addon activate
strictEqual(xterm.raw.options.rendererType, 'canvas');
strictEqual(TestWebglAddon.isEnabled, false);
});
});

View File

@ -516,13 +516,13 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD
this.element!.setAttribute('src', `${this.webviewContentEndpoint(encodedWebviewOrigin)}/${fileName}?${queryString}`);
}
public mountTo(parent: HTMLElement) {
public mountTo(element: HTMLElement) {
if (!this.element) {
return;
}
if (this._webviewFindWidget) {
parent.appendChild(this._webviewFindWidget.getDomNode());
element.appendChild(this._webviewFindWidget.getDomNode());
}
[EventType.MOUSE_DOWN, EventType.MOUSE_MOVE, EventType.DROP].forEach(eventName => {
@ -531,11 +531,15 @@ export class WebviewElement extends Disposable implements IWebview, WebviewFindD
}));
});
[parent, window].forEach(node => this._register(addDisposableListener(node as HTMLElement, EventType.DRAG_END, () => {
this.stopBlockingIframeDragEvents();
})));
for (const node of [element, window]) {
this._register(addDisposableListener(node, EventType.DRAG_END, () => {
this.stopBlockingIframeDragEvents();
}));
}
parent.appendChild(this.element);
element.id = this.id; // This is used by aria-flow for accessibility order
element.appendChild(this.element);
}
private startBlockingIframeDragEvents() {

View File

@ -12315,35 +12315,40 @@ xtend@~2.1.1:
dependencies:
object-keys "~0.4.0"
xterm-addon-search@0.9.0-beta.39:
version "0.9.0-beta.39"
resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.9.0-beta.39.tgz#e8376e1485ee7d763c07d1a8f1354114f65b3e3e"
integrity sha512-h45wkecgfqXXoAUqgNytAfSd6g0xNT6rZy/enVaEU0aes7QoL9pxHUKkCry8PP6hs03Slk0VxQ4AGsbSZGvK/w==
xterm-addon-canvas@0.6.0-beta.27:
version "0.6.0-beta.27"
resolved "https://registry.yarnpkg.com/xterm-addon-canvas/-/xterm-addon-canvas-0.6.0-beta.27.tgz#2517f050d165b093a3c3e564e4420ccc3ccbad75"
integrity sha512-mSxEJKPnXYKkD6/zQLdNH6kB+sr4B+4DMFzntWgxLjHJdyOO95wUSAtBFnhAUez2nNYvXbs/OXpEbdVdO7f2kQ==
xterm-addon-serialize@0.7.0-beta.12:
version "0.7.0-beta.12"
resolved "https://registry.yarnpkg.com/xterm-addon-serialize/-/xterm-addon-serialize-0.7.0-beta.12.tgz#4f845d8b1a9f9b7ae3f910455ce8c58b041babc7"
integrity sha512-b4Ug0B/RSJMux+KAcp+PXVqubVyXjN1yCQw1FOkgVYTpmd9AH/X+EcxKml5Lz8DsKmsXqfD9AlV3WpEeT+OtMw==
xterm-addon-search@0.14.0-beta.27:
version "0.14.0-beta.27"
resolved "https://registry.yarnpkg.com/xterm-addon-search/-/xterm-addon-search-0.14.0-beta.27.tgz#b6f81eac5047253a5c664349c47498a81b6ec168"
integrity sha512-T4Exwf/rqoLHqGUUIta5Pw/i9PljvroZwLxc7RnVyDqpNsTifDn3675kS54CxwqPlv4owFhxujTDzJPCUEkM2A==
xterm-addon-unicode11@0.4.0-beta.3:
version "0.4.0-beta.3"
resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.4.0-beta.3.tgz#f350184155fafd5ad0d6fbf31d13e6ca7dea1efa"
integrity sha512-FryZAVwbUjKTmwXnm1trch/2XO60F5JsDvOkZhzobV1hm10sFLVuZpFyHXiUx7TFeeFsvNP+S77LAtWoeT5z+Q==
xterm-addon-serialize@0.12.0-beta.26:
version "0.12.0-beta.26"
resolved "https://registry.yarnpkg.com/xterm-addon-serialize/-/xterm-addon-serialize-0.12.0-beta.26.tgz#cb5bd80128e82880369cb012938e14414b182aa1"
integrity sha512-b4lOcttE6lqAF3zB2l8XtDShe5djhl9SueljnVWuG4mYMYPQoiklxFcpY66sjSCIAS6NsbtrL/LGQ/0eZGi+Ig==
xterm-addon-webgl@0.12.0-beta.37:
version "0.12.0-beta.37"
resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.37.tgz#e465100041a7e0b1d32b01cd0b0ba5a516ac13c2"
integrity sha512-d4GfKlMrWZGzsMfMHd2siG+QiOvwikhwiu+JQlIhlnAShT/wU5BOGbNfDDA1tHmkW7G1UCFgucBuVxrs5wjuBQ==
xterm-addon-unicode11@0.7.0-beta.26:
version "0.7.0-beta.26"
resolved "https://registry.yarnpkg.com/xterm-addon-unicode11/-/xterm-addon-unicode11-0.7.0-beta.26.tgz#f9606231a8f13e57dbdec5e884b044b0813931f5"
integrity sha512-po+z1ayyrkWh8IGXKpbwCLKLKfcjotZVKqowU6PtHuDtJm/J8rlzvV2eJU1WQ/8ezpopU09ibWCvaf1a7EPuxA==
xterm-headless@4.19.0-beta.58:
version "4.19.0-beta.58"
resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-4.19.0-beta.58.tgz#3a38cf3b9cd2606fb342a5cf8f2a0cfb963a62e8"
integrity sha512-wKQW8VzkFjyYDvcaM26gulo+YghyocfkZnKMH7gc/+/mFn3YXUPBPuOcX6e0M7NibyMlewpQpZjHQUPLBjkzfw==
xterm-addon-webgl@0.17.0-beta.26:
version "0.17.0-beta.26"
resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.17.0-beta.26.tgz#aee4a043981d5d303b7112ef7049bc2865e75393"
integrity sha512-N8CuAPZnoDlQ6yV7n4eXQ2ONPr/GdxiwgxrJjNks4CzzHiJREm23FQIv0fCTwKQS5xU3qoc4LlT3vZ1tKGjtQw==
xterm@4.19.0-beta.58:
version "4.19.0-beta.58"
resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0-beta.58.tgz#cbe535b0b85bc7f8ae3cc242df006bea04cdf541"
integrity sha512-fr3QC2qS2NBab8X7kwA/3QZELzQqhAKsngvK8NkhsrFN1DAuyEETkzqXuKbO7OKpCB6VqGDN6GPkNlUB9VrIDA==
xterm-headless@5.4.0-beta.27:
version "5.4.0-beta.27"
resolved "https://registry.yarnpkg.com/xterm-headless/-/xterm-headless-5.4.0-beta.27.tgz#cfce5f86e83580388238ea204bb451b7ffe94dc9"
integrity sha512-vdrq5eeNMyHZRDw5XR/TPl8oPln0BqbR07akt/fDXMsVg6YwWG+UOnU6GIMj7bJaBed5YkPV9NeBtdsVQn4Lyw==
xterm@5.4.0-beta.27:
version "5.4.0-beta.27"
resolved "https://registry.yarnpkg.com/xterm/-/xterm-5.4.0-beta.27.tgz#f641ee045a65c9c8967fac534a202062706a8fa9"
integrity sha512-gKqtrjy0RLk2123oFyPw5tkV96jGz4c/JkY8/XUvBXoMVsX4A7rVKpHlmHhmnuK1X5ERAkvCD21YE7LfB8WYkw==
y18n@^3.2.1:
version "3.2.2"