@@ -43,7 +43,10 @@ let initStep: InitStep = { phase: "server_waiting" }
4343
4444let mainWindow : BrowserWindow | null = null
4545let server : Server . Listener | null = null
46+ let splash : BrowserWindow | null = null
47+ let ready = false
4648const loadingComplete = defer < void > ( )
49+ const mainReady = defer < void > ( )
4750
4851const pendingDeepLinks : string [ ] = [ ]
4952
@@ -111,6 +114,11 @@ function emitDeepLinks(urls: string[]) {
111114}
112115
113116function focusMainWindow ( ) {
117+ if ( ! ready ) {
118+ splash ?. show ( )
119+ splash ?. focus ( )
120+ return
121+ }
114122 if ( ! mainWindow ) return
115123 mainWindow . show ( )
116124 mainWindow . focus ( )
@@ -120,12 +128,14 @@ function setInitStep(step: InitStep) {
120128 initStep = step
121129 logger . log ( "init step" , { step } )
122130 initEmitter . emit ( "step" , step )
131+ BrowserWindow . getAllWindows ( ) . forEach ( ( win ) => {
132+ win . webContents . send ( "init-step" , step )
133+ } )
123134}
124135
125136async function initialize ( ) {
126137 const needsMigration = ! sqliteFileExists ( )
127138 const sqliteDone = needsMigration ? defer < void > ( ) : undefined
128- let overlay : BrowserWindow | null = null
129139
130140 const port = await getSidecarPort ( )
131141 const hostname = "127.0.0.1"
@@ -146,7 +156,7 @@ async function initialize() {
146156
147157 initEmitter . on ( "sqlite" , ( progress : SqliteMigrationProgress ) => {
148158 setInitStep ( { phase : "sqlite_waiting" } )
149- if ( overlay ) sendSqliteMigrationProgress ( overlay , progress )
159+ if ( splash ) sendSqliteMigrationProgress ( splash , progress )
150160 if ( mainWindow ) sendSqliteMigrationProgress ( mainWindow , progress )
151161 if ( progress . type === "Done" ) sqliteDone ?. resolve ( )
152162 } )
@@ -172,25 +182,31 @@ async function initialize() {
172182 deepLinks : pendingDeepLinks ,
173183 }
174184
175- if ( needsMigration ) {
176- const show = await Promise . race ( [ loadingTask . then ( ( ) => false ) , delay ( 1_000 ) . then ( ( ) => true ) ] )
177- if ( show ) {
178- overlay = createLoadingWindow ( globals )
179- await delay ( 1_000 )
180- }
181- }
185+ const startup = ( async ( ) => {
186+ await loadingTask
187+ setInitStep ( { phase : "app_waiting" } )
188+ mainWindow = createMainWindow ( globals , { show : false } )
182189
183- await loadingTask
190+ const ok = await Promise . race ( [ mainReady . promise . then ( ( ) => true ) , delay ( 15_000 ) . then ( ( ) => false ) ] )
191+ if ( ! ok ) logger . warn ( "main window ready timed out" )
192+ } ) ( )
193+
194+ splash = createLoadingWindow ( globals )
195+
196+ await startup
184197 setInitStep ( { phase : "done" } )
185198
186- if ( overlay ) {
187- await loadingComplete . promise
199+ if ( splash ) {
200+ const ok = await Promise . race ( [ loadingComplete . promise . then ( ( ) => true ) , delay ( 2_000 ) . then ( ( ) => false ) ] )
201+ if ( ! ok ) logger . warn ( "loading window complete timed out" )
202+ splash . close ( )
203+ splash = null
188204 }
189205
190- mainWindow = createMainWindow ( globals )
191206 wireMenu ( )
192-
193- overlay ?. close ( )
207+ ready = true
208+ mainWindow ?. show ( )
209+ mainWindow ?. focus ( )
194210}
195211
196212function wireMenu ( ) {
@@ -235,6 +251,7 @@ registerIpcHandlers({
235251 wslPath : async ( path , mode ) => wslPath ( path , mode ) ,
236252 resolveAppPath : async ( appName ) => resolveAppPath ( appName ) ,
237253 loadingWindowComplete : ( ) => loadingComplete . resolve ( ) ,
254+ mainWindowReady : ( ) => mainReady . resolve ( ) ,
238255 runUpdater : async ( alertOnFail ) => checkForUpdates ( alertOnFail ) ,
239256 checkUpdate : async ( ) => checkUpdate ( ) ,
240257 installUpdate : async ( ) => installUpdate ( ) ,
0 commit comments