From 156db3ec27ce3f38dbdf383ca47bd1dfce4396ac Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Mon, 1 Apr 2024 09:56:15 -0700 Subject: [PATCH 1/8] Remove xterm triggerDataEvent private API usage --- .eslintrc.json | 6 +++++- .../workbench/contrib/terminal/browser/xterm-private.d.ts | 4 ---- src/vs/workbench/services/driver/browser/driver.ts | 5 +++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 61d778150f1..7b8936e0703 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -856,7 +856,11 @@ }, // TODO@layers "tas-client-umd", // node module allowed even in /common/ "vscode-textmate", // node module allowed even in /common/ - "@vscode/vscode-languagedetection" // node module allowed even in /common/ + "@vscode/vscode-languagedetection", // node module allowed even in /common/ + { + "when": "hasBrowser", + "pattern": "@xterm/xterm" + } // node module allowed even in /browser/ ] }, { diff --git a/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts b/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts index f361d56eb88..ba7848d6843 100644 --- a/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts +++ b/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts @@ -22,10 +22,6 @@ export interface IXtermCore { height: number; }; - coreService: { - triggerDataEvent(data: string, wasUserInput?: boolean): void; - }; - _inputHandler: { _curAttrData: XtermAttributes; }; diff --git a/src/vs/workbench/services/driver/browser/driver.ts b/src/vs/workbench/services/driver/browser/driver.ts index 7b63e054bb1..f9d0ea0eaba 100644 --- a/src/vs/workbench/services/driver/browser/driver.ts +++ b/src/vs/workbench/services/driver/browser/driver.ts @@ -17,6 +17,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { IWindowDriver, IElement, ILocaleInfo, ILocalizedStrings } from 'vs/workbench/services/driver/common/driver'; import { ILifecycleService, LifecyclePhase } from 'vs/workbench/services/lifecycle/common/lifecycle'; +import type { Terminal as XtermTerminal } from '@xterm/xterm'; export class BrowserWindowDriver implements IWindowDriver { @@ -174,13 +175,13 @@ export class BrowserWindowDriver implements IWindowDriver { throw new Error(`Element not found: ${selector}`); } - const xterm = (element as any).xterm; + const xterm = (element as any).xterm as XtermTerminal; if (!xterm) { throw new Error(`Xterm not found: ${selector}`); } - xterm._core.coreService.triggerDataEvent(text); + xterm.input(text); } getLocaleInfo(): Promise { From 34bc7d4da690463c83d7d9f802ad06ec3d67820d Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Mon, 1 Apr 2024 09:57:01 -0700 Subject: [PATCH 2/8] Make types more correct --- src/vs/workbench/services/driver/browser/driver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/services/driver/browser/driver.ts b/src/vs/workbench/services/driver/browser/driver.ts index f9d0ea0eaba..13ddd13f671 100644 --- a/src/vs/workbench/services/driver/browser/driver.ts +++ b/src/vs/workbench/services/driver/browser/driver.ts @@ -175,7 +175,7 @@ export class BrowserWindowDriver implements IWindowDriver { throw new Error(`Element not found: ${selector}`); } - const xterm = (element as any).xterm as XtermTerminal; + const xterm = (element as any).xterm as (XtermTerminal | undefined); if (!xterm) { throw new Error(`Xterm not found: ${selector}`); From 28d47a5695157d5d1a4fe12ba27dfce19b9ac0b2 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Mon, 1 Apr 2024 09:59:26 -0700 Subject: [PATCH 3/8] Remove _onData access --- .../terminal/browser/xterm-private.d.ts | 1 - .../partialCommandDetectionCapability.test.ts | 23 ++++++++----------- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts b/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts index ba7848d6843..5f1b20f42db 100644 --- a/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts +++ b/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts @@ -14,7 +14,6 @@ export interface IXtermCore { readonly scrollBarWidth: number; _innerRefresh(): void; }; - _onData: IEventEmitter; _onKey: IEventEmitter<{ key: string }>; _charSizeService: { diff --git a/src/vs/workbench/contrib/terminal/test/browser/capabilities/partialCommandDetectionCapability.test.ts b/src/vs/workbench/contrib/terminal/test/browser/capabilities/partialCommandDetectionCapability.test.ts index e37020815fd..016da9ab599 100644 --- a/src/vs/workbench/contrib/terminal/test/browser/capabilities/partialCommandDetectionCapability.test.ts +++ b/src/vs/workbench/contrib/terminal/test/browser/capabilities/partialCommandDetectionCapability.test.ts @@ -3,20 +3,15 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { deepStrictEqual } from 'assert'; -import { PartialCommandDetectionCapability } from 'vs/platform/terminal/common/capabilities/partialCommandDetectionCapability'; import type { IMarker, Terminal } from '@xterm/xterm'; -import { IXtermCore } from 'vs/workbench/contrib/terminal/browser/xterm-private'; +import { deepStrictEqual } from 'assert'; import { importAMDNodeModule } from 'vs/amdX'; -import { writeP } from 'vs/workbench/contrib/terminal/browser/terminalTestHelpers'; import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; - -interface TestTerminal extends Terminal { - _core: IXtermCore; -} +import { PartialCommandDetectionCapability } from 'vs/platform/terminal/common/capabilities/partialCommandDetectionCapability'; +import { writeP } from 'vs/workbench/contrib/terminal/browser/terminalTestHelpers'; suite('PartialCommandDetectionCapability', () => { - let xterm: TestTerminal; + let xterm: Terminal; let capability: PartialCommandDetectionCapability; let addEvents: IMarker[]; @@ -28,7 +23,7 @@ suite('PartialCommandDetectionCapability', () => { setup(async () => { const TerminalCtor = (await importAMDNodeModule('@xterm/xterm', 'lib/xterm.js')).Terminal; - xterm = new TerminalCtor({ allowProposedApi: true, cols: 80 }) as TestTerminal; + xterm = new TerminalCtor({ allowProposedApi: true, cols: 80 }) as Terminal; capability = new PartialCommandDetectionCapability(xterm); addEvents = []; capability.onCommandFinished(e => addEvents.push(e)); @@ -38,11 +33,11 @@ suite('PartialCommandDetectionCapability', () => { test('should not add commands when the cursor position is too close to the left side', async () => { assertCommands([]); - xterm._core._onData.fire('\x0d'); + xterm.input('\x0d'); await writeP(xterm, '\r\n'); assertCommands([]); await writeP(xterm, 'a'); - xterm._core._onData.fire('\x0d'); + xterm.input('\x0d'); await writeP(xterm, '\r\n'); assertCommands([]); }); @@ -50,11 +45,11 @@ suite('PartialCommandDetectionCapability', () => { test('should add commands when the cursor position is not too close to the left side', async () => { assertCommands([]); await writeP(xterm, 'ab'); - xterm._core._onData.fire('\x0d'); + xterm.input('\x0d'); await writeP(xterm, '\r\n\r\n'); assertCommands([0]); await writeP(xterm, 'cd'); - xterm._core._onData.fire('\x0d'); + xterm.input('\x0d'); await writeP(xterm, '\r\n'); assertCommands([0, 2]); }); From b6afddd5c5877dfd20db7723829965574ccfe501 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Mon, 1 Apr 2024 10:00:42 -0700 Subject: [PATCH 4/8] Remove _onKey access --- src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts b/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts index 5f1b20f42db..b3fc1aa3bc2 100644 --- a/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts +++ b/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts @@ -14,7 +14,6 @@ export interface IXtermCore { readonly scrollBarWidth: number; _innerRefresh(): void; }; - _onKey: IEventEmitter<{ key: string }>; _charSizeService: { width: number; From cdbe485a21639345d5b32e43ec7c01d921ad6f07 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Mon, 1 Apr 2024 10:01:02 -0700 Subject: [PATCH 5/8] Remove _charSizeService access --- src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts b/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts index b3fc1aa3bc2..4e0c2fbc948 100644 --- a/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts +++ b/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts @@ -15,11 +15,6 @@ export interface IXtermCore { _innerRefresh(): void; }; - _charSizeService: { - width: number; - height: number; - }; - _inputHandler: { _curAttrData: XtermAttributes; }; From ad545a18d3453df77dfc0b5422c5476055514270 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Mon, 1 Apr 2024 10:02:05 -0700 Subject: [PATCH 6/8] Remove unneeded lint suppression --- src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts b/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts index 4e0c2fbc948..3edf8d4e81b 100644 --- a/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts +++ b/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -/* eslint-disable @typescript-eslint/naming-convention */ - import { IBufferCell } from '@xterm/xterm'; export type XtermAttributes = Omit & { clone?(): XtermAttributes }; From 64aa2c302f696f81260be934eb15c8dde358dc7d Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Mon, 1 Apr 2024 10:04:04 -0700 Subject: [PATCH 7/8] Remove unused event emitter type --- src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts b/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts index 3edf8d4e81b..def513b7343 100644 --- a/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts +++ b/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts @@ -34,7 +34,3 @@ export interface IXtermCore { _handleIntersectionChange: any; }; } - -export interface IEventEmitter { - fire(e: T): void; -} From ee7fe256388d4dd083ac4f825e5fa3fe6fe509b5 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Mon, 1 Apr 2024 10:07:33 -0700 Subject: [PATCH 8/8] Remove hack for canvas to force a refresh I can no longer reproduce this issue and it was a big hack regardless. Will track issues for any mentioned of bad resizes on the canvas renderer. --- .../contrib/terminal/browser/terminalInstance.ts | 4 ---- .../contrib/terminal/browser/xterm-private.d.ts | 1 - .../contrib/terminal/browser/xterm/xtermTerminal.ts | 13 ------------- 3 files changed, 18 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index 4f8a9666bad..9b8ab36873d 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -1859,10 +1859,6 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { this.xterm.raw.resize(cols, rows); TerminalInstance._lastKnownGridDimensions = { cols, rows }; - - if (this._isVisible) { - this.xterm.forceUnpause(); - } } if (immediate) { diff --git a/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts b/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts index def513b7343..f4e1a0b0bbb 100644 --- a/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts +++ b/src/vs/workbench/contrib/terminal/browser/xterm-private.d.ts @@ -31,6 +31,5 @@ export interface IXtermCore { _renderLayers?: any[]; } }; - _handleIntersectionChange: any; }; } diff --git a/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts b/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts index 47fce3bee4d..663a7fb8b62 100644 --- a/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts @@ -446,19 +446,6 @@ export class XtermTerminal extends Disposable implements IXtermTerminal, IDetach this._core.viewport?._innerRefresh(); } - forceUnpause() { - // HACK: Force the renderer to unpause by simulating an IntersectionObserver event. - // 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._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); - } - } - async findNext(term: string, searchOptions: ISearchOptions): Promise { this._updateFindColors(searchOptions); return (await this._getSearchAddon()).findNext(term, searchOptions);