/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { IWindowsMainService } from 'vs/platform/windows/electron-main/windows'; import { MessageBoxOptions, MessageBoxReturnValue, shell, OpenDevToolsOptions, SaveDialogOptions, SaveDialogReturnValue, OpenDialogOptions, OpenDialogReturnValue, CrashReporterStartOptions, crashReporter, Menu } from 'electron'; import { ILifecycleMainService } from 'vs/platform/lifecycle/electron-main/lifecycleMainService'; import { OpenContext, INativeOpenDialogOptions } from 'vs/platform/windows/common/windows'; import { isMacintosh } from 'vs/base/common/platform'; import { IElectronService } from 'vs/platform/electron/node/electron'; import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; import { AddContextToFunctions } from 'vs/platform/ipc/node/simpleIpcProxy'; export class ElectronMainService implements AddContextToFunctions { _serviceBrand: undefined; constructor( @IWindowsMainService private readonly windowsMainService: IWindowsMainService, @ILifecycleMainService private readonly lifecycleMainService: ILifecycleMainService ) { } //#region Window async windowCount(windowId: number): Promise { return this.windowsMainService.getWindowCount(); } async openEmptyWindow(windowId: number, options?: { reuse?: boolean, remoteAuthority?: string }): Promise { this.windowsMainService.openEmptyWindow(OpenContext.API, options); } async toggleFullScreen(windowId: number): Promise { const window = this.windowsMainService.getWindowById(windowId); if (window) { window.toggleFullScreen(); } } async handleTitleDoubleClick(windowId: number): Promise { const window = this.windowsMainService.getWindowById(windowId); if (window) { window.handleTitleDoubleClick(); } } async isMaximized(windowId: number): Promise { const window = this.windowsMainService.getWindowById(windowId); if (window) { return window.win.isMaximized(); } return false; } async maximizeWindow(windowId: number): Promise { const window = this.windowsMainService.getWindowById(windowId); if (window) { window.win.maximize(); } } async unmaximizeWindow(windowId: number): Promise { const window = this.windowsMainService.getWindowById(windowId); if (window) { window.win.unmaximize(); } } async minimizeWindow(windowId: number): Promise { const window = this.windowsMainService.getWindowById(windowId); if (window) { window.win.minimize(); } } async focusWindow(windowId: number): Promise { const window = this.windowsMainService.getWindowById(windowId); if (window) { if (isMacintosh) { window.win.show(); } else { window.win.focus(); } } } //#endregion //#region Dialog async showMessageBox(windowId: number, options: MessageBoxOptions): Promise { return this.windowsMainService.showMessageBox(options, this.windowsMainService.getWindowById(windowId)); } async showSaveDialog(windowId: number, options: SaveDialogOptions): Promise { return this.windowsMainService.showSaveDialog(options, this.windowsMainService.getWindowById(windowId)); } async showOpenDialog(windowId: number, options: OpenDialogOptions): Promise { return this.windowsMainService.showOpenDialog(options, this.windowsMainService.getWindowById(windowId)); } async pickFileFolderAndOpen(windowId: number, options: INativeOpenDialogOptions): Promise { return this.windowsMainService.pickFileFolderAndOpen(options, this.windowsMainService.getWindowById(windowId)); } async pickFileAndOpen(windowId: number, options: INativeOpenDialogOptions): Promise { return this.windowsMainService.pickFileAndOpen(options, this.windowsMainService.getWindowById(windowId)); } async pickFolderAndOpen(windowId: number, options: INativeOpenDialogOptions): Promise { return this.windowsMainService.pickFolderAndOpen(options, this.windowsMainService.getWindowById(windowId)); } async pickWorkspaceAndOpen(windowId: number, options: INativeOpenDialogOptions): Promise { return this.windowsMainService.pickWorkspaceAndOpen(options, this.windowsMainService.getWindowById(windowId)); } //#endregion //#region OS async showItemInFolder(windowId: number, path: string): Promise { shell.showItemInFolder(path); } async setRepresentedFilename(windowId: number, path: string): Promise { const window = this.windowsMainService.getWindowById(windowId); if (window) { window.setRepresentedFilename(path); } } async setDocumentEdited(windowId: number, edited: boolean): Promise { const window = this.windowsMainService.getWindowById(windowId); if (window) { window.win.setDocumentEdited(edited); } } async openExternal(windowId: number, url: string): Promise { return this.windowsMainService.openExternal(url); } async updateTouchBar(windowId: number, items: ISerializableCommandAction[][]): Promise { const window = this.windowsMainService.getWindowById(windowId); if (window) { window.updateTouchBar(items); } } //#endregion //#region macOS Touchbar async newWindowTab(): Promise { this.windowsMainService.openNewTabbedWindow(OpenContext.API); } async showPreviousWindowTab(): Promise { Menu.sendActionToFirstResponder('selectPreviousTab:'); } async showNextWindowTab(): Promise { Menu.sendActionToFirstResponder('selectNextTab:'); } async moveWindowTabToNewWindow(): Promise { Menu.sendActionToFirstResponder('moveTabToNewWindow:'); } async mergeAllWindowTabs(): Promise { Menu.sendActionToFirstResponder('mergeAllWindows:'); } async toggleWindowTabsBar(): Promise { Menu.sendActionToFirstResponder('toggleTabBar:'); } //#endregion //#region Lifecycle async relaunch(windowId: number, options?: { addArgs?: string[], removeArgs?: string[] }): Promise { return this.lifecycleMainService.relaunch(options); } async reload(windowId: number): Promise { const window = this.windowsMainService.getWindowById(windowId); if (window) { return this.windowsMainService.reload(window); } } async closeWorkpsace(windowId: number): Promise { const window = this.windowsMainService.getWindowById(windowId); if (window) { return this.windowsMainService.closeWorkspace(window); } } async closeWindow(windowId: number): Promise { const window = this.windowsMainService.getWindowById(windowId); if (window) { return window.win.close(); } } async quit(windowId: number): Promise { return this.windowsMainService.quit(); } //#endregion //#region Connectivity async resolveProxy(windowId: number, url: string): Promise { return new Promise(resolve => { const window = this.windowsMainService.getWindowById(windowId); if (window && window.win && window.win.webContents && window.win.webContents.session) { window.win.webContents.session.resolveProxy(url, proxy => resolve(proxy)); } else { resolve(); } }); } //#endregion //#region Development async openDevTools(windowId: number, options?: OpenDevToolsOptions): Promise { const window = this.windowsMainService.getWindowById(windowId); if (window) { window.win.webContents.openDevTools(options); } } async toggleDevTools(windowId: number): Promise { const window = this.windowsMainService.getWindowById(windowId); if (window) { const contents = window.win.webContents; if (isMacintosh && window.hasHiddenTitleBarStyle() && !window.isFullScreen() && !contents.isDevToolsOpened()) { contents.openDevTools({ mode: 'undocked' }); // due to https://github.com/electron/electron/issues/3647 } else { contents.toggleDevTools(); } } } async startCrashReporter(windowId: number, options: CrashReporterStartOptions): Promise { crashReporter.start(options); } //#endregion }