From b7eefb7e8ce81f378dd0b97d9c033c2d2e9ff5e0 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 6 Mar 2017 10:55:15 +0100 Subject: [PATCH] :sparkles: command to toggle shared process --- src/vs/code/electron-main/main.ts | 2 +- src/vs/code/electron-main/sharedProcess.ts | 21 +++++++++++++++++-- src/vs/platform/windows/common/windows.ts | 3 +++ src/vs/platform/windows/common/windowsIpc.ts | 7 +++++++ .../windows/electron-main/windowsService.ts | 10 +++++++++ src/vs/workbench/electron-browser/actions.ts | 14 +++++++++++++ src/vs/workbench/electron-browser/window.ts | 3 ++- .../workbench/test/workbenchTestServices.ts | 5 +++-- 8 files changed, 59 insertions(+), 6 deletions(-) diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index a5653f4c2a8..7b2c1a229a2 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -155,7 +155,7 @@ function main(accessor: ServicesAccessor, mainIpcServer: Server, userEnv: platfo services.set(IUpdateService, new SyncDescriptor(UpdateService)); services.set(IWindowsMainService, new SyncDescriptor(WindowsManager)); - services.set(IWindowsService, new SyncDescriptor(WindowsService)); + services.set(IWindowsService, new SyncDescriptor(WindowsService, sharedProcess)); services.set(ILaunchService, new SyncDescriptor(LaunchService)); if (environmentService.isBuilt && !environmentService.isExtensionDevelopment && !!product.enableTelemetry) { diff --git a/src/vs/code/electron-main/sharedProcess.ts b/src/vs/code/electron-main/sharedProcess.ts index 55958ee84b1..45c7a301dda 100644 --- a/src/vs/code/electron-main/sharedProcess.ts +++ b/src/vs/code/electron-main/sharedProcess.ts @@ -24,8 +24,7 @@ export class SharedProcess { const url = `${require.toUrl('vs/code/electron-browser/sharedProcess.html')}?config=${encodeURIComponent(JSON.stringify(config))}`; this.window.loadURL(url); - // this.window.webContents.openDevTools(); - this.window.hide(); + this.hide(); // Prevent the window from dying this.window.on('close', e => { @@ -49,6 +48,24 @@ export class SharedProcess { private nodeCachedDataDir: string ) { } + toggle(): void { + if (this.window.isVisible()) { + this.hide(); + } else { + this.show(); + } + } + + show(): void { + this.window.show(); + this.window.webContents.openDevTools(); + } + + hide(): void { + this.window.webContents.closeDevTools(); + this.window.hide(); + } + dispose(): void { if (this.window) { this.window.close(); diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index df64227750e..58588327549 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -39,6 +39,9 @@ export interface IWindowsService { quit(): TPromise; relaunch(options: { addArgs?: string[], removeArgs?: string[] }): TPromise; + // Shared process + toggleSharedProcess(): TPromise; + // Global methods openWindow(paths: string[], options?: { forceNewWindow?: boolean, forceReuseWindow?: boolean }): TPromise; openNewWindow(): TPromise; diff --git a/src/vs/platform/windows/common/windowsIpc.ts b/src/vs/platform/windows/common/windowsIpc.ts index 45665b734f2..2176e6672cf 100644 --- a/src/vs/platform/windows/common/windowsIpc.ts +++ b/src/vs/platform/windows/common/windowsIpc.ts @@ -36,6 +36,8 @@ export interface IWindowsChannel extends IChannel { call(command: 'showWindow', arg: number): TPromise; call(command: 'getWindows'): TPromise<{ id: number; path: string; title: string; }[]>; call(command: 'getWindowCount'): TPromise; + call(command: 'relaunch', arg: { addArgs?: string[], removeArgs?: string[] }): TPromise; + call(command: 'toggleSharedProcess'): TPromise; call(command: 'log', arg: [string, string[]]): TPromise; call(command: 'closeExtensionHostWindow', arg: string): TPromise; call(command: 'showItemInFolder', arg: string): TPromise; @@ -81,6 +83,7 @@ export class WindowsChannel implements IWindowsChannel { case 'getWindows': return this.service.getWindows(); case 'getWindowCount': return this.service.getWindowCount(); case 'relaunch': return this.service.relaunch(arg[0]); + case 'toggleSharedProcess': return this.service.toggleSharedProcess(); case 'quit': return this.service.quit(); case 'log': return this.service.log(arg[0], arg[1]); case 'closeExtensionHostWindow': return this.service.closeExtensionHostWindow(arg); @@ -180,6 +183,10 @@ export class WindowsChannelClient implements IWindowsService { return this.channel.call('relaunch', [options]); } + toggleSharedProcess(): TPromise { + return this.channel.call('toggleSharedProcess'); + } + openWindow(paths: string[], options?: { forceNewWindow?: boolean, forceReuseWindow?: boolean }): TPromise { return this.channel.call('openWindow', [paths, options]); } diff --git a/src/vs/platform/windows/electron-main/windowsService.ts b/src/vs/platform/windows/electron-main/windowsService.ts index 3727fd66516..37d48abfe25 100644 --- a/src/vs/platform/windows/electron-main/windowsService.ts +++ b/src/vs/platform/windows/electron-main/windowsService.ts @@ -20,6 +20,10 @@ import { ITelemetryData } from 'vs/platform/telemetry/common/telemetry'; import { OpenContext } from 'vs/code/common/windows'; import { IWindowsMainService } from 'vs/code/electron-main/windows'; +export interface ISharedProcess { + toggle(): void; +} + export class WindowsService implements IWindowsService, IDisposable { _serviceBrand: any; @@ -30,6 +34,7 @@ export class WindowsService implements IWindowsService, IDisposable { onWindowFocus: Event = fromEventEmitter(app, 'browser-window-focus', (_, w: Electron.BrowserWindow) => w.id); constructor( + private sharedProcess: ISharedProcess, @IWindowsMainService private windowsMainService: IWindowsMainService, @IEnvironmentService private environmentService: IEnvironmentService, @IURLService urlService: IURLService @@ -282,6 +287,11 @@ export class WindowsService implements IWindowsService, IDisposable { return TPromise.as(null); } + toggleSharedProcess(): TPromise { + this.sharedProcess.toggle(); + return TPromise.as(null); + } + private openFileForURI(filePath: string): TPromise { const cli = assign(Object.create(null), this.environmentService.args, { goto: true }); const pathsToOpen = [filePath]; diff --git a/src/vs/workbench/electron-browser/actions.ts b/src/vs/workbench/electron-browser/actions.ts index cd4bdb789ac..86eac1ce0f1 100644 --- a/src/vs/workbench/electron-browser/actions.ts +++ b/src/vs/workbench/electron-browser/actions.ts @@ -905,3 +905,17 @@ export class OpenIntroductoryVideosUrlAction extends Action { return null; } } + +export class ToggleSharedProcessAction extends Action { + + static ID = 'workbench.action.toggleSharedProcess'; + static LABEL = nls.localize('toggleSharedProcess', "Toggle Shared Process"); + + constructor(id: string, label: string, @IWindowsService private windowsService: IWindowsService) { + super(id, label); + } + + run(): TPromise { + return this.windowsService.toggleSharedProcess(); + } +} \ No newline at end of file diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index 701447f2503..aff1ba12667 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -40,7 +40,7 @@ import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/action import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { IThemeService, VS_HC_THEME, VS_DARK_THEME } from 'vs/workbench/services/themes/common/themeService'; import * as browser from 'vs/base/browser/browser'; -import { ReloadWindowAction, ToggleDevToolsAction, ShowStartupPerformance, OpenRecentAction } from 'vs/workbench/electron-browser/actions'; +import { ReloadWindowAction, ToggleDevToolsAction, ShowStartupPerformance, OpenRecentAction, ToggleSharedProcessAction } from 'vs/workbench/electron-browser/actions'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; @@ -335,6 +335,7 @@ export class ElectronWindow { workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ReloadWindowAction, ReloadWindowAction.ID, ReloadWindowAction.LABEL, isDeveloping ? { primary: KeyMod.CtrlCmd | KeyCode.KEY_R } : void 0), 'Reload Window'); workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleDevToolsAction, ToggleDevToolsAction.ID, ToggleDevToolsAction.LABEL, isDeveloping ? { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_I, mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_I } } : void 0), 'Developer: Toggle Developer Tools', developerCategory); workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ShowStartupPerformance, ShowStartupPerformance.ID, ShowStartupPerformance.LABEL), 'Developer: Startup Performance', developerCategory); + workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleSharedProcessAction, ToggleSharedProcessAction.ID, ToggleSharedProcessAction.LABEL), 'Developer: Toggle Shared Process', developerCategory); // Action registered here to prevent a keybinding conflict with reload window const fileCategory = nls.localize('file', "File"); diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index 9276d24beec..95e8330204c 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -915,11 +915,12 @@ export class TestWindowsService implements IWindowsService { quit(): TPromise { return TPromise.as(void 0); } - relaunch(options: { addArgs?: string[], removeArgs?: string[] }): TPromise { return TPromise.as(void 0); } - + toggleSharedProcess(): TPromise { + return TPromise.as(void 0); + } // Global methods openWindow(paths: string[], options?: { forceNewWindow?: boolean, forceReuseWindow?: boolean }): TPromise { return TPromise.as(void 0);