diff --git a/main/launcher/src/main/java/org/cryptomator/launcher/Cryptomator.java b/main/launcher/src/main/java/org/cryptomator/launcher/Cryptomator.java index 5309a80bc..8651553e3 100644 --- a/main/launcher/src/main/java/org/cryptomator/launcher/Cryptomator.java +++ b/main/launcher/src/main/java/org/cryptomator/launcher/Cryptomator.java @@ -6,7 +6,6 @@ package org.cryptomator.launcher; import javafx.application.Application; -import javafx.application.Platform; import javafx.stage.Stage; import org.apache.commons.lang3.SystemUtils; import org.cryptomator.logging.DebugMode; @@ -20,7 +19,6 @@ import javax.inject.Named; import javax.inject.Singleton; import java.io.IOException; import java.util.Optional; -import java.util.concurrent.CountDownLatch; @Singleton public class Cryptomator { @@ -56,14 +54,35 @@ public class Cryptomator { private int run(String[] args) { logConfig.init(); LOG.info("Starting Cryptomator {} on {} {} ({})", applicationVersion.orElse("SNAPSHOT"), SystemUtils.OS_NAME, SystemUtils.OS_VERSION, SystemUtils.OS_ARCH); + debugMode.initialize(); - if (sendArgsToRunningInstance(args)) { - LOG.info("Found running application instance. Shutting down..."); - return 0; + /* + * Attempts to create an IPC connection to a running Cryptomator instance and sends it the given args. + * If no external process could be reached, the args will be handled by the loopback IPC endpoint. + */ + try (IpcFactory.IpcEndpoint endpoint = ipcFactory.create()) { + endpoint.getRemote().handleLaunchArgs(args); // if we are the server, getRemote() returns self. + if (endpoint.isConnectedToRemote()) { + LOG.info("Found running application instance. Shutting down..."); + return 2; + } else { + LOG.debug("Did not find running application instance. Launching GUI..."); + return runGuiApplication(); + } + } catch (IOException e) { + LOG.error("Failed to initiate inter-process communication.", e); + return runGuiApplication(); } + } + /** + * Launches the JavaFX application and waits until shutdown is requested. + * @return Nonzero exit code in case of an error. + */ + private int runGuiApplication() { try { - runGuiApplication(); + CleanShutdownPerformer.registerShutdownHook(); + Application.launch(MainApp.class); LOG.info("Shutting down..."); return 0; } catch (Throwable e) { @@ -72,37 +91,6 @@ public class Cryptomator { } } - /** - * Attempts to create an IPC connection to a running Cryptomator instance and sends it the given args. - * If no external process could be reached, the args will be handled by the loopback IPC endpoint. - * - * @param args Arguments to send to the instance (if possible) - * @return true if a different process could be reached, false otherwise. - */ - private boolean sendArgsToRunningInstance(String[] args) { - try (IpcFactory.IpcEndpoint endpoint = ipcFactory.create()) { - endpoint.getRemote().handleLaunchArgs(args); // if we are the server, getRemote() returns self. - return endpoint.isConnectedToRemote(); - } catch (IOException e) { - LOG.error("Failed to initiate inter-process communication.", e); - return false; - } - } - - /** - * Launches the JavaFX application and waits until shutdown is requested. - */ - private void runGuiApplication() { - debugMode.initialize(); - CleanShutdownPerformer.registerShutdownHook(); - Application.launch(MainApp.class); -// Platform.startup(() -> { -// assert Platform.isFxApplicationThread(); -// FxApplication app = CRYPTOMATOR_COMPONENT.fxApplicationComponent().application(); -// app.start(); -// }); - } - // We need a separate FX Application class, until we can use the module system. See https://stackoverflow.com/q/54756176/4014509 public static class MainApp extends Application {