diff --git a/code/build/lib/stylelint/vscode-known-variables.json b/code/build/lib/stylelint/vscode-known-variables.json index 4b32eb42f38..0d6805f2788 100644 --- a/code/build/lib/stylelint/vscode-known-variables.json +++ b/code/build/lib/stylelint/vscode-known-variables.json @@ -458,8 +458,8 @@ "--vscode-notificationsErrorIcon-foreground", "--vscode-notificationsInfoIcon-foreground", "--vscode-notificationsWarningIcon-foreground", - "--vscode-outputEditor-background", - "--vscode-outputEditorStickyScroll-background", + "--vscode-outputView-background", + "--vscode-outputViewStickyScroll-background", "--vscode-panel-background", "--vscode-panel-border", "--vscode-panel-dropBorder", diff --git a/code/build/npm/preinstall.js b/code/build/npm/preinstall.js index c9057b90f27..149d52146db 100644 --- a/code/build/npm/preinstall.js +++ b/code/build/npm/preinstall.js @@ -11,11 +11,11 @@ const patchNodeVersion = parseInt(nodeVersion[3]); if (!process.env['VSCODE_SKIP_NODE_VERSION_CHECK']) { if (majorNodeVersion < 18 || (majorNodeVersion === 18 && minorNodeVersion < 15)) { - console.error('\033[1;31m*** Please use node.js versions >=18.15.x and <19.\033[0;0m'); + console.error('\x1b[1;31m*** Please use node.js versions >=18.15.x and <19.\x1b[0;0m'); err = true; } if (majorNodeVersion >= 19) { - console.warn('\033[1;31m*** Warning: Versions of node.js >= 19 have not been tested.\033[0;0m') + console.warn('\x1b[1;31m*** Warning: Versions of node.js >= 19 have not been tested.\x1b[0;0m') } } @@ -35,18 +35,18 @@ if ( ) || majorYarnVersion >= 2 ) { - console.error('\033[1;31m*** Please use yarn >=1.10.1 and <2.\033[0;0m'); + console.error('\x1b[1;31m*** Please use yarn >=1.10.1 and <2.\x1b[0;0m'); err = true; } /*if (!/yarn[\w-.]*\.c?js$|yarnpkg$/.test(process.env['npm_execpath'])) { - console.error('\033[1;31m*** Please use yarn to install dependencies.\033[0;0m'); + console.error('\x1b[1;31m*** Please use yarn to install dependencies.\x1b[0;0m'); err = true; }*/ if (process.platform === 'win32') { if (!hasSupportedVisualStudioVersion()) { - console.error('\033[1;31m*** Invalid C/C++ Compiler Toolchain. Please check https://github.com/microsoft/vscode/wiki/How-to-Contribute#prerequisites.\033[0;0m'); + console.error('\x1b[1;31m*** Invalid C/C++ Compiler Toolchain. Please check https://github.com/microsoft/vscode/wiki/How-to-Contribute#prerequisites.\x1b[0;0m'); err = true; } if (!err) { diff --git a/code/extensions/git/package.nls.json b/code/extensions/git/package.nls.json index 89cbaa5314d..dc59c3342d7 100644 --- a/code/extensions/git/package.nls.json +++ b/code/extensions/git/package.nls.json @@ -168,7 +168,7 @@ "config.smartCommitChanges.all": "Automatically stage all changes.", "config.smartCommitChanges.tracked": "Automatically stage tracked changes only.", "config.suggestSmartCommit": "Suggests to enable smart commit (commit all changes when there are no staged changes).", - "config.enableCommitSigning": "Enables commit signing with GPG or X.509.", + "config.enableCommitSigning": "Enables commit signing with GPG, X.509, or SSH.", "config.discardAllScope": "Controls what changes are discarded by the `Discard all changes` command. `all` discards all changes. `tracked` discards only tracked files. `prompt` shows a prompt dialog every time the action is run.", "config.decorations.enabled": "Controls whether Git contributes colors and badges to the Explorer and the Open Editors view.", "config.enableStatusBarSync": "Controls whether the Git Sync command appears in the status bar.", diff --git a/code/extensions/git/src/askpass-main.ts b/code/extensions/git/src/askpass-main.ts index 16ac88a56eb..c2f59168c67 100644 --- a/code/extensions/git/src/askpass-main.ts +++ b/code/extensions/git/src/askpass-main.ts @@ -46,7 +46,9 @@ function main(argv: string[]): void { if (askpassType === 'ssh') { if (/passphrase/i.test(request)) { // passphrase - file = argv[6].replace(/^["']+|["':]+$/g, ''); + // Commit signing - Enter passphrase: + // Git operation - Enter passphrase for key '/c/Users//.ssh/id_ed25519': + file = argv[6]?.replace(/^["']+|["':]+$/g, ''); } else { // authenticity host = argv[6].replace(/^["']+|["':]+$/g, ''); diff --git a/code/extensions/git/src/askpass.ts b/code/extensions/git/src/askpass.ts index 7821ce112e8..6b27d876185 100644 --- a/code/extensions/git/src/askpass.ts +++ b/code/extensions/git/src/askpass.ts @@ -102,7 +102,7 @@ export class Askpass implements IIPCHandler, ITerminalEnvironmentProvider { const options: InputBoxOptions = { password: true, placeHolder: l10n.t('Passphrase'), - prompt: `SSH Key: ${file}`, + prompt: file ? `SSH Key: ${file}` : undefined, ignoreFocusOut: true }; diff --git a/code/package.json b/code/package.json index d4dce591960..e986c0fc719 100644 --- a/code/package.json +++ b/code/package.json @@ -80,14 +80,14 @@ "@vscode/windows-mutex": "^0.4.4", "@vscode/windows-process-tree": "^0.5.0", "@vscode/windows-registry": "^1.1.0", - "@xterm/addon-canvas": "0.6.0-beta.19", - "@xterm/addon-image": "0.7.0-beta.17", - "@xterm/addon-search": "0.14.0-beta.19", - "@xterm/addon-serialize": "0.12.0-beta.19", - "@xterm/addon-unicode11": "0.7.0-beta.19", - "@xterm/addon-webgl": "0.17.0-beta.19", - "@xterm/headless": "5.4.0-beta.19", - "@xterm/xterm": "5.4.0-beta.19", + "@xterm/addon-canvas": "0.6.0-beta.20", + "@xterm/addon-image": "0.7.0-beta.18", + "@xterm/addon-search": "0.14.0-beta.20", + "@xterm/addon-serialize": "0.12.0-beta.20", + "@xterm/addon-unicode11": "0.7.0-beta.20", + "@xterm/addon-webgl": "0.17.0-beta.20", + "@xterm/headless": "5.4.0-beta.20", + "@xterm/xterm": "5.4.0-beta.20", "graceful-fs": "4.2.11", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.2", diff --git a/code/remote/package.json b/code/remote/package.json index b6d5d0e2f0a..46572b9636e 100644 --- a/code/remote/package.json +++ b/code/remote/package.json @@ -13,14 +13,14 @@ "@vscode/vscode-languagedetection": "1.0.21", "@vscode/windows-process-tree": "^0.5.0", "@vscode/windows-registry": "^1.1.0", - "@xterm/addon-canvas": "0.6.0-beta.19", - "@xterm/addon-image": "0.7.0-beta.17", - "@xterm/addon-search": "0.14.0-beta.19", - "@xterm/addon-serialize": "0.12.0-beta.19", - "@xterm/addon-unicode11": "0.7.0-beta.19", - "@xterm/addon-webgl": "0.17.0-beta.19", - "@xterm/headless": "5.4.0-beta.19", - "@xterm/xterm": "5.4.0-beta.19", + "@xterm/addon-canvas": "0.6.0-beta.20", + "@xterm/addon-image": "0.7.0-beta.18", + "@xterm/addon-search": "0.14.0-beta.20", + "@xterm/addon-serialize": "0.12.0-beta.20", + "@xterm/addon-unicode11": "0.7.0-beta.20", + "@xterm/addon-webgl": "0.17.0-beta.20", + "@xterm/headless": "5.4.0-beta.20", + "@xterm/xterm": "5.4.0-beta.20", "cookie": "^0.4.0", "graceful-fs": "4.2.11", "http-proxy-agent": "^7.0.0", diff --git a/code/remote/web/package.json b/code/remote/web/package.json index d441046c579..8bedb5c4f10 100644 --- a/code/remote/web/package.json +++ b/code/remote/web/package.json @@ -7,13 +7,13 @@ "@microsoft/1ds-post-js": "^3.2.13", "@vscode/iconv-lite-umd": "0.7.0", "@vscode/vscode-languagedetection": "1.0.21", - "@xterm/addon-canvas": "0.6.0-beta.19", - "@xterm/addon-image": "0.7.0-beta.17", - "@xterm/addon-search": "0.14.0-beta.19", - "@xterm/addon-serialize": "0.12.0-beta.19", - "@xterm/addon-unicode11": "0.7.0-beta.19", - "@xterm/addon-webgl": "0.17.0-beta.19", - "@xterm/xterm": "5.4.0-beta.19", + "@xterm/addon-canvas": "0.6.0-beta.20", + "@xterm/addon-image": "0.7.0-beta.18", + "@xterm/addon-search": "0.14.0-beta.20", + "@xterm/addon-serialize": "0.12.0-beta.20", + "@xterm/addon-unicode11": "0.7.0-beta.20", + "@xterm/addon-webgl": "0.17.0-beta.20", + "@xterm/xterm": "5.4.0-beta.20", "jschardet": "3.0.0", "tas-client-umd": "0.1.8", "vscode-oniguruma": "1.7.0", diff --git a/code/remote/web/yarn.lock b/code/remote/web/yarn.lock index 35e696bdf49..f540fcee68f 100644 --- a/code/remote/web/yarn.lock +++ b/code/remote/web/yarn.lock @@ -48,40 +48,40 @@ resolved "https://registry.yarnpkg.com/@vscode/vscode-languagedetection/-/vscode-languagedetection-1.0.21.tgz#89b48f293f6aa3341bb888c1118d16ff13b032d3" integrity sha512-zSUH9HYCw5qsCtd7b31yqkpaCU6jhtkKLkvOOA8yTrIRfBSOFb8PPhgmMicD7B/m+t4PwOJXzU1XDtrM9Fd3/g== -"@xterm/addon-canvas@0.6.0-beta.19": - version "0.6.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-canvas/-/addon-canvas-0.6.0-beta.19.tgz#5f8896b884d2a558a28eb197f7f4766ac37d33a0" - integrity sha512-i+26DqYgI/PZViCiEK4Vu8c4Fi5J0i+TwnFfBDLcumHH07Al1uRd5BRaVg/i93vk6bRyEIOiOiIToXSf37ov/w== - -"@xterm/addon-image@0.7.0-beta.17": - version "0.7.0-beta.17" - resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.7.0-beta.17.tgz#bc3d6f09619ef1f3b68c7009d29ee14003a26b30" - integrity sha512-nnHVoYVoh+CpT4FQN/ALKesr96YvdVNUzQRQo4aAARUKst5DFaHQX9Yn/qLDN5s0WCqI3bgIEo8UAakfHITumA== - -"@xterm/addon-search@0.14.0-beta.19": - version "0.14.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.14.0-beta.19.tgz#2bc13378765f0d5e72d9bcb7887e23eee31de7eb" - integrity sha512-Y1pPdtdZj0xRQ/Is4jdO0dyZe+uM6AhWi3v2U4sdJmhz2mxVe/HAKBHkx6tyfMtX9ge/9ZYajd/Sy8rkjIFdmQ== - -"@xterm/addon-serialize@0.12.0-beta.19": - version "0.12.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.12.0-beta.19.tgz#465a9525a420b8f0d12eed419d6e051f9a887814" - integrity sha512-3v6a4/4gxAwoyJsBp6vJBofymgTH8paSHl8K2uQfFuLosOavNyCtrNPiNne7tpppK6t8zCDJ/mVrXNptz4Mlsg== - -"@xterm/addon-unicode11@0.7.0-beta.19": - version "0.7.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.7.0-beta.19.tgz#0e81775f84346a97c657fb4cd7702de1cfe4b83f" - integrity sha512-U5O+JLklO4qtptWAWUw14QRWdalLl0bFAQxLKuTtDmusgfn33pNDRD6RH3R+IHhO2e6svAwrw27OcCEcdn0AJQ== - -"@xterm/addon-webgl@0.17.0-beta.19": - version "0.17.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.17.0-beta.19.tgz#fefe44c20b4d4d070363e03ae33087505a88807e" - integrity sha512-L59l9Cd4KTMCwnw2HPi/cUgH4iL5dK7VERK/wSTWEGYMOi3WGTmXqsg8ftfR2jFC9P33eqYNVJDmbr+pF0XsDg== - -"@xterm/xterm@5.4.0-beta.19": - version "5.4.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.4.0-beta.19.tgz#5c9c5cacd0cf2a0719086ce03ab035480b1cfd96" - integrity sha512-Rx/Y/y3YGjpiW6IUq8UlE6qrTYuUlEfpVg/BS6kIPr8/cUOchE1fsKWCMxz/u2bIyQyEovRi892iYcQJ4scstw== +"@xterm/addon-canvas@0.6.0-beta.20": + version "0.6.0-beta.20" + resolved "https://registry.yarnpkg.com/@xterm/addon-canvas/-/addon-canvas-0.6.0-beta.20.tgz#078dddef70caf880b2cb121fdda37d301fc13156" + integrity sha512-tHhsuqElE7LNiDJPbZzgVpmbcG2Dk6i2vh1EI+DzSByUWScDqLoeJbVPE5Xd2UW2garo24lxErpnIAlsytcA3A== + +"@xterm/addon-image@0.7.0-beta.18": + version "0.7.0-beta.18" + resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.7.0-beta.18.tgz#588ea2d0841cff48c63bde1bfcdf56e9494dc6af" + integrity sha512-+HQ+IBmHPelzjRJ5zO3XkjbeQNr2Zrf5wAlbPhy4EGSD0mDCqHJSfzZ8wKrhx7t8qpfiA8eTpWu/M76WsEnlnA== + +"@xterm/addon-search@0.14.0-beta.20": + version "0.14.0-beta.20" + resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.14.0-beta.20.tgz#cac366b1be1eb02cf9fe9537933f26f227d030c8" + integrity sha512-1LOL/OzWSrCBpndiBeeE2S1rxtKKgU1ucYFSG3P68W0J4VQz/Ksci1BgDKsgspj9jzpsGhdql3zwa5WEM7n4Pg== + +"@xterm/addon-serialize@0.12.0-beta.20": + version "0.12.0-beta.20" + resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.12.0-beta.20.tgz#5fe126194ff4dc466b92a0946e081e039a14ad21" + integrity sha512-GdRCQDjLyVNBxCFnhfCWsMmuqv2PryUkOaNl4z5MqB5lBUkiEnRNY0u/s5f34+2zrijp3h0O/f9JDLW4gSUQgw== + +"@xterm/addon-unicode11@0.7.0-beta.20": + version "0.7.0-beta.20" + resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.7.0-beta.20.tgz#5d3c97320898dd6766f2dc127deb4f071c8698c2" + integrity sha512-4/uwJ6lV/xJplT7hJc7sO4Im4XNvEXHnUEFIs03FFp8ZUfu3U6wcBk6/GoKMwJKJtGVNxotiD6ZzJ5v8IBH6nA== + +"@xterm/addon-webgl@0.17.0-beta.20": + version "0.17.0-beta.20" + resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.17.0-beta.20.tgz#443845ac5ac755cf762b105ed237b30426b07137" + integrity sha512-iqvXNSTfKIcO9FBraNwdO/ixPrTHok8CBN/wjlnGLv0ZMc4zLAiKE8+PHyg9ZY38QJfS+4Ouo8KsuZwoOYfnNA== + +"@xterm/xterm@5.4.0-beta.20": + version "5.4.0-beta.20" + resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.4.0-beta.20.tgz#28bbbbc73eceb6ef3e1e095de195cf849d0cbfb6" + integrity sha512-nkY91qBy5pe1HlW9LOoLcyG6v4teEsliEtUVshAO42NrJDaPniSn28O5m5832UjZOdjLCY58QlcBkZUquODGrQ== jschardet@3.0.0: version "3.0.0" diff --git a/code/remote/yarn.lock b/code/remote/yarn.lock index a2273b12745..7f7ad0480de 100644 --- a/code/remote/yarn.lock +++ b/code/remote/yarn.lock @@ -114,45 +114,45 @@ resolved "https://registry.yarnpkg.com/@vscode/windows-registry/-/windows-registry-1.1.0.tgz#03dace7c29c46f658588b9885b9580e453ad21f9" integrity sha512-5AZzuWJpGscyiMOed0IuyEwt6iKmV5Us7zuwCDCFYMIq7tsvooO9BUiciywsvuthGz6UG4LSpeDeCxvgMVhnIw== -"@xterm/addon-canvas@0.6.0-beta.19": - version "0.6.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-canvas/-/addon-canvas-0.6.0-beta.19.tgz#5f8896b884d2a558a28eb197f7f4766ac37d33a0" - integrity sha512-i+26DqYgI/PZViCiEK4Vu8c4Fi5J0i+TwnFfBDLcumHH07Al1uRd5BRaVg/i93vk6bRyEIOiOiIToXSf37ov/w== - -"@xterm/addon-image@0.7.0-beta.17": - version "0.7.0-beta.17" - resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.7.0-beta.17.tgz#bc3d6f09619ef1f3b68c7009d29ee14003a26b30" - integrity sha512-nnHVoYVoh+CpT4FQN/ALKesr96YvdVNUzQRQo4aAARUKst5DFaHQX9Yn/qLDN5s0WCqI3bgIEo8UAakfHITumA== - -"@xterm/addon-search@0.14.0-beta.19": - version "0.14.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.14.0-beta.19.tgz#2bc13378765f0d5e72d9bcb7887e23eee31de7eb" - integrity sha512-Y1pPdtdZj0xRQ/Is4jdO0dyZe+uM6AhWi3v2U4sdJmhz2mxVe/HAKBHkx6tyfMtX9ge/9ZYajd/Sy8rkjIFdmQ== - -"@xterm/addon-serialize@0.12.0-beta.19": - version "0.12.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.12.0-beta.19.tgz#465a9525a420b8f0d12eed419d6e051f9a887814" - integrity sha512-3v6a4/4gxAwoyJsBp6vJBofymgTH8paSHl8K2uQfFuLosOavNyCtrNPiNne7tpppK6t8zCDJ/mVrXNptz4Mlsg== - -"@xterm/addon-unicode11@0.7.0-beta.19": - version "0.7.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.7.0-beta.19.tgz#0e81775f84346a97c657fb4cd7702de1cfe4b83f" - integrity sha512-U5O+JLklO4qtptWAWUw14QRWdalLl0bFAQxLKuTtDmusgfn33pNDRD6RH3R+IHhO2e6svAwrw27OcCEcdn0AJQ== - -"@xterm/addon-webgl@0.17.0-beta.19": - version "0.17.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.17.0-beta.19.tgz#fefe44c20b4d4d070363e03ae33087505a88807e" - integrity sha512-L59l9Cd4KTMCwnw2HPi/cUgH4iL5dK7VERK/wSTWEGYMOi3WGTmXqsg8ftfR2jFC9P33eqYNVJDmbr+pF0XsDg== - -"@xterm/headless@5.4.0-beta.19": - version "5.4.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/headless/-/headless-5.4.0-beta.19.tgz#e84a7cebda581273032f82fc8c53941204bc7f93" - integrity sha512-y7Ne2G/Tgn6bHr14eBHqcq5gGFFCHKGBzmXTExT1Z4Fb6ofPACPWAo60S5B6uh49W4Ts13gQYZ5C0XEvHud0Eg== - -"@xterm/xterm@5.4.0-beta.19": - version "5.4.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.4.0-beta.19.tgz#5c9c5cacd0cf2a0719086ce03ab035480b1cfd96" - integrity sha512-Rx/Y/y3YGjpiW6IUq8UlE6qrTYuUlEfpVg/BS6kIPr8/cUOchE1fsKWCMxz/u2bIyQyEovRi892iYcQJ4scstw== +"@xterm/addon-canvas@0.6.0-beta.20": + version "0.6.0-beta.20" + resolved "https://registry.yarnpkg.com/@xterm/addon-canvas/-/addon-canvas-0.6.0-beta.20.tgz#078dddef70caf880b2cb121fdda37d301fc13156" + integrity sha512-tHhsuqElE7LNiDJPbZzgVpmbcG2Dk6i2vh1EI+DzSByUWScDqLoeJbVPE5Xd2UW2garo24lxErpnIAlsytcA3A== + +"@xterm/addon-image@0.7.0-beta.18": + version "0.7.0-beta.18" + resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.7.0-beta.18.tgz#588ea2d0841cff48c63bde1bfcdf56e9494dc6af" + integrity sha512-+HQ+IBmHPelzjRJ5zO3XkjbeQNr2Zrf5wAlbPhy4EGSD0mDCqHJSfzZ8wKrhx7t8qpfiA8eTpWu/M76WsEnlnA== + +"@xterm/addon-search@0.14.0-beta.20": + version "0.14.0-beta.20" + resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.14.0-beta.20.tgz#cac366b1be1eb02cf9fe9537933f26f227d030c8" + integrity sha512-1LOL/OzWSrCBpndiBeeE2S1rxtKKgU1ucYFSG3P68W0J4VQz/Ksci1BgDKsgspj9jzpsGhdql3zwa5WEM7n4Pg== + +"@xterm/addon-serialize@0.12.0-beta.20": + version "0.12.0-beta.20" + resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.12.0-beta.20.tgz#5fe126194ff4dc466b92a0946e081e039a14ad21" + integrity sha512-GdRCQDjLyVNBxCFnhfCWsMmuqv2PryUkOaNl4z5MqB5lBUkiEnRNY0u/s5f34+2zrijp3h0O/f9JDLW4gSUQgw== + +"@xterm/addon-unicode11@0.7.0-beta.20": + version "0.7.0-beta.20" + resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.7.0-beta.20.tgz#5d3c97320898dd6766f2dc127deb4f071c8698c2" + integrity sha512-4/uwJ6lV/xJplT7hJc7sO4Im4XNvEXHnUEFIs03FFp8ZUfu3U6wcBk6/GoKMwJKJtGVNxotiD6ZzJ5v8IBH6nA== + +"@xterm/addon-webgl@0.17.0-beta.20": + version "0.17.0-beta.20" + resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.17.0-beta.20.tgz#443845ac5ac755cf762b105ed237b30426b07137" + integrity sha512-iqvXNSTfKIcO9FBraNwdO/ixPrTHok8CBN/wjlnGLv0ZMc4zLAiKE8+PHyg9ZY38QJfS+4Ouo8KsuZwoOYfnNA== + +"@xterm/headless@5.4.0-beta.20": + version "5.4.0-beta.20" + resolved "https://registry.yarnpkg.com/@xterm/headless/-/headless-5.4.0-beta.20.tgz#af26d3d0e2cdd615ccfac4a8660181fee19898fd" + integrity sha512-H/as1d67J43/CB8xt1Yg/eJMbq1yopwG1bDBKdsf2ro8A1PmJFXNzaDB+wSgoH42fCusSpLJvXtUvDLtqfvBTg== + +"@xterm/xterm@5.4.0-beta.20": + version "5.4.0-beta.20" + resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.4.0-beta.20.tgz#28bbbbc73eceb6ef3e1e095de195cf849d0cbfb6" + integrity sha512-nkY91qBy5pe1HlW9LOoLcyG6v4teEsliEtUVshAO42NrJDaPniSn28O5m5832UjZOdjLCY58QlcBkZUquODGrQ== agent-base@^7.0.1, agent-base@^7.0.2, agent-base@^7.1.0: version "7.1.0" diff --git a/code/scripts/update-xterm.ps1 b/code/scripts/update-xterm.ps1 deleted file mode 100644 index 6ee7ef8f91e..00000000000 --- a/code/scripts/update-xterm.ps1 +++ /dev/null @@ -1 +0,0 @@ -node $PSScriptRoot\update-xterm.js (Get-Location) diff --git a/code/scripts/xterm-symlink.ps1 b/code/scripts/xterm-symlink.ps1 new file mode 100644 index 00000000000..06e44dc7da7 --- /dev/null +++ b/code/scripts/xterm-symlink.ps1 @@ -0,0 +1,34 @@ +<# +.SYNOPSIS + Symlinks ./node_modules/xterm to provided $XtermFolder. +#> + +Param( + [Parameter(Mandatory=$True)] + $XtermFolder +) + +$TargetFolder = "./node_modules/@xterm/xterm" + +if (Test-Path $TargetFolder -PathType Container) +{ + Write-Host -ForegroundColor Green ":: Deleting $TargetFolder`n" + Remove-Item -Path $TargetFolder +} + +if (Test-Path $XtermFolder -PathType Container) +{ + Write-Host -ForegroundColor Green "`n:: Creating symlink $TargetFolder -> $XtermFolder`n" + New-Item -Path $TargetFolder -ItemType SymbolicLink -Value $XtermFolder + + Write-Host -ForegroundColor Green "`n:: Packaging xterm.js`n" + Set-Location $TargetFolder + yarn package -- --mode development + Set-Location - + + Write-Host -ForegroundColor Green "`n:: Finished! To watch changes, open the VS Code terminal in the xterm.js repo and run:`n`n yarn package -- --mode development --watch" +} +else +{ + Write-Error -ForegroundColor Red "`n:: $XtermFolder is not a valid folder" +} diff --git a/code/scripts/update-xterm.js b/code/scripts/xterm-update.js similarity index 100% rename from code/scripts/update-xterm.js rename to code/scripts/xterm-update.js diff --git a/code/scripts/xterm-update.ps1 b/code/scripts/xterm-update.ps1 new file mode 100644 index 00000000000..11c282de888 --- /dev/null +++ b/code/scripts/xterm-update.ps1 @@ -0,0 +1 @@ +node $PSScriptRoot\xterm-update.js (Get-Location) diff --git a/code/src/vs/base/browser/ui/list/listWidget.ts b/code/src/vs/base/browser/ui/list/listWidget.ts index 02db4869cfe..25bf405993a 100644 --- a/code/src/vs/base/browser/ui/list/listWidget.ts +++ b/code/src/vs/base/browser/ui/list/listWidget.ts @@ -109,9 +109,8 @@ class TraitRenderer implements IListRenderer class Trait implements ISpliceable, IDisposable { - private length = 0; - private indexes: number[] = []; - private sortedIndexes: number[] = []; + protected indexes: number[] = []; + protected sortedIndexes: number[] = []; private readonly _onChange = new Emitter(); readonly onChange: Event = this._onChange.event; @@ -126,8 +125,6 @@ class Trait implements ISpliceable, IDisposable { constructor(private _trait: string) { } splice(start: number, deleteCount: number, elements: boolean[]): void { - deleteCount = Math.max(0, Math.min(deleteCount, this.length - start)); - const diff = elements.length - deleteCount; const end = start + deleteCount; const sortedIndexes: number[] = []; @@ -147,16 +144,8 @@ class Trait implements ISpliceable, IDisposable { sortedIndexes.push(this.sortedIndexes[i++] + diff); } - const length = this.length + diff; - - if (this.sortedIndexes.length > 0 && sortedIndexes.length === 0 && length > 0) { - const first = this.sortedIndexes.find(index => index >= start) ?? length - 1; - sortedIndexes.push(Math.min(first, length - 1)); - } - this.renderer.splice(start, deleteCount, elements.length); this._set(sortedIndexes, sortedIndexes); - this.length = length; } renderIndex(index: number, container: HTMLElement): void { diff --git a/code/src/vs/base/browser/ui/menu/menubar.ts b/code/src/vs/base/browser/ui/menu/menubar.ts index 5c6ff94f205..2e58738bdab 100644 --- a/code/src/vs/base/browser/ui/menu/menubar.ts +++ b/code/src/vs/base/browser/ui/menu/menubar.ts @@ -17,7 +17,7 @@ import { ThemeIcon } from 'vs/base/common/themables'; import { Emitter, Event } from 'vs/base/common/event'; import { KeyCode, KeyMod, ScanCode, ScanCodeUtils } from 'vs/base/common/keyCodes'; import { ResolvedKeybinding } from 'vs/base/common/keybindings'; -import { Disposable, dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore, dispose, IDisposable } from 'vs/base/common/lifecycle'; import { isMacintosh } from 'vs/base/common/platform'; import * as strings from 'vs/base/common/strings'; import 'vs/css!./menubar'; @@ -87,6 +87,8 @@ export class MenuBar extends Disposable { private numMenusShown: number = 0; private overflowLayoutScheduled: IDisposable | undefined = undefined; + private readonly menuDisposables = this._register(new DisposableStore()); + constructor(private container: HTMLElement, private options: IMenuBarOptions, private menuStyle: IMenuStyles) { super(); @@ -751,6 +753,7 @@ export class MenuBar extends Disposable { } if (this.focusedMenu) { + this.cleanupCustomMenu(); this.showCustomMenu(this.focusedMenu.index, this.openedViaKeyboard); } break; @@ -985,6 +988,7 @@ export class MenuBar extends Disposable { this.focusedMenu = { index: this.focusedMenu.index }; } + this.menuDisposables.clear(); } private showCustomMenu(menuIndex: number, selectFirst = true): void { @@ -1025,9 +1029,8 @@ export class MenuBar extends Disposable { useEventAsContext: true }; - const menuWidget = this._register(new Menu(menuHolder, customMenu.actions, menuOptions, this.menuStyle)); - - this._register(menuWidget.onDidCancel(() => { + const menuWidget = this.menuDisposables.add(new Menu(menuHolder, customMenu.actions, menuOptions, this.menuStyle)); + this.menuDisposables.add(menuWidget.onDidCancel(() => { this.focusState = MenubarState.FOCUSED; })); diff --git a/code/src/vs/base/browser/ui/tree/abstractTree.ts b/code/src/vs/base/browser/ui/tree/abstractTree.ts index d2889548b27..a9a30782b08 100644 --- a/code/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/code/src/vs/base/browser/ui/tree/abstractTree.ts @@ -2357,14 +2357,16 @@ export abstract class AbstractTree implements IDisposable return this.view.setAnchor(undefined); } - const node = this.model.getNode(element); - this.anchor.set([node]); + this.eventBufferer.bufferEvents(() => { + const node = this.model.getNode(element); + this.anchor.set([node]); - const index = this.model.getListIndex(element); + const index = this.model.getListIndex(element); - if (index > -1) { - this.view.setAnchor(index, true); - } + if (index > -1) { + this.view.setAnchor(index, true); + } + }); } getAnchor(): T | undefined { @@ -2372,11 +2374,13 @@ export abstract class AbstractTree implements IDisposable } setSelection(elements: TRef[], browserEvent?: UIEvent): void { - const nodes = elements.map(e => this.model.getNode(e)); - this.selection.set(nodes, browserEvent); + this.eventBufferer.bufferEvents(() => { + const nodes = elements.map(e => this.model.getNode(e)); + this.selection.set(nodes, browserEvent); - const indexes = elements.map(e => this.model.getListIndex(e)).filter(i => i > -1); - this.view.setSelection(indexes, browserEvent, true); + const indexes = elements.map(e => this.model.getListIndex(e)).filter(i => i > -1); + this.view.setSelection(indexes, browserEvent, true); + }); } getSelection(): T[] { @@ -2384,11 +2388,13 @@ export abstract class AbstractTree implements IDisposable } setFocus(elements: TRef[], browserEvent?: UIEvent): void { - const nodes = elements.map(e => this.model.getNode(e)); - this.focus.set(nodes, browserEvent); + this.eventBufferer.bufferEvents(() => { + const nodes = elements.map(e => this.model.getNode(e)); + this.focus.set(nodes, browserEvent); - const indexes = elements.map(e => this.model.getListIndex(e)).filter(i => i > -1); - this.view.setFocus(indexes, browserEvent, true); + const indexes = elements.map(e => this.model.getListIndex(e)).filter(i => i > -1); + this.view.setFocus(indexes, browserEvent, true); + }); } focusNext(n = 1, loop = false, browserEvent?: UIEvent, filter = (isKeyboardEvent(browserEvent) && browserEvent.altKey) ? undefined : this.focusNavigationFilter): void { diff --git a/code/src/vs/base/common/paging.ts b/code/src/vs/base/common/paging.ts index 07599e730bc..c13957cc0d8 100644 --- a/code/src/vs/base/common/paging.ts +++ b/code/src/vs/base/common/paging.ts @@ -5,7 +5,7 @@ import { range } from 'vs/base/common/arrays'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; -import { canceled } from 'vs/base/common/errors'; +import { CancellationError } from 'vs/base/common/errors'; /** * A Pager is a stateless abstraction over a paged collection. @@ -91,7 +91,7 @@ export class PagedModel implements IPagedModel { resolve(index: number, cancellationToken: CancellationToken): Promise { if (cancellationToken.isCancellationRequested) { - return Promise.reject(canceled()); + return Promise.reject(new CancellationError()); } const pageIndex = Math.floor(index / this.pager.pageSize); @@ -154,12 +154,12 @@ export class DelayedPagedModel implements IPagedModel { resolve(index: number, cancellationToken: CancellationToken): Promise { return new Promise((c, e) => { if (cancellationToken.isCancellationRequested) { - return e(canceled()); + return e(new CancellationError()); } const timer = setTimeout(() => { if (cancellationToken.isCancellationRequested) { - return e(canceled()); + return e(new CancellationError()); } timeoutCancellation.dispose(); @@ -169,7 +169,7 @@ export class DelayedPagedModel implements IPagedModel { const timeoutCancellation = cancellationToken.onCancellationRequested(() => { clearTimeout(timer); timeoutCancellation.dispose(); - e(canceled()); + e(new CancellationError()); }); }); } diff --git a/code/src/vs/editor/browser/widget/codeEditorWidget.ts b/code/src/vs/editor/browser/widget/codeEditorWidget.ts index 7f8d25c0e09..b94abf06b8f 100644 --- a/code/src/vs/editor/browser/widget/codeEditorWidget.ts +++ b/code/src/vs/editor/browser/widget/codeEditorWidget.ts @@ -347,9 +347,9 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE action.alias, action.metadata, action.precondition ?? undefined, - (): Promise => { + (args: unknown): Promise => { return this._instantiationService.invokeFunction((accessor) => { - return Promise.resolve(action.runEditorCommand(accessor, this, null)); + return Promise.resolve(action.runEditorCommand(accessor, this, args)); }); }, this._contextKeyService diff --git a/code/src/vs/platform/auxiliaryWindow/electron-main/auxiliaryWindows.ts b/code/src/vs/platform/auxiliaryWindow/electron-main/auxiliaryWindows.ts index b2f471f5d7b..c67d3eac6fa 100644 --- a/code/src/vs/platform/auxiliaryWindow/electron-main/auxiliaryWindows.ts +++ b/code/src/vs/platform/auxiliaryWindow/electron-main/auxiliaryWindows.ts @@ -17,6 +17,7 @@ export interface IAuxiliaryWindowsMainService { readonly onDidMaximizeWindow: Event; readonly onDidUnmaximizeWindow: Event; + readonly onDidChangeFullScreen: Event; readonly onDidTriggerSystemContextMenu: Event<{ readonly window: IAuxiliaryWindow; readonly x: number; readonly y: number }>; createWindow(): BrowserWindowConstructorOptions; diff --git a/code/src/vs/platform/auxiliaryWindow/electron-main/auxiliaryWindowsMainService.ts b/code/src/vs/platform/auxiliaryWindow/electron-main/auxiliaryWindowsMainService.ts index 949aba35af8..f87d8078a26 100644 --- a/code/src/vs/platform/auxiliaryWindow/electron-main/auxiliaryWindowsMainService.ts +++ b/code/src/vs/platform/auxiliaryWindow/electron-main/auxiliaryWindowsMainService.ts @@ -24,6 +24,9 @@ export class AuxiliaryWindowsMainService extends Disposable implements IAuxiliar private readonly _onDidUnmaximizeWindow = this._register(new Emitter()); readonly onDidUnmaximizeWindow = this._onDidUnmaximizeWindow.event; + private readonly _onDidChangeFullScreen = this._register(new Emitter()); + readonly onDidChangeFullScreen = this._onDidChangeFullScreen.event; + private readonly _onDidTriggerSystemContextMenu = this._register(new Emitter<{ window: IAuxiliaryWindow; x: number; y: number }>()); readonly onDidTriggerSystemContextMenu = this._onDidTriggerSystemContextMenu.event; @@ -85,6 +88,8 @@ export class AuxiliaryWindowsMainService extends Disposable implements IAuxiliar disposables.add(auxiliaryWindow.onDidMaximize(() => this._onDidMaximizeWindow.fire(auxiliaryWindow))); disposables.add(auxiliaryWindow.onDidUnmaximize(() => this._onDidUnmaximizeWindow.fire(auxiliaryWindow))); + disposables.add(auxiliaryWindow.onDidEnterFullScreen(() => this._onDidChangeFullScreen.fire(auxiliaryWindow))); + disposables.add(auxiliaryWindow.onDidLeaveFullScreen(() => this._onDidChangeFullScreen.fire(auxiliaryWindow))); disposables.add(auxiliaryWindow.onDidTriggerSystemContextMenu(({ x, y }) => this._onDidTriggerSystemContextMenu.fire({ window: auxiliaryWindow, x, y }))); Event.once(auxiliaryWindow.onDidClose)(() => disposables.dispose()); diff --git a/code/src/vs/platform/native/common/native.ts b/code/src/vs/platform/native/common/native.ts index a2b150c00ba..106505e908a 100644 --- a/code/src/vs/platform/native/common/native.ts +++ b/code/src/vs/platform/native/common/native.ts @@ -53,6 +53,8 @@ export interface ICommonNativeHostService { readonly onDidFocusMainWindow: Event; readonly onDidBlurMainWindow: Event; + readonly onDidChangeWindowFullScreen: Event; + readonly onDidFocusMainOrAuxiliaryWindow: Event; readonly onDidBlurMainOrAuxiliaryWindow: Event; diff --git a/code/src/vs/platform/native/electron-main/nativeHostMainService.ts b/code/src/vs/platform/native/electron-main/nativeHostMainService.ts index 79c912875bb..28e8d65665a 100644 --- a/code/src/vs/platform/native/electron-main/nativeHostMainService.ts +++ b/code/src/vs/platform/native/electron-main/nativeHostMainService.ts @@ -92,6 +92,11 @@ export class NativeHostMainService extends Disposable implements INativeHostMain Event.filter(Event.map(this.auxiliaryWindowsMainService.onDidUnmaximizeWindow, window => window.id), windowId => !!this.auxiliaryWindowsMainService.getWindowById(windowId)) ); + readonly onDidChangeWindowFullScreen = Event.any( + Event.map(this.windowsMainService.onDidChangeFullScreen, window => window.id), + Event.map(this.auxiliaryWindowsMainService.onDidChangeFullScreen, window => window.id) + ); + readonly onDidBlurMainWindow = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-blur', (event, window: BrowserWindow) => window.id), windowId => !!this.windowsMainService.getWindowById(windowId)); readonly onDidFocusMainWindow = Event.any( Event.map(Event.filter(Event.map(this.windowsMainService.onDidChangeWindowsCount, () => this.windowsMainService.getLastActiveWindow()), window => !!window), window => window!.id), diff --git a/code/src/vs/platform/quickinput/browser/quickInput.ts b/code/src/vs/platform/quickinput/browser/quickInput.ts index 30b69b66f99..3584e6e6d7b 100644 --- a/code/src/vs/platform/quickinput/browser/quickInput.ts +++ b/code/src/vs/platform/quickinput/browser/quickInput.ts @@ -15,7 +15,6 @@ import { IListRenderer, IListVirtualDelegate } from 'vs/base/browser/ui/list/lis import { IListOptions, IListStyles, List } from 'vs/base/browser/ui/list/listWidget'; import { IProgressBarStyles, ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; import { IToggleStyles, Toggle } from 'vs/base/browser/ui/toggle/toggle'; -import { Action } from 'vs/base/common/actions'; import { equals } from 'vs/base/common/arrays'; import { TimeoutTimer } from 'vs/base/common/async'; import { Codicon } from 'vs/base/common/codicons'; @@ -30,7 +29,7 @@ import { localize } from 'vs/nls'; import { IInputBox, IKeyMods, IQuickInput, IQuickInputButton, IQuickInputHideEvent, IQuickInputToggle, IQuickNavigateConfiguration, IQuickPick, IQuickPickDidAcceptEvent, IQuickPickItem, IQuickPickItemButtonEvent, IQuickPickSeparator, IQuickPickSeparatorButtonEvent, IQuickPickWillAcceptEvent, IQuickWidget, ItemActivation, NO_KEY_MODS, QuickInputHideReason } from 'vs/platform/quickinput/common/quickInput'; import { QuickInputBox } from './quickInputBox'; import { QuickInputList, QuickInputListFocus } from './quickInputList'; -import { getIconClass, renderQuickInputDescription } from './quickInputUtils'; +import { quickInputButtonToAction, renderQuickInputDescription } from './quickInputUtils'; export interface IQuickInputOptions { idPrefix: string; @@ -388,23 +387,23 @@ class QuickInput extends Disposable implements IQuickInput { if (this.buttonsUpdated) { this.buttonsUpdated = false; this.ui.leftActionBar.clear(); - const leftButtons = this.buttons.filter(button => button === backButton); - this.ui.leftActionBar.push(leftButtons.map((button, index) => { - const action = new Action(`id-${index}`, '', button.iconClass || getIconClass(button.iconPath), true, async () => { - this.onDidTriggerButtonEmitter.fire(button); - }); - action.tooltip = button.tooltip || ''; - return action; - }), { icon: true, label: false }); + const leftButtons = this.buttons + .filter(button => button === backButton) + .map((button, index) => quickInputButtonToAction( + button, + `id-${index}`, + async () => this.onDidTriggerButtonEmitter.fire(button) + )); + this.ui.leftActionBar.push(leftButtons, { icon: true, label: false }); this.ui.rightActionBar.clear(); - const rightButtons = this.buttons.filter(button => button !== backButton); - this.ui.rightActionBar.push(rightButtons.map((button, index) => { - const action = new Action(`id-${index}`, '', button.iconClass || getIconClass(button.iconPath), true, async () => { - this.onDidTriggerButtonEmitter.fire(button); - }); - action.tooltip = button.tooltip || ''; - return action; - }), { icon: true, label: false }); + const rightButtons = this.buttons + .filter(button => button !== backButton) + .map((button, index) => quickInputButtonToAction( + button, + `id-${index}`, + async () => this.onDidTriggerButtonEmitter.fire(button) + )); + this.ui.rightActionBar.push(rightButtons, { icon: true, label: false }); } if (this.togglesUpdated) { this.togglesUpdated = false; diff --git a/code/src/vs/platform/quickinput/browser/quickInputList.ts b/code/src/vs/platform/quickinput/browser/quickInputList.ts index fdbde66caa8..a1ad53c81c9 100644 --- a/code/src/vs/platform/quickinput/browser/quickInputList.ts +++ b/code/src/vs/platform/quickinput/browser/quickInputList.ts @@ -8,12 +8,11 @@ import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { AriaRole } from 'vs/base/browser/ui/aria/aria'; import { HoverPosition } from 'vs/base/browser/ui/hover/hoverWidget'; -import { IHoverWidget } from 'vs/base/browser/ui/iconLabel/iconHoverDelegate'; +import { IHoverDelegate, IHoverWidget } from 'vs/base/browser/ui/iconLabel/iconHoverDelegate'; import { IconLabel, IIconLabelValueOptions } from 'vs/base/browser/ui/iconLabel/iconLabel'; import { KeybindingLabel } from 'vs/base/browser/ui/keybindingLabel/keybindingLabel'; import { IListRenderer, IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { IListAccessibilityProvider, IListOptions, IListStyles, List } from 'vs/base/browser/ui/list/listWidget'; -import { IAction } from 'vs/base/common/actions'; import { range } from 'vs/base/common/arrays'; import { ThrottledDelayer } from 'vs/base/common/async'; import { compareAnything } from 'vs/base/common/comparers'; @@ -30,7 +29,7 @@ import { ltrim } from 'vs/base/common/strings'; import 'vs/css!./media/quickInput'; import { localize } from 'vs/nls'; import { IQuickInputOptions } from 'vs/platform/quickinput/browser/quickInput'; -import { getIconClass } from 'vs/platform/quickinput/browser/quickInputUtils'; +import { quickInputButtonToAction } from 'vs/platform/quickinput/browser/quickInputUtils'; import { IQuickPickItem, IQuickPickItemButtonEvent, IQuickPickSeparator, IQuickPickSeparatorButtonEvent, QuickPickItem } from 'vs/platform/quickinput/common/quickInput'; import { Lazy } from 'vs/base/common/lazy'; import { URI } from 'vs/base/common/uri'; @@ -235,7 +234,10 @@ class ListElementRenderer implements IListRendererdom.prepend(data.label.element, $('.quick-input-list-icon')); @@ -277,14 +279,14 @@ class ListElementRenderer implements IListRenderer { - let cssClasses = button.iconClass || (button.iconPath ? getIconClass(button.iconPath) : undefined); - if (button.alwaysVisible) { - cssClasses = cssClasses ? `${cssClasses} always-visible` : 'always-visible'; - } - return { - id: `id-${index}`, - class: cssClasses, - enabled: true, - label: '', - tooltip: button.tooltip || '', - run: () => { - mainItem.type !== 'separator' - ? element.fireButtonTriggered({ - button, - item: mainItem - }) - : element.fireSeparatorButtonTriggered({ - button, - separator: mainItem - }); - } - }; - }), { icon: true, label: false }); + data.actionBar.push(buttons.map((button, index) => quickInputButtonToAction( + button, + `id-${index}`, + () => mainItem.type !== 'separator' + ? element.fireButtonTriggered({ button, item: mainItem }) + : element.fireSeparatorButtonTriggered({ button, separator: mainItem }) + )), { icon: true, label: false }); data.entry.classList.add('has-actions'); } else { data.entry.classList.remove('has-actions'); @@ -468,7 +455,7 @@ export class QuickInputList { this.container = dom.append(this.parent, $('.quick-input-list')); const delegate = new ListElementDelegate(); const accessibilityProvider = new QuickInputAccessibilityProvider(); - this.list = options.createList('QuickInput', this.container, delegate, [new ListElementRenderer(themeService)], { + this.list = options.createList('QuickInput', this.container, delegate, [new ListElementRenderer(themeService, options.hoverDelegate)], { identityProvider: { getId: element => { // always prefer item over separator because if item is defined, it must be the main item type diff --git a/code/src/vs/platform/quickinput/browser/quickInputUtils.ts b/code/src/vs/platform/quickinput/browser/quickInputUtils.ts index 1c9566a6622..cfa7e231a23 100644 --- a/code/src/vs/platform/quickinput/browser/quickInputUtils.ts +++ b/code/src/vs/platform/quickinput/browser/quickInputUtils.ts @@ -16,11 +16,13 @@ import { URI } from 'vs/base/common/uri'; import 'vs/css!./media/quickInput'; import { localize } from 'vs/nls'; import { DisposableStore } from 'vs/base/common/lifecycle'; +import { IQuickInputButton } from 'vs/platform/quickinput/common/quickInput'; +import { IAction } from 'vs/base/common/actions'; const iconPathToClass: Record = {}; const iconClassGenerator = new IdGenerator('quick-input-button-icon-'); -export function getIconClass(iconPath: { dark: URI; light?: URI } | undefined): string | undefined { +function getIconClass(iconPath: { dark: URI; light?: URI } | undefined): string | undefined { if (!iconPath) { return undefined; } @@ -39,6 +41,22 @@ export function getIconClass(iconPath: { dark: URI; light?: URI } | undefined): return iconClass; } +export function quickInputButtonToAction(button: IQuickInputButton, id: string, run: () => unknown): IAction { + let cssClasses = button.iconClass || getIconClass(button.iconPath); + if (button.alwaysVisible) { + cssClasses = cssClasses ? `${cssClasses} always-visible` : 'always-visible'; + } + + return { + id, + label: '', + tooltip: button.tooltip || '', + class: cssClasses, + enabled: true, + run + }; +} + export function renderQuickInputDescription(description: string, container: HTMLElement, actionHandler: { callback: (content: string) => void; disposables: DisposableStore }) { dom.reset(container); const parsed = parseLinkedText(description); diff --git a/code/src/vs/platform/window/electron-main/window.ts b/code/src/vs/platform/window/electron-main/window.ts index 653a4d23473..dbcef949cd8 100644 --- a/code/src/vs/platform/window/electron-main/window.ts +++ b/code/src/vs/platform/window/electron-main/window.ts @@ -18,6 +18,8 @@ export interface IBaseWindow extends IDisposable { readonly onDidMaximize: Event; readonly onDidUnmaximize: Event; readonly onDidTriggerSystemContextMenu: Event<{ readonly x: number; readonly y: number }>; + readonly onDidEnterFullScreen: Event; + readonly onDidLeaveFullScreen: Event; readonly onDidClose: Event; readonly id: number; diff --git a/code/src/vs/platform/windows/electron-main/windowImpl.ts b/code/src/vs/platform/windows/electron-main/windowImpl.ts index 36f9a65833f..4972933c581 100644 --- a/code/src/vs/platform/windows/electron-main/windowImpl.ts +++ b/code/src/vs/platform/windows/electron-main/windowImpl.ts @@ -98,6 +98,12 @@ export abstract class BaseWindow extends Disposable implements IBaseWindow { private readonly _onDidTriggerSystemContextMenu = this._register(new Emitter<{ x: number; y: number }>()); readonly onDidTriggerSystemContextMenu = this._onDidTriggerSystemContextMenu.event; + private readonly _onDidEnterFullScreen = this._register(new Emitter()); + readonly onDidEnterFullScreen = this._onDidEnterFullScreen.event; + + private readonly _onDidLeaveFullScreen = this._register(new Emitter()); + readonly onDidLeaveFullScreen = this._onDidLeaveFullScreen.event; + //#endregion abstract readonly id: number; @@ -121,6 +127,8 @@ export abstract class BaseWindow extends Disposable implements IBaseWindow { this._register(Event.fromNodeEventEmitter(win, 'focus')(() => { this._lastFocusTime = Date.now(); })); + this._register(Event.fromNodeEventEmitter(this._win, 'enter-full-screen')(() => this._onDidEnterFullScreen.fire())); + this._register(Event.fromNodeEventEmitter(this._win, 'leave-full-screen')(() => this._onDidLeaveFullScreen.fire())); // Sheet Offsets const useCustomTitleStyle = getTitleBarStyle(this.configurationService) === 'custom'; @@ -670,14 +678,14 @@ export class CodeWindow extends BaseWindow implements ICodeWindow { })); // Window Fullscreen - this._register(Event.fromNodeEventEmitter(this._win, 'enter-full-screen')(() => { + this._register(this.onDidEnterFullScreen(() => { this.sendWhenReady('vscode:enterFullScreen', CancellationToken.None); this.joinNativeFullScreenTransition?.complete(); this.joinNativeFullScreenTransition = undefined; })); - this._register(Event.fromNodeEventEmitter(this._win, 'leave-full-screen')(() => { + this._register(this.onDidLeaveFullScreen(() => { this.sendWhenReady('vscode:leaveFullScreen', CancellationToken.None); this.joinNativeFullScreenTransition?.complete(); diff --git a/code/src/vs/platform/windows/electron-main/windows.ts b/code/src/vs/platform/windows/electron-main/windows.ts index d957eb1a039..1bfd4d3631f 100644 --- a/code/src/vs/platform/windows/electron-main/windows.ts +++ b/code/src/vs/platform/windows/electron-main/windows.ts @@ -32,6 +32,7 @@ export interface IWindowsMainService { readonly onDidSignalReadyWindow: Event; readonly onDidMaximizeWindow: Event; readonly onDidUnmaximizeWindow: Event; + readonly onDidChangeFullScreen: Event; readonly onDidTriggerSystemContextMenu: Event<{ readonly window: ICodeWindow; readonly x: number; readonly y: number }>; readonly onDidDestroyWindow: Event; diff --git a/code/src/vs/platform/windows/electron-main/windowsMainService.ts b/code/src/vs/platform/windows/electron-main/windowsMainService.ts index 3053b0782ee..5a1473a0844 100644 --- a/code/src/vs/platform/windows/electron-main/windowsMainService.ts +++ b/code/src/vs/platform/windows/electron-main/windowsMainService.ts @@ -198,6 +198,9 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic private readonly _onDidUnmaximizeWindow = this._register(new Emitter()); readonly onDidUnmaximizeWindow = this._onDidUnmaximizeWindow.event; + private readonly _onDidChangeFullScreen = this._register(new Emitter()); + readonly onDidChangeFullScreen = this._onDidChangeFullScreen.event; + private readonly _onDidTriggerSystemContextMenu = this._register(new Emitter<{ window: ICodeWindow; x: number; y: number }>()); readonly onDidTriggerSystemContextMenu = this._onDidTriggerSystemContextMenu.event; @@ -1498,6 +1501,8 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic disposables.add(Event.once(createdWindow.onDidDestroy)(() => this.onWindowDestroyed(createdWindow))); disposables.add(createdWindow.onDidMaximize(() => this._onDidMaximizeWindow.fire(createdWindow))); disposables.add(createdWindow.onDidUnmaximize(() => this._onDidUnmaximizeWindow.fire(createdWindow))); + disposables.add(createdWindow.onDidEnterFullScreen(() => this._onDidChangeFullScreen.fire(createdWindow))); + disposables.add(createdWindow.onDidLeaveFullScreen(() => this._onDidChangeFullScreen.fire(createdWindow))); disposables.add(createdWindow.onDidTriggerSystemContextMenu(({ x, y }) => this._onDidTriggerSystemContextMenu.fire({ window: createdWindow, x, y }))); const webContents = assertIsDefined(createdWindow.win?.webContents); diff --git a/code/src/vs/platform/windows/test/electron-main/windowsFinder.test.ts b/code/src/vs/platform/windows/test/electron-main/windowsFinder.test.ts index 8b5784209eb..d395dc44ab1 100644 --- a/code/src/vs/platform/windows/test/electron-main/windowsFinder.test.ts +++ b/code/src/vs/platform/windows/test/electron-main/windowsFinder.test.ts @@ -40,6 +40,8 @@ suite('WindowsFinder', () => { onDidSignalReady: Event = Event.None; onDidClose: Event = Event.None; onDidDestroy: Event = Event.None; + onDidEnterFullScreen: Event = Event.None; + onDidLeaveFullScreen: Event = Event.None; whenClosedOrLoaded: Promise = Promise.resolve(); id: number = -1; win: Electron.BrowserWindow = null!; diff --git a/code/src/vs/workbench/browser/actions/layoutActions.ts b/code/src/vs/workbench/browser/actions/layoutActions.ts index fd2348aabcf..a3bacf4ad5c 100644 --- a/code/src/vs/workbench/browser/actions/layoutActions.ts +++ b/code/src/vs/workbench/browser/actions/layoutActions.ts @@ -28,6 +28,7 @@ import { DisposableStore } from 'vs/base/common/lifecycle'; import { registerIcon } from 'vs/platform/theme/common/iconRegistry'; import { ICommandActionTitle } from 'vs/platform/action/common/action'; import { mainWindow } from 'vs/base/browser/window'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; // Register Icons const menubarIcon = registerIcon('menuBar', Codicon.layoutMenubar, localize('menuBarIcon', "Represents the menu bar")); @@ -1422,7 +1423,7 @@ registerAction2(class CustomizeLayoutAction extends Action2 { }); } - getItems(contextKeyService: IContextKeyService): QuickPickItem[] { + getItems(contextKeyService: IContextKeyService, keybindingService: IKeybindingService): QuickPickItem[] { const toQuickPickItem = (item: CustomizeLayoutItem): IQuickPickItem => { const toggled = item.active.evaluate(contextKeyService.getContext(null)); let label = item.useButtons ? @@ -1448,6 +1449,7 @@ registerAction2(class CustomizeLayoutAction extends Action2 { id: item.id, label, ariaLabel, + keybinding: keybindingService.lookupKeybinding(item.id, contextKeyService), buttons: !item.useButtons ? undefined : [ { alwaysVisible: false, @@ -1491,10 +1493,11 @@ registerAction2(class CustomizeLayoutAction extends Action2 { const contextKeyService = accessor.get(IContextKeyService); const commandService = accessor.get(ICommandService); const quickInputService = accessor.get(IQuickInputService); + const keybindingService = accessor.get(IKeybindingService); const quickPick = quickInputService.createQuickPick(); this._currentQuickPick = quickPick; - quickPick.items = this.getItems(contextKeyService); + quickPick.items = this.getItems(contextKeyService, keybindingService); quickPick.ignoreFocusOut = true; quickPick.hideInput = true; quickPick.title = localize('customizeLayoutQuickPickTitle', "Customize Layout"); @@ -1520,7 +1523,7 @@ registerAction2(class CustomizeLayoutAction extends Action2 { let selectedItem: CustomizeLayoutItem | undefined = undefined; disposables.add(contextKeyService.onDidChangeContext(changeEvent => { if (changeEvent.affectsSome(LayoutContextKeySet)) { - quickPick.items = this.getItems(contextKeyService); + quickPick.items = this.getItems(contextKeyService, keybindingService); if (selectedItem) { quickPick.activeItems = quickPick.items.filter(item => (item as CustomizeLayoutItem).id === selectedItem?.id) as IQuickPickItem[]; } diff --git a/code/src/vs/workbench/browser/actions/listCommands.ts b/code/src/vs/workbench/browser/actions/listCommands.ts index e5eac285eea..3b7bc0b8a1c 100644 --- a/code/src/vs/workbench/browser/actions/listCommands.ts +++ b/code/src/vs/workbench/browser/actions/listCommands.ts @@ -488,8 +488,8 @@ function selectElement(accessor: ServicesAccessor, retainCurrentFocus: boolean): // List if (focused instanceof List || focused instanceof PagedList || focused instanceof Table) { const list = focused; - list.setSelection(list.getFocus(), fakeKeyboardEvent); list.setAnchor(list.getFocus()[0]); + list.setSelection(list.getFocus(), fakeKeyboardEvent); } // Trees @@ -510,8 +510,8 @@ function selectElement(accessor: ServicesAccessor, retainCurrentFocus: boolean): tree.toggleCollapsed(focus[0]); } } - tree.setSelection(focus, fakeKeyboardEvent); tree.setAnchor(focus[0]); + tree.setSelection(focus, fakeKeyboardEvent); } } diff --git a/code/src/vs/workbench/browser/parts/editor/auxiliaryEditorPart.ts b/code/src/vs/workbench/browser/parts/editor/auxiliaryEditorPart.ts index 72b84741e46..8d1ea43513e 100644 --- a/code/src/vs/workbench/browser/parts/editor/auxiliaryEditorPart.ts +++ b/code/src/vs/workbench/browser/parts/editor/auxiliaryEditorPart.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { hide, show } from 'vs/base/browser/dom'; +import { detectFullscreen, hide, show } from 'vs/base/browser/dom'; import { Emitter, Event } from 'vs/base/common/event'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { isNative } from 'vs/base/common/platform'; @@ -39,7 +39,8 @@ export class AuxiliaryEditorPart { @IConfigurationService private readonly configurationService: IConfigurationService, @IStatusbarService private readonly statusbarService: IStatusbarService, @ITitleService private readonly titleService: ITitleService, - @IEditorService private readonly editorService: IEditorService + @IEditorService private readonly editorService: IEditorService, + @IHostService private readonly hostService: IHostService ) { } @@ -52,7 +53,7 @@ export class AuxiliaryEditorPart { editorPartHeightOffset += statusbarPart.height; } - if (titlebarPart) { + if (titlebarPart && titlebarPartVisible) { editorPartHeightOffset += titlebarPart.height; } @@ -95,10 +96,31 @@ export class AuxiliaryEditorPart { // Titlebar let titlebarPart: IAuxiliaryTitlebarPart | undefined = undefined; + let titlebarPartVisible = false; const useCustomTitle = isNative && getTitleBarStyle(this.configurationService) === 'custom'; // custom title in aux windows only enabled in native if (useCustomTitle) { titlebarPart = disposables.add(this.titleService.createAuxiliaryTitlebarPart(auxiliaryWindow.container, editorPart)); + titlebarPartVisible = true; + disposables.add(titlebarPart.onDidChange(() => updateEditorPartHeight(true))); + + disposables.add(this.hostService.onDidChangeFullScreen(windowId => { + if (windowId !== auxiliaryWindow.window.vscodeWindowId) { + return; // ignore all but our window + } + + // Make sure to hide the custom title when we enter + // fullscren mode and show it when we lave it. + + const fullscreen = detectFullscreen(auxiliaryWindow.window); + const oldTitlebarPartVisible = titlebarPartVisible; + titlebarPartVisible = !fullscreen; + if (titlebarPart && oldTitlebarPartVisible !== titlebarPartVisible) { + titlebarPart.container.style.display = titlebarPartVisible ? '' : 'none'; + + updateEditorPartHeight(true); + } + })); } else { disposables.add(this.instantiationService.createInstance(WindowTitle, auxiliaryWindow.window, editorPart)); } @@ -132,9 +154,7 @@ export class AuxiliaryEditorPart { // Layout disposables.add(auxiliaryWindow.onDidLayout(dimension => { const titlebarPartHeight = titlebarPart?.height ?? 0; - if (titlebarPart) { - titlebarPart.layout(dimension.width, titlebarPartHeight, 0, 0); - } + titlebarPart?.layout(dimension.width, titlebarPartHeight, 0, 0); const editorPartHeight = dimension.height - computeEditorPartHeightOffset(); editorPart.layout(dimension.width, editorPartHeight, titlebarPartHeight, 0); diff --git a/code/src/vs/workbench/browser/window.ts b/code/src/vs/workbench/browser/window.ts index c2e85c276ea..56278f29851 100644 --- a/code/src/vs/workbench/browser/window.ts +++ b/code/src/vs/workbench/browser/window.ts @@ -4,14 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import { isSafari, setFullscreen } from 'vs/base/browser/browser'; -import { addDisposableListener, addDisposableThrottledListener, detectFullscreen, EventHelper, EventType, getActiveWindow, getWindow, getWindows, getWindowsCount, windowOpenNoOpener, windowOpenPopup, windowOpenWithSuccess } from 'vs/base/browser/dom'; +import { addDisposableListener, detectFullscreen, EventHelper, EventType, getActiveWindow, getWindow, getWindows, getWindowsCount, windowOpenNoOpener, windowOpenPopup, windowOpenWithSuccess } from 'vs/base/browser/dom'; import { DomEmitter } from 'vs/base/browser/event'; import { HidDeviceData, requestHidDevice, requestSerialPort, requestUsbDevice, SerialPortData, UsbDeviceData } from 'vs/base/browser/deviceAccess'; import { timeout } from 'vs/base/common/async'; import { Event } from 'vs/base/common/event'; import { Disposable, IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; import { matchesScheme, Schemas } from 'vs/base/common/network'; -import { isIOS, isMacintosh } from 'vs/base/common/platform'; +import { isIOS } from 'vs/base/common/platform'; import Severity from 'vs/base/common/severity'; import { URI } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; @@ -174,15 +174,14 @@ export class BrowserWindow extends BaseWindow { // Prevent default navigation on drop this._register(addDisposableListener(this.layoutService.mainContainer, EventType.DROP, e => EventHelper.stop(e, true))); - // Fullscreen (Browser) - for (const event of [EventType.FULLSCREEN_CHANGE, EventType.WK_FULLSCREEN_CHANGE]) { - this._register(addDisposableListener(mainWindow.document, event, () => setFullscreen(!!detectFullscreen(mainWindow)))); - } + // Fullscreen + this._register(this.hostService.onDidChangeFullScreen(windowId => { + if (windowId !== mainWindow.vscodeWindowId) { + return; // ignore all but main window + } - // Fullscreen (Native) - this._register(addDisposableThrottledListener(viewport, EventType.RESIZE, () => { setFullscreen(!!detectFullscreen(mainWindow)); - }, undefined, isMacintosh ? 2000 /* adjust for macOS animation */ : 800 /* can be throttled */)); + })); } private onWillShutdown(): void { diff --git a/code/src/vs/workbench/common/theme.ts b/code/src/vs/workbench/common/theme.ts index 83dc763c13d..1c56711b8d0 100644 --- a/code/src/vs/workbench/common/theme.ts +++ b/code/src/vs/workbench/common/theme.ts @@ -403,20 +403,20 @@ export const PANEL_SECTION_BORDER = registerColor('panelSection.border', { // < --- Output Editor --> -const OUTPUT_EDITOR_BACKGROUND = registerColor('outputEditor.background', { +const OUTPUT_VIEW_BACKGROUND = registerColor('outputView.background', { dark: null, light: null, hcDark: null, hcLight: null -}, localize('outputEditorBackground', "Output editor background color.")); +}, localize('outputViewBackground', "Output view background color.")); -registerColor('outputEditorStickyScroll.background', { - dark: OUTPUT_EDITOR_BACKGROUND, - light: OUTPUT_EDITOR_BACKGROUND, - hcDark: OUTPUT_EDITOR_BACKGROUND, - hcLight: OUTPUT_EDITOR_BACKGROUND -}, localize('outputEditorStickyScrollBackground', "Output editor sticky scroll background color.")); +registerColor('outputViewStickyScroll.background', { + dark: OUTPUT_VIEW_BACKGROUND, + light: OUTPUT_VIEW_BACKGROUND, + hcDark: OUTPUT_VIEW_BACKGROUND, + hcLight: OUTPUT_VIEW_BACKGROUND +}, localize('outputViewStickyScrollBackground', "Output view sticky scroll background color.")); // < --- Banner --- > diff --git a/code/src/vs/workbench/contrib/files/browser/explorerService.ts b/code/src/vs/workbench/contrib/files/browser/explorerService.ts index 8d184d071a0..2b38b810ea8 100644 --- a/code/src/vs/workbench/contrib/files/browser/explorerService.ts +++ b/code/src/vs/workbench/contrib/files/browser/explorerService.ts @@ -448,6 +448,7 @@ export class ExplorerService implements IExplorerService { // Remove Element from Parent (Model) const parent = modelElement.parent; parent.removeChild(modelElement); + this.view?.focusNext(); const oldNestedParent = modelElement.nestedParent; if (oldNestedParent) { @@ -456,6 +457,10 @@ export class ExplorerService implements IExplorerService { } // Refresh Parent (View) await this.view?.refresh(shouldDeepRefresh, parent); + + if (this.view?.getFocus().length === 0) { + this.view?.focusLast(); + } } })); } diff --git a/code/src/vs/workbench/contrib/files/browser/files.ts b/code/src/vs/workbench/contrib/files/browser/files.ts index d091e772e33..0d6f0b454cd 100644 --- a/code/src/vs/workbench/contrib/files/browser/files.ts +++ b/code/src/vs/workbench/contrib/files/browser/files.ts @@ -60,6 +60,9 @@ export interface IExplorerView { isItemVisible(item: ExplorerItem): boolean; isItemCollapsed(item: ExplorerItem): boolean; hasFocus(): boolean; + getFocus(): ExplorerItem[]; + focusNext(): void; + focusLast(): void; } function getFocus(listService: IListService): unknown | undefined { diff --git a/code/src/vs/workbench/contrib/files/browser/views/explorerView.ts b/code/src/vs/workbench/contrib/files/browser/views/explorerView.ts index 815c79a9c67..f8d2a9ddcfa 100644 --- a/code/src/vs/workbench/contrib/files/browser/views/explorerView.ts +++ b/code/src/vs/workbench/contrib/files/browser/views/explorerView.ts @@ -348,6 +348,18 @@ export class ExplorerView extends ViewPane implements IExplorerView { return DOM.isAncestorOfActiveElement(this.container); } + getFocus(): ExplorerItem[] { + return this.tree.getFocus(); + } + + focusNext(): void { + this.tree.focusNext(); + } + + focusLast(): void { + this.tree.focusLast(); + } + getContext(respectMultiSelection: boolean): ExplorerItem[] { return getContext(this.tree.getFocus(), this.tree.getSelection(), respectMultiSelection, this.renderer); } diff --git a/code/src/vs/workbench/contrib/output/browser/output.css b/code/src/vs/workbench/contrib/output/browser/output.css index a17bcf1c581..89848f4f595 100644 --- a/code/src/vs/workbench/contrib/output/browser/output.css +++ b/code/src/vs/workbench/contrib/output/browser/output.css @@ -6,9 +6,9 @@ .monaco-workbench .part.panel > .content .pane-body.output-view .monaco-editor, .monaco-workbench .part.panel > .content .pane-body.output-view .monaco-editor .margin, .monaco-workbench .part.panel > .content .pane-body.output-view .monaco-editor .monaco-editor-background { - background-color: var(--vscode-outputEditor-background); + background-color: var(--vscode-outputView-background); } .monaco-workbench .part.panel > .content .pane-body.output-view .sticky-widget { - background-color: var(--vscode-outputEditorStickyScroll-background, var(--vscode-panel-background)); + background-color: var(--vscode-outputViewStickyScroll-background, var(--vscode-panel-background)); } diff --git a/code/src/vs/workbench/contrib/terminal/browser/terminal.ts b/code/src/vs/workbench/contrib/terminal/browser/terminal.ts index dcfc52dfb3e..f5dfc7d63a0 100644 --- a/code/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/code/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -22,11 +22,12 @@ import { IEditableData } from 'vs/workbench/common/views'; import { ITerminalStatusList } from 'vs/workbench/contrib/terminal/browser/terminalStatusList'; import { XtermTerminal } from 'vs/workbench/contrib/terminal/browser/xterm/xtermTerminal'; import { IRegisterContributedProfileArgs, IRemoteTerminalAttachTarget, IStartExtensionTerminalRequest, ITerminalConfiguration, ITerminalFont, ITerminalProcessExtHostProxy, ITerminalProcessInfo } from 'vs/workbench/contrib/terminal/common/terminal'; -import { EditorGroupColumn } from 'vs/workbench/services/editor/common/editorGroupColumn'; import { ISimpleSelectedSuggestion } from 'vs/workbench/services/suggest/browser/simpleSuggestWidget'; import type { IMarker, ITheme, Terminal as RawXtermTerminal } from '@xterm/xterm'; import { ScrollPosition } from 'vs/workbench/contrib/terminal/browser/xterm/markNavigationAddon'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { GroupIdentifier } from 'vs/workbench/common/editor'; +import { ACTIVE_GROUP_TYPE, AUX_WINDOW_GROUP_TYPE, SIDE_GROUP_TYPE } from 'vs/workbench/services/editor/common/editorService'; export const ITerminalService = createDecorator('terminalService'); export const ITerminalEditorService = createDecorator('terminalEditorService'); @@ -297,7 +298,8 @@ export interface ITerminalService extends ITerminalInstanceHost { getActiveOrCreateInstance(options?: { acceptsInput?: boolean }): Promise; revealActiveTerminal(preserveFocus?: boolean): Promise; - moveToEditor(source: ITerminalInstance): void; + moveToEditor(source: ITerminalInstance, group?: GroupIdentifier | SIDE_GROUP_TYPE | ACTIVE_GROUP_TYPE | AUX_WINDOW_GROUP_TYPE): void; + moveIntoNewEditor(source: ITerminalInstance): void; moveToTerminalView(source: ITerminalInstance | URI): Promise; getPrimaryBackend(): ITerminalBackend | undefined; @@ -419,7 +421,7 @@ export interface ICreateTerminalOptions { } export interface TerminalEditorLocation { - viewColumn: EditorGroupColumn; + viewColumn: GroupIdentifier | SIDE_GROUP_TYPE | ACTIVE_GROUP_TYPE | AUX_WINDOW_GROUP_TYPE; preserveFocus?: boolean; } diff --git a/code/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/code/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index 5112c6fcdad..a169a4b3154 100644 --- a/code/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/code/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -366,6 +366,14 @@ export function registerTerminalActions() { runAfter: (instances) => instances.at(-1)?.focus() }); + registerContextualInstanceAction({ + id: TerminalCommandId.MoveIntoNewWindow, + title: terminalStrings.moveIntoNewWindow, + precondition: sharedWhenClause.terminalAvailable_and_opened, + run: (instance, c) => c.service.moveIntoNewEditor(instance), + runAfter: (instances) => instances.at(-1)?.focus() + }); + registerTerminalAction({ id: TerminalCommandId.MoveToTerminalPanel, title: terminalStrings.moveToTerminalPanel, diff --git a/code/src/vs/workbench/contrib/terminal/browser/terminalMenus.ts b/code/src/vs/workbench/contrib/terminal/browser/terminalMenus.ts index 4ec76c893c1..c9097e71561 100644 --- a/code/src/vs/workbench/contrib/terminal/browser/terminalMenus.ts +++ b/code/src/vs/workbench/contrib/terminal/browser/terminalMenus.ts @@ -576,6 +576,17 @@ export function setupTerminalMenus(): void { order: 2 } }, + { + id: MenuId.TerminalTabContext, + item: { + command: { + id: TerminalCommandId.MoveIntoNewWindow, + title: terminalStrings.moveIntoNewWindow.value + }, + group: ContextMenuGroup.Create, + order: 2 + } + }, { id: MenuId.TerminalTabContext, item: { diff --git a/code/src/vs/workbench/contrib/terminal/browser/terminalService.ts b/code/src/vs/workbench/contrib/terminal/browser/terminalService.ts index fdebc10602b..bff4a07ecab 100644 --- a/code/src/vs/workbench/contrib/terminal/browser/terminalService.ts +++ b/code/src/vs/workbench/contrib/terminal/browser/terminalService.ts @@ -41,7 +41,7 @@ import { IRemoteTerminalAttachTarget, IStartExtensionTerminalRequest, ITerminalP import { TerminalContextKeys } from 'vs/workbench/contrib/terminal/common/terminalContextKey'; import { columnToEditorGroup } from 'vs/workbench/services/editor/common/editorGroupColumn'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; -import { IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; +import { ACTIVE_GROUP_TYPE, AUX_WINDOW_GROUP, AUX_WINDOW_GROUP_TYPE, IEditorService, SIDE_GROUP, SIDE_GROUP_TYPE } from 'vs/workbench/services/editor/common/editorService'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { ILifecycleService, ShutdownReason, StartupKind, WillShutdownEvent } from 'vs/workbench/services/lifecycle/common/lifecycle'; @@ -56,6 +56,7 @@ import { DetachedTerminal } from 'vs/workbench/contrib/terminal/browser/detached import { ITerminalCapabilityImplMap, TerminalCapability } from 'vs/platform/terminal/common/capabilities/capabilities'; import { createInstanceCapabilityEventMultiplexer } from 'vs/workbench/contrib/terminal/browser/terminalEvents'; import { mainWindow } from 'vs/base/browser/window'; +import { GroupIdentifier } from 'vs/workbench/common/editor'; export class TerminalService extends Disposable implements ITerminalService { declare _serviceBrand: undefined; @@ -762,7 +763,7 @@ export class TerminalService extends Disposable implements ITerminalService { return this.instances.some(term => term.processId === remoteTerm.pid); } - moveToEditor(source: ITerminalInstance): void { + moveToEditor(source: ITerminalInstance, group?: GroupIdentifier | SIDE_GROUP_TYPE | ACTIVE_GROUP_TYPE | AUX_WINDOW_GROUP_TYPE): void { if (source.target === TerminalLocation.Editor) { return; } @@ -771,7 +772,12 @@ export class TerminalService extends Disposable implements ITerminalService { return; } sourceGroup.removeInstance(source); - this._terminalEditorService.openEditor(source); + this._terminalEditorService.openEditor(source, group ? { viewColumn: group } : undefined); + + } + + moveIntoNewEditor(source: ITerminalInstance): void { + this.moveToEditor(source, AUX_WINDOW_GROUP); } async moveToTerminalView(source?: ITerminalInstance | URI, target?: ITerminalInstance, side?: 'before' | 'after'): Promise { diff --git a/code/src/vs/workbench/contrib/terminal/common/terminal.ts b/code/src/vs/workbench/contrib/terminal/common/terminal.ts index eb876639bf5..51525b5ca39 100644 --- a/code/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/code/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -481,6 +481,7 @@ export const enum TerminalCommandId { DetachSession = 'workbench.action.terminal.detachSession', MoveToEditor = 'workbench.action.terminal.moveToEditor', MoveToTerminalPanel = 'workbench.action.terminal.moveToTerminalPanel', + MoveIntoNewWindow = 'workbench.action.terminal.moveIntoNewWindow', SetDimensions = 'workbench.action.terminal.setDimensions', ClearPreviousSessionHistory = 'workbench.action.terminal.clearPreviousSessionHistory', SelectPrevSuggestion = 'workbench.action.terminal.selectPrevSuggestion', diff --git a/code/src/vs/workbench/contrib/terminal/common/terminalStrings.ts b/code/src/vs/workbench/contrib/terminal/common/terminalStrings.ts index ebe0795a239..a1003b54822 100644 --- a/code/src/vs/workbench/contrib/terminal/common/terminalStrings.ts +++ b/code/src/vs/workbench/contrib/terminal/common/terminalStrings.ts @@ -37,6 +37,10 @@ export const terminalStrings = { value: localize('moveToEditor', "Move Terminal into Editor Area"), original: 'Move Terminal into Editor Area', }, + moveIntoNewWindow: { + value: localize('moveIntoNewWindow', "Move Terminal into New Window"), + original: 'Move Terminal into New Window', + }, moveToTerminalPanel: { value: localize('workbench.action.terminal.moveToTerminalPanel', "Move Terminal into Panel"), original: 'Move Terminal into Panel' diff --git a/code/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollOverlay.ts b/code/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollOverlay.ts index 8992329a7e6..2001ba551a8 100644 --- a/code/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollOverlay.ts +++ b/code/src/vs/workbench/contrib/terminalContrib/stickyScroll/browser/terminalStickyScrollOverlay.ts @@ -258,7 +258,7 @@ export class TerminalStickyScrollOverlay extends Disposable { const stickyScrollLineCount = Math.min(promptRowCount + commandRowCount - 1, maxLineCount) - rowOffset; // Hide sticky scroll if it's currently on a line that contains it - if (buffer.viewportY === stickyScrollLineStart) { + if (buffer.viewportY <= stickyScrollLineStart) { this._setVisible(false); return; } diff --git a/code/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminal.suggest.contribution.ts b/code/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminal.suggest.contribution.ts index 3d6ba45f321..be107cefd80 100644 --- a/code/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminal.suggest.contribution.ts +++ b/code/src/vs/workbench/contrib/terminalContrib/suggest/browser/terminal.suggest.contribution.ts @@ -44,7 +44,7 @@ class TerminalSuggestContribution extends DisposableStore implements ITerminalCo this._terminalSuggestWidgetVisibleContextKey = TerminalContextKeys.suggestWidgetVisible.bindTo(this._contextKeyService); } - xtermReady(xterm: IXtermTerminal & { raw: RawXtermTerminal }): void { + xtermOpen(xterm: IXtermTerminal & { raw: RawXtermTerminal }): void { this._loadSuggestAddon(xterm.raw); this.add(this._contextKeyService.onDidChangeContext(e => { if (e.affectsSome(this._terminalSuggestWidgetContextKeys)) { diff --git a/code/src/vs/workbench/contrib/workspace/browser/workspaceTrustEditor.ts b/code/src/vs/workbench/contrib/workspace/browser/workspaceTrustEditor.ts index ffa01f3a9c5..578fe2777d7 100644 --- a/code/src/vs/workbench/contrib/workspace/browser/workspaceTrustEditor.ts +++ b/code/src/vs/workbench/contrib/workspace/browser/workspaceTrustEditor.ts @@ -155,6 +155,11 @@ class WorkspaceTrustedUrisTable extends Disposable { return localize('trustedFolderWithHostAriaLabel', "{0} on {1}, trusted", this.labelService.getUriLabel(item.uri), hostLabel); }, getWidgetAriaLabel: () => localize('trustedFoldersAndWorkspaces', "Trusted Folders & Workspaces") + }, + identityProvider: { + getId(element: ITrustedUriItem) { + return element.uri.toString(); + }, } } ) as WorkbenchTable; @@ -336,8 +341,14 @@ class WorkspaceTrustedUrisTable extends Disposable { } async delete(item: ITrustedUriItem) { + this.table.focusNext(); await this.workspaceTrustManagementService.setUrisTrust([item.uri], false); + + if (this.table.getFocus().length === 0) { + this.table.focusLast(); + } this._onDelete.fire(item); + this.table.domFocus(); } async edit(item: ITrustedUriItem, usePickerIfPossible?: boolean) { diff --git a/code/src/vs/workbench/services/auxiliaryWindow/electron-sandbox/auxiliaryWindowService.ts b/code/src/vs/workbench/services/auxiliaryWindow/electron-sandbox/auxiliaryWindowService.ts index 8f0c61b7f6b..525eb74fd2a 100644 --- a/code/src/vs/workbench/services/auxiliaryWindow/electron-sandbox/auxiliaryWindowService.ts +++ b/code/src/vs/workbench/services/auxiliaryWindow/electron-sandbox/auxiliaryWindowService.ts @@ -46,6 +46,7 @@ export class NativeAuxiliaryWindow extends AuxiliaryWindow { } e.preventDefault(); + e.returnValue = true; const confirmed = await this.instantiationService.invokeFunction(accessor => NativeWindow.confirmOnShutdown(accessor, ShutdownReason.CLOSE)); if (confirmed) { diff --git a/code/src/vs/workbench/services/host/browser/browserHostService.ts b/code/src/vs/workbench/services/host/browser/browserHostService.ts index f2bf343ca9d..982ba91d8ce 100644 --- a/code/src/vs/workbench/services/host/browser/browserHostService.ts +++ b/code/src/vs/workbench/services/host/browser/browserHostService.ts @@ -15,7 +15,7 @@ import { whenEditorClosed } from 'vs/workbench/browser/editor'; import { IWorkspace, IWorkspaceProvider } from 'vs/workbench/browser/web.api'; import { IFileService } from 'vs/platform/files/common/files'; import { ILabelService, Verbosity } from 'vs/platform/label/common/label'; -import { ModifierKeyEmitter, disposableWindowInterval, getActiveDocument, getWindowId, onDidRegisterWindow, trackFocus } from 'vs/base/browser/dom'; +import { EventType, ModifierKeyEmitter, addDisposableListener, addDisposableThrottledListener, disposableWindowInterval, getActiveDocument, getWindowId, onDidRegisterWindow, trackFocus } from 'vs/base/browser/dom'; import { Disposable } from 'vs/base/common/lifecycle'; import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService'; import { memoize } from 'vs/base/common/decorators'; @@ -39,6 +39,7 @@ import { ITextEditorOptions } from 'vs/platform/editor/common/editor'; import { IUserDataProfileService } from 'vs/workbench/services/userDataProfile/common/userDataProfile'; import { coalesce } from 'vs/base/common/arrays'; import { mainWindow, isAuxiliaryWindow } from 'vs/base/browser/window'; +import { isIOS, isMacintosh } from 'vs/base/common/platform'; enum HostShutdownReason { @@ -204,6 +205,26 @@ export class BrowserHostService extends Disposable implements IHostService { return Event.latch(emitter.event, undefined, this._store); } + @memoize + get onDidChangeFullScreen(): Event { + const emitter = this._register(new Emitter()); + + this._register(Event.runAndSubscribe(onDidRegisterWindow, ({ window, disposables }) => { + const windowId = getWindowId(window); + const viewport = isIOS && window.visualViewport ? window.visualViewport /** Visual viewport */ : window /** Layout viewport */; + + // Fullscreen (Browser) + for (const event of [EventType.FULLSCREEN_CHANGE, EventType.WK_FULLSCREEN_CHANGE]) { + disposables.add(addDisposableListener(window.document, event, () => emitter.fire(windowId))); + } + + // Fullscreen (Native) + disposables.add(addDisposableThrottledListener(viewport, EventType.RESIZE, () => emitter.fire(windowId), undefined, isMacintosh ? 2000 /* adjust for macOS animation */ : 800 /* can be throttled */)); + }, { window: mainWindow, disposables: this._store })); + + return emitter.event; + } + openWindow(options?: IOpenEmptyWindowOptions): Promise; openWindow(toOpen: IWindowOpenable[], options?: IOpenWindowOptions): Promise; openWindow(arg1?: IOpenEmptyWindowOptions | IWindowOpenable[], arg2?: IOpenWindowOptions): Promise { diff --git a/code/src/vs/workbench/services/host/browser/host.ts b/code/src/vs/workbench/services/host/browser/host.ts index a543bc9e6f4..02d7fcea201 100644 --- a/code/src/vs/workbench/services/host/browser/host.ts +++ b/code/src/vs/workbench/services/host/browser/host.ts @@ -65,6 +65,12 @@ export interface IHostService { */ readonly onDidChangeActiveWindow: Event; + /** + * Emitted when the window with the given identifier changes + * its fullscreen state. + */ + readonly onDidChangeFullScreen: Event; + /** * Opens an empty window. The optional parameter allows to define if * a new window should open or the existing one change to an empty. diff --git a/code/src/vs/workbench/services/host/electron-sandbox/nativeHostService.ts b/code/src/vs/workbench/services/host/electron-sandbox/nativeHostService.ts index 67ceabf6bc7..4cd56f09eda 100644 --- a/code/src/vs/workbench/services/host/electron-sandbox/nativeHostService.ts +++ b/code/src/vs/workbench/services/host/electron-sandbox/nativeHostService.ts @@ -94,6 +94,8 @@ class WorkbenchHostService extends Disposable implements IHostService { return Event.latch(emitter.event, undefined, this._store); } + readonly onDidChangeFullScreen = Event.filter(this.nativeHostService.onDidChangeWindowFullScreen, id => hasWindow(id), this._store); + openWindow(options?: IOpenEmptyWindowOptions): Promise; openWindow(toOpen: IWindowOpenable[], options?: IOpenWindowOptions): Promise; openWindow(arg1?: IOpenEmptyWindowOptions | IWindowOpenable[], arg2?: IOpenWindowOptions): Promise { diff --git a/code/src/vs/workbench/test/browser/workbenchTestServices.ts b/code/src/vs/workbench/test/browser/workbenchTestServices.ts index 304f39d2bcc..ceabefed273 100644 --- a/code/src/vs/workbench/test/browser/workbenchTestServices.ts +++ b/code/src/vs/workbench/test/browser/workbenchTestServices.ts @@ -1492,6 +1492,8 @@ export class TestHostService implements IHostService { private _onDidChangeWindow = new Emitter(); readonly onDidChangeActiveWindow = this._onDidChangeWindow.event; + readonly onDidChangeFullScreen: Event = Event.None; + setFocus(focus: boolean) { this._hasFocus = focus; this._onDidChangeFocus.fire(this._hasFocus); diff --git a/code/src/vs/workbench/test/electron-sandbox/workbenchTestServices.ts b/code/src/vs/workbench/test/electron-sandbox/workbenchTestServices.ts index 68707cccf06..e992583f9d6 100644 --- a/code/src/vs/workbench/test/electron-sandbox/workbenchTestServices.ts +++ b/code/src/vs/workbench/test/electron-sandbox/workbenchTestServices.ts @@ -75,6 +75,7 @@ export class TestNativeHostService implements INativeHostService { onDidChangeColorScheme = Event.None; onDidChangePassword = Event.None; onDidTriggerWindowSystemContextMenu: Event<{ windowId: number; x: number; y: number }> = Event.None; + onDidChangeWindowFullScreen = Event.None; onDidChangeDisplay = Event.None; windowCount = Promise.resolve(1); diff --git a/code/test/unit/electron/index.js b/code/test/unit/electron/index.js index a02bce4999c..f61514f72f1 100644 --- a/code/test/unit/electron/index.js +++ b/code/test/unit/electron/index.js @@ -33,7 +33,7 @@ const minimist = require('minimist'); * dev: boolean; * reporter: string; * 'reporter-options': string; - * 'wait-server': string; + * 'waitServer': string; * timeout: string; * 'crash-reporter-directory': string; * tfs: string; @@ -43,7 +43,7 @@ const minimist = require('minimist'); * }} */ const args = minimist(process.argv.slice(2), { - string: ['grep', 'run', 'runGlob', 'reporter', 'reporter-options', 'wait-server', 'timeout', 'crash-reporter-directory', 'tfs'], + string: ['grep', 'run', 'runGlob', 'reporter', 'reporter-options', 'waitServer', 'timeout', 'crash-reporter-directory', 'tfs'], boolean: ['build', 'coverage', 'help', 'dev'], alias: { 'grep': ['g', 'f'], @@ -69,7 +69,7 @@ Options: --dev, --dev-tools, --devTools open dev tools, keep window open, reuse app data --reporter the mocha reporter (default: "spec") --reporter-options the mocha reporter options (default: "") ---wait-server port to connect to and wait before running tests +--waitServer port to connect to and wait before running tests --timeout timeout for tests --crash-reporter-directory crash reporter directory --tfs TFS server URL @@ -232,8 +232,8 @@ app.on('ready', () => { win.webContents.openDevTools(); } - if (args['wait-server']) { - waitForServer(Number(args['wait-server'])).then(sendRun); + if (args.waitServer) { + waitForServer(Number(args.waitServer)).then(sendRun); } else { sendRun(); } diff --git a/code/yarn.lock b/code/yarn.lock index d246703897b..be93498e73c 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -1686,45 +1686,45 @@ resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.1.tgz#34bdc31727a1889198855913db2f270ace6d7bf8" integrity sha512-0G7tNyS+yW8TdgHwZKlDWYXFA6OJQnoLCQvYKkQP0Q2X205PSQ6RNUj0M+1OB/9gRQaUZ/ccYfaxd0nhaWKfjw== -"@xterm/addon-canvas@0.6.0-beta.19": - version "0.6.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-canvas/-/addon-canvas-0.6.0-beta.19.tgz#5f8896b884d2a558a28eb197f7f4766ac37d33a0" - integrity sha512-i+26DqYgI/PZViCiEK4Vu8c4Fi5J0i+TwnFfBDLcumHH07Al1uRd5BRaVg/i93vk6bRyEIOiOiIToXSf37ov/w== - -"@xterm/addon-image@0.7.0-beta.17": - version "0.7.0-beta.17" - resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.7.0-beta.17.tgz#bc3d6f09619ef1f3b68c7009d29ee14003a26b30" - integrity sha512-nnHVoYVoh+CpT4FQN/ALKesr96YvdVNUzQRQo4aAARUKst5DFaHQX9Yn/qLDN5s0WCqI3bgIEo8UAakfHITumA== - -"@xterm/addon-search@0.14.0-beta.19": - version "0.14.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.14.0-beta.19.tgz#2bc13378765f0d5e72d9bcb7887e23eee31de7eb" - integrity sha512-Y1pPdtdZj0xRQ/Is4jdO0dyZe+uM6AhWi3v2U4sdJmhz2mxVe/HAKBHkx6tyfMtX9ge/9ZYajd/Sy8rkjIFdmQ== - -"@xterm/addon-serialize@0.12.0-beta.19": - version "0.12.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.12.0-beta.19.tgz#465a9525a420b8f0d12eed419d6e051f9a887814" - integrity sha512-3v6a4/4gxAwoyJsBp6vJBofymgTH8paSHl8K2uQfFuLosOavNyCtrNPiNne7tpppK6t8zCDJ/mVrXNptz4Mlsg== - -"@xterm/addon-unicode11@0.7.0-beta.19": - version "0.7.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.7.0-beta.19.tgz#0e81775f84346a97c657fb4cd7702de1cfe4b83f" - integrity sha512-U5O+JLklO4qtptWAWUw14QRWdalLl0bFAQxLKuTtDmusgfn33pNDRD6RH3R+IHhO2e6svAwrw27OcCEcdn0AJQ== - -"@xterm/addon-webgl@0.17.0-beta.19": - version "0.17.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.17.0-beta.19.tgz#fefe44c20b4d4d070363e03ae33087505a88807e" - integrity sha512-L59l9Cd4KTMCwnw2HPi/cUgH4iL5dK7VERK/wSTWEGYMOi3WGTmXqsg8ftfR2jFC9P33eqYNVJDmbr+pF0XsDg== - -"@xterm/headless@5.4.0-beta.19": - version "5.4.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/headless/-/headless-5.4.0-beta.19.tgz#e84a7cebda581273032f82fc8c53941204bc7f93" - integrity sha512-y7Ne2G/Tgn6bHr14eBHqcq5gGFFCHKGBzmXTExT1Z4Fb6ofPACPWAo60S5B6uh49W4Ts13gQYZ5C0XEvHud0Eg== - -"@xterm/xterm@5.4.0-beta.19": - version "5.4.0-beta.19" - resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.4.0-beta.19.tgz#5c9c5cacd0cf2a0719086ce03ab035480b1cfd96" - integrity sha512-Rx/Y/y3YGjpiW6IUq8UlE6qrTYuUlEfpVg/BS6kIPr8/cUOchE1fsKWCMxz/u2bIyQyEovRi892iYcQJ4scstw== +"@xterm/addon-canvas@0.6.0-beta.20": + version "0.6.0-beta.20" + resolved "https://registry.yarnpkg.com/@xterm/addon-canvas/-/addon-canvas-0.6.0-beta.20.tgz#078dddef70caf880b2cb121fdda37d301fc13156" + integrity sha512-tHhsuqElE7LNiDJPbZzgVpmbcG2Dk6i2vh1EI+DzSByUWScDqLoeJbVPE5Xd2UW2garo24lxErpnIAlsytcA3A== + +"@xterm/addon-image@0.7.0-beta.18": + version "0.7.0-beta.18" + resolved "https://registry.yarnpkg.com/@xterm/addon-image/-/addon-image-0.7.0-beta.18.tgz#588ea2d0841cff48c63bde1bfcdf56e9494dc6af" + integrity sha512-+HQ+IBmHPelzjRJ5zO3XkjbeQNr2Zrf5wAlbPhy4EGSD0mDCqHJSfzZ8wKrhx7t8qpfiA8eTpWu/M76WsEnlnA== + +"@xterm/addon-search@0.14.0-beta.20": + version "0.14.0-beta.20" + resolved "https://registry.yarnpkg.com/@xterm/addon-search/-/addon-search-0.14.0-beta.20.tgz#cac366b1be1eb02cf9fe9537933f26f227d030c8" + integrity sha512-1LOL/OzWSrCBpndiBeeE2S1rxtKKgU1ucYFSG3P68W0J4VQz/Ksci1BgDKsgspj9jzpsGhdql3zwa5WEM7n4Pg== + +"@xterm/addon-serialize@0.12.0-beta.20": + version "0.12.0-beta.20" + resolved "https://registry.yarnpkg.com/@xterm/addon-serialize/-/addon-serialize-0.12.0-beta.20.tgz#5fe126194ff4dc466b92a0946e081e039a14ad21" + integrity sha512-GdRCQDjLyVNBxCFnhfCWsMmuqv2PryUkOaNl4z5MqB5lBUkiEnRNY0u/s5f34+2zrijp3h0O/f9JDLW4gSUQgw== + +"@xterm/addon-unicode11@0.7.0-beta.20": + version "0.7.0-beta.20" + resolved "https://registry.yarnpkg.com/@xterm/addon-unicode11/-/addon-unicode11-0.7.0-beta.20.tgz#5d3c97320898dd6766f2dc127deb4f071c8698c2" + integrity sha512-4/uwJ6lV/xJplT7hJc7sO4Im4XNvEXHnUEFIs03FFp8ZUfu3U6wcBk6/GoKMwJKJtGVNxotiD6ZzJ5v8IBH6nA== + +"@xterm/addon-webgl@0.17.0-beta.20": + version "0.17.0-beta.20" + resolved "https://registry.yarnpkg.com/@xterm/addon-webgl/-/addon-webgl-0.17.0-beta.20.tgz#443845ac5ac755cf762b105ed237b30426b07137" + integrity sha512-iqvXNSTfKIcO9FBraNwdO/ixPrTHok8CBN/wjlnGLv0ZMc4zLAiKE8+PHyg9ZY38QJfS+4Ouo8KsuZwoOYfnNA== + +"@xterm/headless@5.4.0-beta.20": + version "5.4.0-beta.20" + resolved "https://registry.yarnpkg.com/@xterm/headless/-/headless-5.4.0-beta.20.tgz#af26d3d0e2cdd615ccfac4a8660181fee19898fd" + integrity sha512-H/as1d67J43/CB8xt1Yg/eJMbq1yopwG1bDBKdsf2ro8A1PmJFXNzaDB+wSgoH42fCusSpLJvXtUvDLtqfvBTg== + +"@xterm/xterm@5.4.0-beta.20": + version "5.4.0-beta.20" + resolved "https://registry.yarnpkg.com/@xterm/xterm/-/xterm-5.4.0-beta.20.tgz#28bbbbc73eceb6ef3e1e095de195cf849d0cbfb6" + integrity sha512-nkY91qBy5pe1HlW9LOoLcyG6v4teEsliEtUVshAO42NrJDaPniSn28O5m5832UjZOdjLCY58QlcBkZUquODGrQ== "@xtuc/ieee754@^1.2.0": version "1.2.0"