diff --git a/arduino-ide-extension/src/electron-main/arduino-electron-main-module.ts b/arduino-ide-extension/src/electron-main/arduino-electron-main-module.ts index 5f4a43e0..f1b0f639 100644 --- a/arduino-ide-extension/src/electron-main/arduino-electron-main-module.ts +++ b/arduino-ide-extension/src/electron-main/arduino-electron-main-module.ts @@ -1,15 +1,20 @@ import { ContainerModule } from 'inversify'; import { JsonRpcConnectionHandler } from '@theia/core/lib/common/messaging/proxy-factory'; import { ElectronConnectionHandler } from '@theia/core/lib/electron-common/messaging/electron-connection-handler'; +import { ElectronMainWindowService } from '@theia/core/lib/electron-common/electron-main-window-service'; import { ElectronMainApplication as TheiaElectronMainApplication } from '@theia/core/lib/electron-main/electron-main-application'; import { SplashService, splashServicePath } from '../electron-common/splash-service'; import { SplashServiceImpl } from './splash/splash-service-impl'; import { ElectronMainApplication } from './theia/electron-main-application'; +import { ElectronMainWindowServiceImpl } from './theia/electron-main-window-service'; export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(ElectronMainApplication).toSelf().inSingletonScope(); rebind(TheiaElectronMainApplication).toService(ElectronMainApplication); + bind(ElectronMainWindowServiceImpl).toSelf().inSingletonScope(); + rebind(ElectronMainWindowService).toService(ElectronMainWindowServiceImpl); + bind(SplashServiceImpl).toSelf().inSingletonScope(); bind(SplashService).toService(SplashServiceImpl); bind(ElectronConnectionHandler).toDynamicValue(context => diff --git a/arduino-ide-extension/src/electron-main/theia/electron-main-application.ts b/arduino-ide-extension/src/electron-main/theia/electron-main-application.ts index c096daf6..f3727aa7 100644 --- a/arduino-ide-extension/src/electron-main/theia/electron-main-application.ts +++ b/arduino-ide-extension/src/electron-main/theia/electron-main-application.ts @@ -13,7 +13,7 @@ import { SplashServiceImpl } from '../splash/splash-service-impl'; @injectable() export class ElectronMainApplication extends TheiaElectronMainApplication { - protected windows: BrowserWindow[] = []; + protected _windows: BrowserWindow[] = []; @inject(SplashServiceImpl) protected readonly splashService: SplashServiceImpl; @@ -34,7 +34,7 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { async createWindow(asyncOptions: MaybePromise = this.getDefaultBrowserWindowOptions()): Promise { const options = await asyncOptions; let electronWindow: BrowserWindow | undefined; - if (this.windows.length) { + if (this._windows.length) { electronWindow = new BrowserWindow(options); } else { const { bounds } = screen.getDisplayNearestPoint(screen.getCursorScreenPoint()); @@ -63,14 +63,14 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { splashScreenOpts }, this.splashService.onCloseRequested); } - this.windows.push(electronWindow); + this._windows.push(electronWindow); electronWindow.on('closed', () => { if (electronWindow) { - const index = this.windows.indexOf(electronWindow); + const index = this._windows.indexOf(electronWindow); if (index === -1) { console.warn(`Could not dispose browser window: '${electronWindow.title}'.`); } else { - this.windows.splice(index, 1); + this._windows.splice(index, 1); electronWindow = undefined; } } @@ -148,4 +148,8 @@ export class ElectronMainApplication extends TheiaElectronMainApplication { } } + get windows(): BrowserWindow[] { + return this._windows.slice(); + } + } diff --git a/arduino-ide-extension/src/electron-main/theia/electron-main-window-service.ts b/arduino-ide-extension/src/electron-main/theia/electron-main-window-service.ts new file mode 100644 index 00000000..7a1428ab --- /dev/null +++ b/arduino-ide-extension/src/electron-main/theia/electron-main-window-service.ts @@ -0,0 +1,24 @@ +import { inject, injectable } from 'inversify'; +import { NewWindowOptions } from '@theia/core/lib/browser/window/window-service'; +import { ElectronMainWindowServiceImpl as TheiaElectronMainWindowService } from '@theia/core/lib/electron-main/electron-main-window-service-impl'; +import { ElectronMainApplication } from './electron-main-application'; + +@injectable() +export class ElectronMainWindowServiceImpl extends TheiaElectronMainWindowService { + + @inject(ElectronMainApplication) + protected readonly app: ElectronMainApplication; + + openNewWindow(url: string, { external }: NewWindowOptions): undefined { + if (!external) { + const existing = this.app.windows.find(window => window.webContents.getURL() === url); + if (existing) { + existing.focus(); + return; + } + } + return super.openNewWindow(url, { external }); + } + + +}