diff --git a/src/vs/code/electron-main/windows.ts b/src/vs/code/electron-main/windows.ts index eaaa5fadb4f6..2be579f6e60c 100644 --- a/src/vs/code/electron-main/windows.ts +++ b/src/vs/code/electron-main/windows.ts @@ -537,7 +537,7 @@ export class WindowsManager implements IWindowsMainService { else { // Do open files - usedWindows.push(this.doOpenFilesInExistingWindow(bestWindowOrFolder, filesToOpen, filesToCreate, filesToDiff, filesToWait)); + usedWindows.push(this.doOpenFilesInExistingWindow(openConfig, bestWindowOrFolder, filesToOpen, filesToCreate, filesToDiff, filesToWait)); // Reset these because we handled them filesToOpen = []; @@ -583,7 +583,7 @@ export class WindowsManager implements IWindowsMainService { const windowOnWorkspace = windowsOnWorkspace[0]; // Do open files - usedWindows.push(this.doOpenFilesInExistingWindow(windowOnWorkspace, filesToOpen, filesToCreate, filesToDiff, filesToWait)); + usedWindows.push(this.doOpenFilesInExistingWindow(openConfig, windowOnWorkspace, filesToOpen, filesToCreate, filesToDiff, filesToWait)); // Reset these because we handled them filesToOpen = []; @@ -623,7 +623,7 @@ export class WindowsManager implements IWindowsMainService { const windowOnFolderPath = windowsOnFolderPath[0]; // Do open files - usedWindows.push(this.doOpenFilesInExistingWindow(windowOnFolderPath, filesToOpen, filesToCreate, filesToDiff, filesToWait)); + usedWindows.push(this.doOpenFilesInExistingWindow(openConfig, windowOnFolderPath, filesToOpen, filesToCreate, filesToDiff, filesToWait)); // Reset these because we handled them filesToOpen = []; @@ -695,11 +695,12 @@ export class WindowsManager implements IWindowsMainService { return arrays.distinct(usedWindows); } - private doOpenFilesInExistingWindow(window: ICodeWindow, filesToOpen: IPath[], filesToCreate: IPath[], filesToDiff: IPath[], filesToWait: IPathsToWaitFor): ICodeWindow { + private doOpenFilesInExistingWindow(configuration: IOpenConfiguration, window: ICodeWindow, filesToOpen: IPath[], filesToCreate: IPath[], filesToDiff: IPath[], filesToWait: IPathsToWaitFor): ICodeWindow { window.focus(); // make sure window has focus window.ready().then(readyWindow => { - readyWindow.send('vscode:openFiles', { filesToOpen, filesToCreate, filesToDiff, filesToWait }); + const termProgram = configuration.userEnv ? configuration.userEnv['TERM_PROGRAM'] : void 0; + readyWindow.send('vscode:openFiles', { filesToOpen, filesToCreate, filesToDiff, filesToWait, termProgram }); }); return window; diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index fe10550cacaf..5c04d8c06404 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -294,6 +294,7 @@ export interface IOpenFileRequest { filesToCreate?: IPath[]; filesToDiff?: IPath[]; filesToWait?: IPathsToWaitFor; + termProgram?: string; } export interface IAddFoldersRequest { diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts index 5667a99df124..21926d694f00 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts @@ -28,6 +28,9 @@ import { PANEL_BACKGROUND, PANEL_BORDER } from 'vs/workbench/common/theme'; import { TERMINAL_BACKGROUND_COLOR, TERMINAL_BORDER_COLOR } from 'vs/workbench/parts/terminal/electron-browser/terminalColorRegistry'; import { DataTransfers } from 'vs/base/browser/dnd'; import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; +import { ipcRenderer as ipc } from 'electron'; +import { IOpenFileRequest } from 'vs/platform/windows/common/windows'; +import { whenDeleted } from 'vs/base/node/pfs'; export class TerminalPanel extends Panel { @@ -83,6 +86,15 @@ export class TerminalPanel extends Panel { this._updateFont(); this._updateTheme(); + ipc.on('vscode:openFiles', (_event: any, request: IOpenFileRequest) => { + // if the request to open files is coming in from the integrated terminal (identified though + // the termProgram variable) and we are instructed to wait for editors close, wait for the + // marker file to get deleted and then focus back to the integrated terminal. + if (request.termProgram === 'vscode' && request.filesToWait) { + whenDeleted(request.filesToWait.waitMarkerFilePath).then(() => this.focus()); + } + }); + // Force another layout (first is setContainers) since config has changed this.layout(new Dimension(this._terminalContainer.offsetWidth, this._terminalContainer.offsetHeight)); return TPromise.as(void 0);