@@ -41,8 +41,11 @@ const initEmitter = new EventEmitter()
4141let initStep : InitStep = { phase : "server_waiting" }
4242
4343let mainWindow : BrowserWindow | null = null
44+ let splash : BrowserWindow | null = null
45+ let ready = false
4446let sidecar : CommandChild | null = null
4547const loadingComplete = defer < void > ( )
48+ const mainReady = defer < void > ( )
4649
4750const pendingDeepLinks : string [ ] = [ ]
4851
@@ -112,6 +115,11 @@ function emitDeepLinks(urls: string[]) {
112115}
113116
114117function focusMainWindow ( ) {
118+ if ( ! ready ) {
119+ splash ?. show ( )
120+ splash ?. focus ( )
121+ return
122+ }
115123 if ( ! mainWindow ) return
116124 mainWindow . show ( )
117125 mainWindow . focus ( )
@@ -121,12 +129,14 @@ function setInitStep(step: InitStep) {
121129 initStep = step
122130 logger . log ( "init step" , { step } )
123131 initEmitter . emit ( "step" , step )
132+ BrowserWindow . getAllWindows ( ) . forEach ( ( win ) => {
133+ win . webContents . send ( "init-step" , step )
134+ } )
124135}
125136
126137async function initialize ( ) {
127138 const needsMigration = ! sqliteFileExists ( )
128139 const sqliteDone = needsMigration ? defer < void > ( ) : undefined
129- let overlay : BrowserWindow | null = null
130140
131141 const port = await getSidecarPort ( )
132142 const hostname = "127.0.0.1"
@@ -147,7 +157,7 @@ async function initialize() {
147157
148158 events . on ( "sqlite" , ( progress : SqliteMigrationProgress ) => {
149159 setInitStep ( { phase : "sqlite_waiting" } )
150- if ( overlay ) sendSqliteMigrationProgress ( overlay , progress )
160+ if ( splash ) sendSqliteMigrationProgress ( splash , progress )
151161 if ( mainWindow ) sendSqliteMigrationProgress ( mainWindow , progress )
152162 if ( progress . type === "Done" ) sqliteDone ?. resolve ( )
153163 } )
@@ -173,25 +183,30 @@ async function initialize() {
173183 deepLinks : pendingDeepLinks ,
174184 }
175185
176- if ( needsMigration ) {
177- const show = await Promise . race ( [ loadingTask . then ( ( ) => false ) , delay ( 1_000 ) . then ( ( ) => true ) ] )
178- if ( show ) {
179- overlay = createLoadingWindow ( globals )
180- await delay ( 1_000 )
181- }
182- }
186+ const startup = ( async ( ) => {
187+ await loadingTask
188+ setInitStep ( { phase : "app_waiting" } )
189+ mainWindow = createMainWindow ( globals , { show : false } )
183190
184- await loadingTask
191+ const ok = await Promise . race ( [ mainReady . promise . then ( ( ) => true ) , delay ( 15_000 ) . then ( ( ) => false ) ] )
192+ if ( ! ok ) logger . warn ( "main window ready timed out" )
193+ } ) ( )
194+
195+ splash = createLoadingWindow ( globals )
196+
197+ await startup
185198 setInitStep ( { phase : "done" } )
186199
187- if ( overlay ) {
200+ if ( splash ) {
188201 await loadingComplete . promise
202+ splash . close ( )
203+ splash = null
189204 }
190205
191- mainWindow = createMainWindow ( globals )
192206 wireMenu ( )
193-
194- overlay ?. close ( )
207+ ready = true
208+ mainWindow ?. show ( )
209+ mainWindow ?. focus ( )
195210}
196211
197212function wireMenu ( ) {
@@ -240,6 +255,7 @@ registerIpcHandlers({
240255 wslPath : async ( path , mode ) => wslPath ( path , mode ) ,
241256 resolveAppPath : async ( appName ) => resolveAppPath ( appName ) ,
242257 loadingWindowComplete : ( ) => loadingComplete . resolve ( ) ,
258+ mainWindowReady : ( ) => mainReady . resolve ( ) ,
243259 runUpdater : async ( alertOnFail ) => checkForUpdates ( alertOnFail ) ,
244260 checkUpdate : async ( ) => checkUpdate ( ) ,
245261 installUpdate : async ( ) => installUpdate ( ) ,
0 commit comments