diff --git a/main.js b/main.js index 36ccf4b..c8d1410 100644 --- a/main.js +++ b/main.js @@ -1543,13 +1543,13 @@ class ApplicationController { } else if (this.isReady) { // When app is activated, ensure windows appear on current desktop const mainWindow = windowManager.getWindow("main"); - if (mainWindow && mainWindow.isVisible()) { + if (mainWindow && !mainWindow.isDestroyed() && mainWindow.isVisible()) { windowManager.showOnCurrentDesktop(mainWindow); } // Also handle other visible windows windowManager.windows.forEach((window, type) => { - if (window.isVisible()) { + if (!window.isDestroyed() && window.isVisible()) { windowManager.showOnCurrentDesktop(window); } }); diff --git a/src/managers/window.manager.js b/src/managers/window.manager.js index 52fa81b..22afac1 100644 --- a/src/managers/window.manager.js +++ b/src/managers/window.manager.js @@ -1365,6 +1365,16 @@ class WindowManager { onboardingWindow = await this.createWindow('onboarding'); this.windows.set('onboarding', onboardingWindow); + // The 'closed' handlers in setupWindowEventHandlers() are wired once, + // at startup, over the windows that exist then. The onboarding wizard + // is created later, so it needs its own handler — otherwise its entry + // outlives the BrowserWindow and later iterations over this.windows + // call methods on a destroyed object. + onboardingWindow.on('closed', () => { + logger.debug('Window closed', { type: 'onboarding' }); + this.windows.delete('onboarding'); + }); + // Once the wizard renderer signals it's ready, send it the // current first-run status so it can pre-populate correctly. onboardingWindow.webContents.once('did-finish-load', () => {