diff --git a/src/vs/code/browser/workbench/workbench.js b/src/vs/code/browser/workbench/workbench.js index 7a76e74175b..c13ff663d53 100644 --- a/src/vs/code/browser/workbench/workbench.js +++ b/src/vs/code/browser/workbench/workbench.js @@ -25,6 +25,9 @@ paths: { 'vscode-textmate': `${window.location.origin}/node_modules/vscode-textmate/release/main`, 'onigasm-umd': `${window.location.origin}/node_modules/onigasm-umd/release/main`, + 'xterm': `${window.location.origin}/node_modules/xterm/lib/xterm.js`, + 'xterm-addon-search': `${window.location.origin}/node_modules/xterm-addon-search/lib/SearchAddon.js`, + 'xterm-addon-web-links': `${window.location.origin}/node_modules/xterm-addon-web-links/lib/WebLinksAddon.js`, } }); diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index cc5570593b5..b7d47c9db06 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -58,8 +58,6 @@ import { State as DebugState, IDebugService, IDebugSession, IConfigurationManage // tslint:disable-next-line: import-patterns import { IExtensionsWorkbenchService, IExtension as IExtension2 } from 'vs/workbench/contrib/extensions/common/extensions'; // tslint:disable-next-line: import-patterns -import { ITerminalService, ITerminalConfigHelper, ITerminalTab, ITerminalInstance, ITerminalProcessExtHostRequest } from 'vs/workbench/contrib/terminal/common/terminal'; -// tslint:disable-next-line: import-patterns import { ITaskService } from 'vs/workbench/contrib/tasks/common/taskService'; // tslint:disable-next-line: import-patterns import { TaskEvent } from 'vs/workbench/contrib/tasks/common/tasks'; @@ -417,58 +415,7 @@ export class SimpleExtensionsWorkbenchService implements IExtensionsWorkbenchSer allowedBadgeProviders: string[]; } registerSingleton(IExtensionsWorkbenchService, SimpleExtensionsWorkbenchService, true); -//#endregion - -//#region ITerminalService -export class SimpleTerminalService implements ITerminalService { - _serviceBrand: any; activeTabIndex: number; - configHelper: ITerminalConfigHelper; - onActiveTabChanged: Event = Event.None; - onTabDisposed: Event = Event.None; - onInstanceCreated: Event = Event.None; - onInstanceDisposed: Event = Event.None; - onInstanceProcessIdReady: Event = Event.None; - onInstanceDimensionsChanged: Event = Event.None; - onInstanceRequestExtHostProcess: Event = Event.None; - onInstancesChanged: Event = Event.None; - onInstanceTitleChanged: Event = Event.None; - onActiveInstanceChanged: Event = Event.None; - terminalInstances: ITerminalInstance[] = []; - terminalTabs: ITerminalTab[]; - createTerminal: any; - createTerminalRenderer: any; - createInstance: any; - getInstanceFromId: any; - getInstanceFromIndex: any; - getTabLabels: any; - getActiveInstance() { return null; } - setActiveInstance: any; - setActiveInstanceByIndex: any; - getActiveOrCreateInstance: any; - splitInstance: any; - getActiveTab: any; - setActiveTabToNext: any; - setActiveTabToPrevious: any; - setActiveTabByIndex: any; - refreshActiveTab: any; - showPanel: any; - hidePanel: any; - focusFindWidget: any; - hideFindWidget: any; - getFindState: any; - findNext: any; - findPrevious: any; - setContainers: any; - getDefaultShell: any; - selectDefaultWindowsShell: any; - setWorkspaceShellAllowed: any; - preparePathForTerminalAsync: any; - extHostReady() { } - requestExtHostProcess: any; -} -registerSingleton(ITerminalService, SimpleTerminalService, true); - -//#endregion +//#endregio //#region ITaskService export class SimpleTaskService implements ITaskService { diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index a74f0701b7b..c06734b21fa 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -32,9 +32,14 @@ import { EDITOR_FONT_DEFAULTS } from 'vs/editor/common/config/editorOptions'; import { DEFAULT_COMMANDS_TO_SKIP_SHELL } from 'vs/workbench/contrib/terminal/browser/terminalInstance'; import { TerminalService } from 'vs/workbench/contrib/terminal/browser/terminalService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { registerShellConfiguration } from 'vs/workbench/contrib/terminal/common/terminalShellConfig'; registerSingleton(ITerminalService, TerminalService, true); +if (platform.isWeb) { + registerShellConfiguration(); +} + const quickOpenRegistry = (Registry.as(QuickOpenExtensions.Quickopen)); const inTerminalsPicker = 'inTerminalPicker'; diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index fafb52086c5..06295c9666a 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -12,6 +12,11 @@ import { IProcessEnvironment, Platform } from 'vs/base/common/platform'; export const ITerminalInstanceService = createDecorator('terminalInstanceService'); +/** + * A service used by TerminalInstance (and components owned by it) that allows it to break its + * dependency on electron-browser and node layers, while at the same time avoiding a cyclic + * dependency on ITerminalService. + */ export interface ITerminalInstanceService { _serviceBrand: any; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts new file mode 100644 index 00000000000..b9bd8954a3c --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstanceService.ts @@ -0,0 +1,53 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal'; +import { IWindowsShellHelper, ITerminalChildProcess } from 'vs/workbench/contrib/terminal/common/terminal'; +import { Terminal as XTermTerminal } from 'xterm'; +import { WebLinksAddon as XTermWebLinksAddon } from 'xterm-addon-web-links'; +import { SearchAddon as XTermSearchAddon } from 'xterm-addon-search'; + +let Terminal: typeof XTermTerminal; +let WebLinksAddon: typeof XTermWebLinksAddon; +let SearchAddon: typeof XTermSearchAddon; + +export class TerminalInstanceService implements ITerminalInstanceService { + public _serviceBrand: any; + + constructor() { } + + public async getXtermConstructor(): Promise { + if (!Terminal) { + Terminal = (await import('xterm')).Terminal; + } + return Terminal; + } + + public async getXtermWebLinksConstructor(): Promise { + if (!WebLinksAddon) { + WebLinksAddon = (await import('xterm-addon-web-links')).WebLinksAddon; + } + return WebLinksAddon; + } + + public async getXtermSearchConstructor(): Promise { + if (!SearchAddon) { + SearchAddon = (await import('xterm-addon-search')).SearchAddon; + } + return SearchAddon; + } + + public createWindowsShellHelper(): IWindowsShellHelper { + throw new Error('Not implemented'); + } + + public createTerminalProcess(): ITerminalChildProcess { + throw new Error('Not implemented'); + } + + public getDefaultShell(): string { + throw new Error('Not implemented'); + } +} \ No newline at end of file diff --git a/src/vs/workbench/contrib/terminal/browser/terminalNativeService.ts b/src/vs/workbench/contrib/terminal/browser/terminalNativeService.ts new file mode 100644 index 00000000000..0e2849731fc --- /dev/null +++ b/src/vs/workbench/contrib/terminal/browser/terminalNativeService.ts @@ -0,0 +1,37 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IOpenFileRequest } from 'vs/platform/windows/common/windows'; +import { ITerminalNativeService, LinuxDistro } from 'vs/workbench/contrib/terminal/common/terminal'; +import { Emitter, Event } from 'vs/base/common/event'; + +export class TerminalNativeService implements ITerminalNativeService { + public _serviceBrand: any; + + public get linuxDistro(): LinuxDistro { return LinuxDistro.Unknown; } + + private readonly _onOpenFileRequest = new Emitter(); + public get onOpenFileRequest(): Event { return this._onOpenFileRequest.event; } + private readonly _onOsResume = new Emitter(); + public get onOsResume(): Event { return this._onOsResume.event; } + + constructor() { } + + public whenFileDeleted(): Promise { + throw new Error('Not implemented'); + } + + public selectDefaultWindowsShell(): Promise { + throw new Error('Not implemented'); + } + + public getWslPath(): Promise { + throw new Error('Not implemented'); + } + + public getWindowsBuildNumber(): number { + throw new Error('Not implemented'); + } +} \ No newline at end of file diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index e1ac8c6193e..5fd9248c115 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -295,7 +295,6 @@ export interface ITerminalNativeService { readonly onOpenFileRequest: Event; readonly onOsResume: Event; - getDefaultShell(p: Platform): string; getWindowsBuildNumber(): number; whenFileDeleted(path: URI): Promise; getWslPath(path: string): Promise; diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts index 0fcb7cf8a84..e0e69912cbc 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstanceService.ts @@ -18,11 +18,6 @@ let Terminal: typeof XTermTerminal; let WebLinksAddon: typeof XTermWebLinksAddon; let SearchAddon: typeof XTermSearchAddon; -/** - * A service used by TerminalInstance (and components owned by it) that allows it to break its - * dependency on electron-browser and node layers, while at the same time avoiding a cyclic - * dependency on ITerminalService. - */ export class TerminalInstanceService implements ITerminalInstanceService { public _serviceBrand: any; diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService.ts index a2965039722..68b7462447a 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService.ts @@ -9,8 +9,7 @@ import { IOpenFileRequest } from 'vs/platform/windows/common/windows'; import { ITerminalNativeService, LinuxDistro } from 'vs/workbench/contrib/terminal/common/terminal'; import { URI } from 'vs/base/common/uri'; import { IFileService } from 'vs/platform/files/common/files'; -import { Platform } from 'vs/base/common/platform'; -import { getDefaultShell, getWindowsBuildNumber, linuxDistro } from 'vs/workbench/contrib/terminal/node/terminal'; +import { getWindowsBuildNumber, linuxDistro } from 'vs/workbench/contrib/terminal/node/terminal'; import { IQuickPickItem, IPickOptions, IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { escapeNonWindowsPath } from 'vs/workbench/contrib/terminal/common/terminalEnvironment'; import { execFile } from 'child_process'; @@ -59,10 +58,6 @@ export class TerminalNativeService implements ITerminalNativeService { }); } - public getDefaultShell(p: Platform): string { - return getDefaultShell(p); - } - public selectDefaultWindowsShell(): Promise { return this._detectWindowsShells().then(shells => { const options: IPickOptions = { @@ -140,7 +135,7 @@ export class TerminalNativeService implements ITerminalNativeService { }); } - protected _validateShellPaths(label: string, potentialPaths: string[]): Promise<[string, string] | null> { + private _validateShellPaths(label: string, potentialPaths: string[]): Promise<[string, string] | null> { if (potentialPaths.length === 0) { return Promise.resolve(null); } diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index 460b2419aa3..8e33ccc2dc0 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -261,10 +261,11 @@ import 'vs/workbench/contrib/output/browser/output.contribution'; import 'vs/workbench/contrib/output/browser/outputPanel'; // Terminal -// import 'vs/workbench/contrib/terminal/browser/terminal.contribution'; -// import 'vs/workbench/contrib/terminal/electron-browser/terminal.contribution'; -// import 'vs/workbench/contrib/terminal/browser/terminalQuickOpen'; -// import 'vs/workbench/contrib/terminal/browser/terminalPanel'; +import 'vs/workbench/contrib/terminal/browser/terminal.contribution'; +import 'vs/workbench/contrib/terminal/browser/terminalQuickOpen'; +import 'vs/workbench/contrib/terminal/browser/terminalPanel'; +registerSingleton(ITerminalNativeService, TerminalNativeService, true); +registerSingleton(ITerminalInstanceService, TerminalInstanceService, true); // Relauncher // import 'vs/workbench/contrib/relauncher/electron-browser/relauncher.contribution'; @@ -326,6 +327,10 @@ import 'vs/workbench/contrib/outline/browser/outline.contribution'; import { IWebviewService } from 'vs/workbench/contrib/webview/common/webview'; import { NullWebviewService } from 'vs/workbench/contrib/webview/browser/webviewService'; import { IWebviewEditorService, WebviewEditorService } from 'vs/workbench/contrib/webview/browser/webviewEditorService'; +import { ITerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminal'; +import { ITerminalNativeService } from 'vs/workbench/contrib/terminal/common/terminal'; +import { TerminalNativeService } from 'vs/workbench/contrib/terminal/browser/terminalNativeService'; +import { TerminalInstanceService } from 'vs/workbench/contrib/terminal/browser/terminalInstanceService'; // Experiments // import 'vs/workbench/contrib/experiments/electron-browser/experiments.contribution';