diff --git a/src/application-delegate.js b/src/application-delegate.js index 8d7981edb..f6bbd6797 100644 --- a/src/application-delegate.js +++ b/src/application-delegate.js @@ -325,6 +325,13 @@ class ApplicationDelegate { return new Disposable(() => ipcRenderer.removeListener('prepare-to-unload', outerCallback)) } + onUnloadAborted (callback) { + const outerCallback = (event, message) => callback(event) + + ipcRenderer.on('unload-aborted', outerCallback) + return new Disposable(() => ipcRenderer.removeListener('unload-aborted', outerCallback)) + } + onDidChangeHistoryManager (callback) { const outerCallback = (event, message) => callback(event) diff --git a/src/atom-environment.js b/src/atom-environment.js index 59e4da1f6..b773b4d5b 100644 --- a/src/atom-environment.js +++ b/src/atom-environment.js @@ -64,7 +64,7 @@ class AtomEnvironment { this.applicationDelegate = params.applicationDelegate this.nextProxyRequestId = 0 - this.unloaded = false + this.unloading = false this.loadTime = null this.emitter = new Emitter() this.disposables = new CompositeDisposable() @@ -280,7 +280,7 @@ class AtomEnvironment { attachSaveStateListeners () { const saveState = _.debounce(() => { this.window.requestIdleCallback(() => { - if (!this.unloaded) this.saveState({isUnloading: false}) + if (!this.unloading) this.saveState({isUnloading: false}) }) }, this.saveStateDebounceInterval) this.document.addEventListener('mousedown', saveState, true) @@ -775,7 +775,7 @@ class AtomEnvironment { await this.stateStore.clear() } - this.unloaded = false + this.unloading = false const updateProcessEnvPromise = this.updateProcessEnvAndTriggerHooks() @@ -812,9 +812,15 @@ class AtomEnvironment { projectHasPaths: this.project.getPaths().length > 0 }) - if (closing) await this.packages.deactivatePackages() + if (closing) { + this.unloading = true; + await this.packages.deactivatePackages() + } return closing })) + this.disposables.add(this.applicationDelegate.onUnloadAborted(() => { + this.unloading = false + })); this.listenForUpdates() @@ -898,7 +904,6 @@ class AtomEnvironment { this.storeWindowBackground() this.saveBlobStoreSync() - this.unloaded = true } saveBlobStoreSync () { diff --git a/src/main-process/atom-application.js b/src/main-process/atom-application.js index a9ff4f731..9868d59ce 100644 --- a/src/main-process/atom-application.js +++ b/src/main-process/atom-application.js @@ -442,6 +442,7 @@ class AtomApplication extends EventEmitter { if (windowUnloadedResults.every(Boolean)) { app.quit() } else { + this.getAllWindows().forEach(window => window.unloadAborted()) this.quitting = false } } diff --git a/src/main-process/atom-window.js b/src/main-process/atom-window.js index a56679143..16317449e 100644 --- a/src/main-process/atom-window.js +++ b/src/main-process/atom-window.js @@ -245,6 +245,10 @@ class AtomWindow extends EventEmitter { return this.lastPrepareToUnloadPromise } + unloadAborted () { + this.browserWindow.webContents.send('unload-aborted') + } + openPath (pathToOpen, initialLine, initialColumn) { return this.openLocations([{pathToOpen, initialLine, initialColumn}]) }