5
5
6
6
import { app , BrowserWindow , dialog , protocol , session , Session , systemPreferences , WebFrameMain } from 'electron' ;
7
7
import { validatedIpcMain } from 'vs/base/parts/ipc/electron-main/ipcMain' ;
8
- import { statSync } from 'fs' ;
9
8
import { hostname , release } from 'os' ;
10
9
import { VSBuffer } from 'vs/base/common/buffer' ;
11
10
import { toErrorMessage } from 'vs/base/common/errorMessage' ;
@@ -109,8 +108,7 @@ import { ExtensionsProfileScannerService, IExtensionsProfileScannerService } fro
109
108
import { IExtensionsScannerService } from 'vs/platform/extensionManagement/common/extensionsScannerService' ;
110
109
import { ExtensionsScannerService } from 'vs/platform/extensionManagement/node/extensionsScannerService' ;
111
110
import { UserDataTransientProfilesHandler } from 'vs/platform/userDataProfile/electron-main/userDataTransientProfilesHandler' ;
112
- import { RunOnceScheduler , runWhenIdle } from 'vs/base/common/async' ;
113
- import { IUserDataProfile } from 'vs/platform/userDataProfile/common/userDataProfile' ;
111
+ import { Promises , RunOnceScheduler , runWhenIdle } from 'vs/base/common/async' ;
114
112
115
113
/**
116
114
* The main VS Code application. There will only ever be one instance,
@@ -327,12 +325,12 @@ export class CodeApplication extends Disposable {
327
325
} ) ;
328
326
329
327
// macOS dock activate
330
- app . on ( 'activate' , ( event , hasVisibleWindows ) => {
328
+ app . on ( 'activate' , async ( event , hasVisibleWindows ) => {
331
329
this . logService . trace ( 'app#activate' ) ;
332
330
333
331
// Mac only event: open new window when we get activated
334
332
if ( ! hasVisibleWindows ) {
335
- this . windowsMainService ?. openEmptyWindow ( { context : OpenContext . DOCK } ) ;
333
+ await this . windowsMainService ?. openEmptyWindow ( { context : OpenContext . DOCK } ) ;
336
334
}
337
335
} ) ;
338
336
@@ -364,7 +362,7 @@ export class CodeApplication extends Disposable {
364
362
event . preventDefault ( ) ;
365
363
366
364
// Keep in array because more might come!
367
- macOpenFileURIs . push ( this . getWindowOpenableFromPathSync ( path ) ) ;
365
+ macOpenFileURIs . push ( hasWorkspaceFileExtension ( path ) ? { workspaceUri : URI . file ( path ) } : { fileUri : URI . file ( path ) } ) ;
368
366
369
367
// Clear previous handler if any
370
368
if ( runningTimeout !== undefined ) {
@@ -373,8 +371,8 @@ export class CodeApplication extends Disposable {
373
371
}
374
372
375
373
// Handle paths delayed in case more are coming!
376
- runningTimeout = setTimeout ( ( ) => {
377
- this . windowsMainService ?. open ( {
374
+ runningTimeout = setTimeout ( async ( ) => {
375
+ await this . windowsMainService ?. open ( {
378
376
context : OpenContext . DOCK /* can also be opening from finder while app is running */ ,
379
377
cli : this . environmentMainService . args ,
380
378
urisToOpen : macOpenFileURIs ,
@@ -387,8 +385,8 @@ export class CodeApplication extends Disposable {
387
385
} , 100 ) ;
388
386
} ) ;
389
387
390
- app . on ( 'new-window-for-tab' , ( ) => {
391
- this . windowsMainService ?. openEmptyWindow ( { context : OpenContext . DESKTOP } ) ; //macOS native tab "+" button
388
+ app . on ( 'new-window-for-tab' , async ( ) => {
389
+ await this . windowsMainService ?. openEmptyWindow ( { context : OpenContext . DESKTOP } ) ; //macOS native tab "+" button
392
390
} ) ;
393
391
394
392
//#region Bootstrap IPC Handlers
@@ -538,15 +536,11 @@ export class CodeApplication extends Disposable {
538
536
// Setup Handlers
539
537
this . setUpHandlers ( appInstantiationService ) ;
540
538
541
- // Ensure profile exists when passed in from CLI
542
- const profilePromise = this . userDataProfilesMainService . checkAndCreateProfileFromCli ( this . environmentMainService . args ) ;
543
- const profile = profilePromise ? await profilePromise : undefined ;
544
-
545
539
// Init Channels
546
540
appInstantiationService . invokeFunction ( accessor => this . initChannels ( accessor , mainProcessElectronServer , sharedProcessClient ) ) ;
547
541
548
542
// Open Windows
549
- appInstantiationService . invokeFunction ( accessor => this . openFirstWindow ( accessor , profile , mainProcessElectronServer ) ) ;
543
+ await appInstantiationService . invokeFunction ( accessor => this . openFirstWindow ( accessor , mainProcessElectronServer ) ) ;
550
544
551
545
// Post Open Windows Tasks
552
546
appInstantiationService . invokeFunction ( accessor => this . afterWindowOpen ( accessor , sharedProcess ) ) ;
@@ -632,7 +626,8 @@ export class CodeApplication extends Disposable {
632
626
services . set ( IWindowsMainService , new SyncDescriptor ( WindowsMainService , [ machineId , this . userEnv ] , false ) ) ;
633
627
634
628
// Dialogs
635
- services . set ( IDialogMainService , new SyncDescriptor ( DialogMainService , undefined , true ) ) ;
629
+ const dialogMainService = new DialogMainService ( this . logService ) ;
630
+ services . set ( IDialogMainService , dialogMainService ) ;
636
631
637
632
// Launch
638
633
services . set ( ILaunchMainService , new SyncDescriptor ( LaunchMainService , undefined , false /* proxied to other processes */ ) ) ;
@@ -659,10 +654,6 @@ export class CodeApplication extends Disposable {
659
654
// Webview Manager
660
655
services . set ( IWebviewManagerService , new SyncDescriptor ( WebviewMainService ) ) ;
661
656
662
- // Workspaces
663
- services . set ( IWorkspacesService , new SyncDescriptor ( WorkspacesMainService , undefined , false /* proxied to other processes */ ) ) ;
664
- services . set ( IWorkspacesManagementMainService , new SyncDescriptor ( WorkspacesManagementMainService , undefined , true ) ) ;
665
- services . set ( IWorkspacesHistoryMainService , new SyncDescriptor ( WorkspacesHistoryMainService , undefined , false ) ) ;
666
657
667
658
// Menubar
668
659
services . set ( IMenubarMainService , new SyncDescriptor ( MenubarMainService ) ) ;
@@ -690,6 +681,12 @@ export class CodeApplication extends Disposable {
690
681
const backupMainService = new BackupMainService ( this . environmentMainService , this . configurationService , this . logService , this . stateMainService ) ;
691
682
services . set ( IBackupMainService , backupMainService ) ;
692
683
684
+ // Workspaces
685
+ const workspacesManagementMainService = new WorkspacesManagementMainService ( this . environmentMainService , this . logService , this . userDataProfilesMainService , backupMainService , dialogMainService , this . productService ) ;
686
+ services . set ( IWorkspacesManagementMainService , workspacesManagementMainService ) ;
687
+ services . set ( IWorkspacesService , new SyncDescriptor ( WorkspacesMainService , undefined , false /* proxied to other processes */ ) ) ;
688
+ services . set ( IWorkspacesHistoryMainService , new SyncDescriptor ( WorkspacesHistoryMainService , undefined , false ) ) ;
689
+
693
690
// URL handling
694
691
services . set ( IURLService , new SyncDescriptor ( NativeURLService , undefined , false /* proxied to other processes */ ) ) ;
695
692
@@ -712,7 +709,10 @@ export class CodeApplication extends Disposable {
712
709
services . set ( IExtensionsScannerService , new SyncDescriptor ( ExtensionsScannerService , undefined , true ) ) ;
713
710
714
711
// Init services that require it
715
- await backupMainService . initialize ( ) ;
712
+ await Promises . settled ( [
713
+ backupMainService . initialize ( ) ,
714
+ workspacesManagementMainService . initialize ( )
715
+ ] ) ;
716
716
717
717
return this . mainInstantiationService . createChild ( services ) ;
718
718
}
@@ -829,7 +829,7 @@ export class CodeApplication extends Disposable {
829
829
mainProcessElectronServer . registerChannel ( ipcExtensionHostStarterChannelName , extensionHostStarterChannel ) ;
830
830
}
831
831
832
- private openFirstWindow ( accessor : ServicesAccessor , profile : IUserDataProfile | undefined , mainProcessElectronServer : ElectronIPCServer ) : ICodeWindow [ ] {
832
+ private async openFirstWindow ( accessor : ServicesAccessor , mainProcessElectronServer : ElectronIPCServer ) : Promise < ICodeWindow [ ] > {
833
833
const windowsMainService = this . windowsMainService = accessor . get ( IWindowsMainService ) ;
834
834
const urlService = accessor . get ( IURLService ) ;
835
835
const nativeHostMainService = accessor . get ( INativeHostMainService ) ;
@@ -917,7 +917,7 @@ export class CodeApplication extends Disposable {
917
917
const windowOpenableFromProtocolLink = app . getWindowOpenableFromProtocolLink ( uri ) ;
918
918
logService . trace ( 'app#handleURL: windowOpenableFromProtocolLink = ' , windowOpenableFromProtocolLink ) ;
919
919
if ( windowOpenableFromProtocolLink ) {
920
- const [ window ] = windowsMainService . open ( {
920
+ const [ window ] = await windowsMainService . open ( {
921
921
context : OpenContext . API ,
922
922
cli : { ...environmentService . args } ,
923
923
urisToOpen : [ windowOpenableFromProtocolLink ] ,
@@ -932,7 +932,7 @@ export class CodeApplication extends Disposable {
932
932
}
933
933
934
934
if ( shouldOpenInNewWindow ) {
935
- const [ window ] = windowsMainService . open ( {
935
+ const [ window ] = await windowsMainService . open ( {
936
936
context : OpenContext . API ,
937
937
cli : { ...environmentService . args } ,
938
938
forceNewWindow : true ,
@@ -989,6 +989,9 @@ export class CodeApplication extends Disposable {
989
989
} ) ;
990
990
}
991
991
992
+ // Ensure profile exists when passed in from CLI
993
+ const profile = await this . userDataProfilesMainService . checkAndCreateProfileFromCli ( this . environmentMainService . args ) ;
994
+
992
995
// Start without file/folder arguments
993
996
if ( ! hasCliArgs && ! hasFolderURIs && ! hasFileURIs ) {
994
997
@@ -1012,7 +1015,7 @@ export class CodeApplication extends Disposable {
1012
1015
return windowsMainService . open ( {
1013
1016
context : OpenContext . DOCK ,
1014
1017
cli : args ,
1015
- urisToOpen : macOpenFiles . map ( file => this . getWindowOpenableFromPathSync ( file ) ) ,
1018
+ urisToOpen : macOpenFiles . map ( path => ( hasWorkspaceFileExtension ( path ) ? { workspaceUri : URI . file ( path ) } : { fileUri : URI . file ( path ) } ) ) ,
1016
1019
noRecentEntry,
1017
1020
waitMarkerFileURI,
1018
1021
initialStartup : true ,
@@ -1104,23 +1107,6 @@ export class CodeApplication extends Disposable {
1104
1107
return undefined ;
1105
1108
}
1106
1109
1107
- private getWindowOpenableFromPathSync ( path : string ) : IWindowOpenable {
1108
- try {
1109
- const fileStat = statSync ( path ) ;
1110
- if ( fileStat . isDirectory ( ) ) {
1111
- return { folderUri : URI . file ( path ) } ;
1112
- }
1113
-
1114
- if ( hasWorkspaceFileExtension ( path ) ) {
1115
- return { workspaceUri : URI . file ( path ) } ;
1116
- }
1117
- } catch ( error ) {
1118
- // ignore errors
1119
- }
1120
-
1121
- return { fileUri : URI . file ( path ) } ;
1122
- }
1123
-
1124
1110
private afterWindowOpen ( accessor : ServicesAccessor , sharedProcess : SharedProcess ) : void {
1125
1111
const telemetryService = accessor . get ( ITelemetryService ) ;
1126
1112
const updateService = accessor . get ( IUpdateService ) ;
0 commit comments