diff --git a/platform/platform-impl/src/com/intellij/ide/AppLifecycleListener.java b/platform/platform-impl/src/com/intellij/ide/AppLifecycleListener.java index 0dbb49745959..8adc41706d78 100644 --- a/platform/platform-impl/src/com/intellij/ide/AppLifecycleListener.java +++ b/platform/platform-impl/src/com/intellij/ide/AppLifecycleListener.java @@ -55,6 +55,11 @@ public interface AppLifecycleListener { */ void appClosing(); + /** + * Fired after all exit checks and after saving the settings. At this point the app is guaranteed to exit. + */ + default void appWillExit() { } + abstract class Adapter implements AppLifecycleListener { @Override public void appFrameCreated(String[] commandLineArgs, @NotNull Ref willOpenProject) { } diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java index bf3580c55a03..2afffcfcf373 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java @@ -758,7 +758,8 @@ public class ApplicationImpl extends PlatformComponentManagerImpl implements App return; } - getMessageBus().syncPublisher(AppLifecycleListener.TOPIC).appClosing(); + final AppLifecycleListener publisher = getMessageBus().syncPublisher(AppLifecycleListener.TOPIC); + publisher.appClosing(); myDisposeInProgress = true; @@ -768,6 +769,7 @@ public class ApplicationImpl extends PlatformComponentManagerImpl implements App saveSettings(); + publisher.appWillExit(); boolean success = disposeSelf(!force); if (!success || isUnitTestMode() || Boolean.getBoolean("idea.test.guimode")) {