mirror of
https://github.com/microsoft/vscode.git
synced 2026-04-23 01:58:53 +01:00
49 lines
2.4 KiB
TypeScript
49 lines
2.4 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
import { generateUuid } from 'vs/base/common/uuid';
|
|
import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService';
|
|
import { BaseExtHostTerminalService, ExtHostTerminal, ITerminalInternalOptions } from 'vs/workbench/api/common/extHostTerminalService';
|
|
import { TerminalLocation } from 'vs/workbench/api/common/extHostTypes';
|
|
import type * as vscode from 'vscode';
|
|
|
|
export class ExtHostTerminalService extends BaseExtHostTerminalService {
|
|
|
|
constructor(
|
|
@IExtHostRpcService extHostRpc: IExtHostRpcService
|
|
) {
|
|
super(true, extHostRpc);
|
|
}
|
|
|
|
public createTerminal(name?: string, shellPath?: string, shellArgs?: string[] | string): vscode.Terminal {
|
|
return this.createTerminalFromOptions({ name, shellPath, shellArgs });
|
|
}
|
|
|
|
public createTerminalFromOptions(options: vscode.TerminalOptions, internalOptions?: ITerminalInternalOptions): vscode.Terminal {
|
|
const terminal = new ExtHostTerminal(this._proxy, generateUuid(), options, options.name);
|
|
this._terminals.push(terminal);
|
|
terminal.create(options, this._serializeParentTerminal(options, internalOptions));
|
|
return terminal.value;
|
|
}
|
|
|
|
private _serializeParentTerminal(options: vscode.TerminalOptions, internalOptions?: ITerminalInternalOptions): ITerminalInternalOptions {
|
|
internalOptions = internalOptions ? internalOptions : {};
|
|
if (options.location && typeof options.location === 'object' && 'parentTerminal' in options.location) {
|
|
const parentTerminal = options.location.parentTerminal;
|
|
if (parentTerminal) {
|
|
const parentExtHostTerminal = this._terminals.find(t => t.value === parentTerminal);
|
|
if (parentExtHostTerminal) {
|
|
internalOptions.resolvedExtHostIdentifier = parentExtHostTerminal._id;
|
|
}
|
|
}
|
|
} else if (!internalOptions.splitActiveTerminal && options.location === TerminalLocation.Editor || options.location === TerminalLocation.Panel) {
|
|
internalOptions.location = options.location;
|
|
} else if (internalOptions.splitActiveTerminal) {
|
|
internalOptions.location = { splitActiveTerminal: true };
|
|
}
|
|
return internalOptions;
|
|
}
|
|
}
|