@@ -14,7 +14,6 @@ import {
1414} from '@theia/core/lib/electron-main/electron-main-application' ;
1515import { SplashServiceImpl } from '../splash/splash-service-impl' ;
1616import { URI } from '@theia/core/shared/vscode-uri' ;
17- import * as electronRemoteMain from '@theia/core/electron-shared/@electron/remote/main' ;
1817import { Deferred } from '@theia/core/lib/common/promise-util' ;
1918import * as os from '@theia/core/lib/common/os' ;
2019import { Restart } from '@theia/core/lib/electron-common/messaging/electron-messages' ;
@@ -37,7 +36,6 @@ const WORKSPACES = 'workspaces';
3736
3837@injectable ( )
3938export class ElectronMainApplication extends TheiaElectronMainApplication {
40- protected _windows : BrowserWindow [ ] = [ ] ;
4139 protected startup = false ;
4240 protected openFilePromise = new Deferred ( ) ;
4341
@@ -179,99 +177,87 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
179177 async createWindow (
180178 asyncOptions : MaybePromise < TheiaBrowserWindowOptions > = this . getDefaultTheiaWindowOptions ( )
181179 ) : Promise < BrowserWindow > {
182- let options = await asyncOptions ;
183- options = this . avoidOverlap ( options ) ;
184- let electronWindow : BrowserWindow | undefined ;
185- if ( this . _windows . length ) {
186- electronWindow = await super . createWindow ( options ) ;
187- } else {
188- const { bounds } = screen . getDisplayNearestPoint (
189- screen . getCursorScreenPoint ( )
190- ) ;
191- const splashHeight = 450 ;
192- const splashWidth = 600 ;
193- const splashY = Math . floor ( bounds . y + ( bounds . height - splashHeight ) / 2 ) ;
194- const splashX = Math . floor ( bounds . x + ( bounds . width - splashWidth ) / 2 ) ;
195- const splashScreenOpts : BrowserWindowConstructorOptions = {
196- height : splashHeight ,
197- width : splashWidth ,
198- x : splashX ,
199- y : splashY ,
200- transparent : true ,
201- alwaysOnTop : true ,
202- focusable : false ,
203- minimizable : false ,
204- maximizable : false ,
205- hasShadow : false ,
206- resizable : false ,
207- } ;
208- electronWindow = initSplashScreen (
209- {
210- windowOpts : options ,
211- templateUrl : join (
212- __dirname ,
213- '..' ,
214- '..' ,
215- '..' ,
216- 'src' ,
217- 'electron-main' ,
218- 'splash' ,
219- 'static' ,
220- 'splash.html'
221- ) ,
222- delay : 0 ,
223- minVisible : 2000 ,
224- splashScreenOpts,
225- } ,
226- this . splashService . onCloseRequested
180+ const createRegularWindow = ! this . windows . size ;
181+ const electronWindow = await ( createRegularWindow
182+ ? super . createWindow ( asyncOptions )
183+ : this . createSplashScreenWindow ( asyncOptions ) ) ;
184+ if ( createRegularWindow ) {
185+ electronWindow . webContents . on (
186+ 'new-window' ,
187+ ( event , url , frameName , disposition , options ) => {
188+ if ( frameName === 'serialPlotter' ) {
189+ event . preventDefault ( ) ;
190+ Object . assign ( options , {
191+ width : 800 ,
192+ minWidth : 620 ,
193+ height : 500 ,
194+ minHeight : 320 ,
195+ x : 100 ,
196+ y : 100 ,
197+ webPreferences : {
198+ devTools : true ,
199+ nativeWindowOpen : true ,
200+ openerId : electronWindow ?. webContents . id ,
201+ } ,
202+ } ) ;
203+ event . newGuest = new BrowserWindow ( options ) ;
204+ event . newGuest . setMenu ( null ) ;
205+ event . newGuest ?. on ( 'closed' , ( e : any ) => {
206+ electronWindow ?. webContents . send ( 'CLOSE_CHILD_WINDOW' ) ;
207+ } ) ;
208+ event . newGuest ?. loadURL ( url ) ;
209+ }
210+ }
227211 ) ;
212+ this . attachClosedWorkspace ( electronWindow ) ;
228213 }
214+ return electronWindow ;
215+ }
229216
230- electronWindow . webContents . on (
231- 'new-window' ,
232- ( event , url , frameName , disposition , options ) => {
233- if ( frameName === 'serialPlotter' ) {
234- event . preventDefault ( ) ;
235- Object . assign ( options , {
236- width : 800 ,
237- minWidth : 620 ,
238- height : 500 ,
239- minHeight : 320 ,
240- x : 100 ,
241- y : 100 ,
242- webPreferences : {
243- devTools : true ,
244- nativeWindowOpen : true ,
245- openerId : electronWindow ?. webContents . id ,
246- } ,
247- } ) ;
248- event . newGuest = new BrowserWindow ( options ) ;
249- event . newGuest . setMenu ( null ) ;
250- event . newGuest ?. on ( 'closed' , ( e : any ) => {
251- electronWindow ?. webContents . send ( 'CLOSE_CHILD_WINDOW' ) ;
252- } ) ;
253- event . newGuest ?. loadURL ( url ) ;
254- }
255- }
217+ private async createSplashScreenWindow (
218+ asyncOptions : MaybePromise < TheiaBrowserWindowOptions >
219+ ) : Promise < BrowserWindow > {
220+ const options = await asyncOptions ;
221+ const { bounds } = screen . getDisplayNearestPoint (
222+ screen . getCursorScreenPoint ( )
223+ ) ;
224+ const splashHeight = 450 ;
225+ const splashWidth = 600 ;
226+ const splashY = Math . floor ( bounds . y + ( bounds . height - splashHeight ) / 2 ) ;
227+ const splashX = Math . floor ( bounds . x + ( bounds . width - splashWidth ) / 2 ) ;
228+ const splashScreenOpts : BrowserWindowConstructorOptions = {
229+ height : splashHeight ,
230+ width : splashWidth ,
231+ x : splashX ,
232+ y : splashY ,
233+ transparent : true ,
234+ alwaysOnTop : true ,
235+ focusable : false ,
236+ minimizable : false ,
237+ maximizable : false ,
238+ hasShadow : false ,
239+ resizable : false ,
240+ } ;
241+ return initSplashScreen (
242+ {
243+ windowOpts : options ,
244+ templateUrl : join (
245+ __dirname ,
246+ '..' ,
247+ '..' ,
248+ '..' ,
249+ 'src' ,
250+ 'electron-main' ,
251+ 'splash' ,
252+ 'static' ,
253+ 'splash.html'
254+ ) ,
255+ delay : 0 ,
256+ minVisible : 2000 ,
257+ splashScreenOpts,
258+ } ,
259+ this . splashService . onCloseRequested
256260 ) ;
257- 258- this . _windows . push ( electronWindow ) ;
259- electronWindow . on ( 'closed' , ( ) => {
260- if ( electronWindow ) {
261- const index = this . _windows . indexOf ( electronWindow ) ;
262- if ( index === - 1 ) {
263- console . warn (
264- `Could not dispose browser window: '${ electronWindow . title } '.`
265- ) ;
266- } else {
267- this . _windows . splice ( index , 1 ) ;
268- electronWindow = undefined ;
269- }
270- }
271- } ) ;
272- this . attachClosedWorkspace ( electronWindow ) ;
273- electronRemoteMain . enable ( electronWindow . webContents ) ;
274- return electronWindow ;
275261 }
276262
277263 protected async startBackend ( ) : Promise < number > {
@@ -376,6 +362,6 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
376362 }
377363
378364 get browserWindows ( ) : BrowserWindow [ ] {
379- return this . _windows ;
365+ return Array . from ( this . windows . values ( ) ) . map ( ( { window } ) => window ) ;
380366 }
381367}
0 commit comments