diff --git a/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuController.java b/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuController.java index 86645d88d..2fa27b0ba 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuController.java @@ -5,6 +5,7 @@ import javafx.beans.Observable; import javafx.collections.ObservableList; import org.cryptomator.common.settings.Settings; import org.cryptomator.common.vaults.Vault; +import org.cryptomator.common.vaults.VaultState; import org.cryptomator.ui.fxapp.FxApplication; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,8 +19,10 @@ import java.awt.PopupMenu; import java.awt.desktop.QuitResponse; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.EnumSet; import java.util.EventObject; import java.util.ResourceBundle; +import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; @@ -35,7 +38,7 @@ class TrayMenuController { private final Settings settings; private final ObservableList vaults; private final PopupMenu menu; - private final AtomicBoolean allVaultsAreLocked; + private final AtomicBoolean allowSuddenTermination; @Inject TrayMenuController(ResourceBundle resourceBundle, FxApplicationStarter fxApplicationStarter, @Named("shutdownLatch") CountDownLatch shutdownLatch, Settings settings, ObservableList vaults) { @@ -45,7 +48,7 @@ class TrayMenuController { this.settings = settings; this.vaults = vaults; this.menu = new PopupMenu(); - this.allVaultsAreLocked = new AtomicBoolean(true); + this.allowSuddenTermination = new AtomicBoolean(true); } public PopupMenu getMenu() { @@ -76,10 +79,16 @@ class TrayMenuController { private void vaultListChanged(@SuppressWarnings("unused") Observable observable) { assert Platform.isFxApplicationThread(); rebuildMenu(); - boolean allLocked = vaults.stream().allMatch(Vault::isLocked); - // TODO remove logging - LOG.warn("allLocked: {}", allLocked); - allVaultsAreLocked.set(allLocked); + Set statesAllowingTermination = EnumSet.of(VaultState.LOCKED, VaultState.NEEDS_MIGRATION, VaultState.MISSING, VaultState.ERROR); + boolean allVaultsAllowTermination = vaults.stream().map(Vault::getState).allMatch(statesAllowingTermination::contains); + allowSuddenTermination.set(allVaultsAllowTermination); + if (Desktop.getDesktop().isSupported(Desktop.Action.APP_SUDDEN_TERMINATION)) { + if (allVaultsAllowTermination) { + Desktop.getDesktop().enableSuddenTermination(); + } else { + Desktop.getDesktop().disableSuddenTermination(); + } + } } private void rebuildMenu() { @@ -141,7 +150,7 @@ class TrayMenuController { } private void handleQuitRequest(EventObject e, QuitResponse response) { - if (allVaultsAreLocked.get()) { + if (allowSuddenTermination.get()) { response.performQuit(); // really? } else { fxApplicationStarter.get(true).thenAccept(app -> app.showQuitWindow(response));