From 62ff954558ab311add647c46eb175441d580f7e9 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Mon, 29 Jul 2019 16:17:18 +0200 Subject: [PATCH] Minimize mainwindow (instead of closing) when tray icon is not supported by the OS --- .../cryptomator/ui/fxapp/FxApplicationComponent.java | 6 ++++++ .../ui/mainwindow/MainWindowController.java | 10 ++++++++-- .../cryptomator/ui/traymenu/FxApplicationStarter.java | 8 ++++---- .../org/cryptomator/ui/traymenu/TrayMenuComponent.java | 5 ++++- .../cryptomator/ui/traymenu/TrayMenuController.java | 4 ++-- 5 files changed, 24 insertions(+), 9 deletions(-) diff --git a/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplicationComponent.java b/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplicationComponent.java index 7d5fd55bf..f03a63f82 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplicationComponent.java +++ b/main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplicationComponent.java @@ -5,8 +5,11 @@ *******************************************************************************/ package org.cryptomator.ui.fxapp; +import dagger.BindsInstance; import dagger.Subcomponent; +import javax.inject.Named; + @FxApplicationScoped @Subcomponent(modules = FxApplicationModule.class) public interface FxApplicationComponent { @@ -15,6 +18,9 @@ public interface FxApplicationComponent { @Subcomponent.Builder interface Builder { + + @BindsInstance + Builder trayMenuSupported(@Named("trayMenuSupported") boolean trayMenuSupported); FxApplicationComponent build(); } diff --git a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowController.java b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowController.java index 0f072f341..5ecb6208c 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowController.java @@ -20,15 +20,17 @@ public class MainWindowController implements FxController { private final Stage window; private final FxApplication application; + private final boolean minimizeToSysTray; public HBox titleBar; public Region resizer; private double xOffset; private double yOffset; @Inject - public MainWindowController(@MainWindow Stage window, FxApplication application) { + public MainWindowController(@MainWindow Stage window, FxApplication application, @Named("trayMenuSupported") boolean minimizeToSysTray) { this.window = window; this.application = application; + this.minimizeToSysTray = minimizeToSysTray; } @FXML @@ -51,7 +53,11 @@ public class MainWindowController implements FxController { @FXML public void close() { - window.close(); + if (minimizeToSysTray) { + window.close(); + } else { + window.setIconified(true); + } } @FXML diff --git a/main/ui/src/main/java/org/cryptomator/ui/traymenu/FxApplicationStarter.java b/main/ui/src/main/java/org/cryptomator/ui/traymenu/FxApplicationStarter.java index da3363e2a..af3f186c8 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/traymenu/FxApplicationStarter.java +++ b/main/ui/src/main/java/org/cryptomator/ui/traymenu/FxApplicationStarter.java @@ -24,9 +24,9 @@ public class FxApplicationStarter { this.future = new CompletableFuture<>(); } - public synchronized FxApplication get() { + public synchronized FxApplication get(boolean fromTrayMenu) { if (!future.isDone()) { - start(); + start(fromTrayMenu); } try { return future.get(); @@ -38,12 +38,12 @@ public class FxApplicationStarter { } } - private void start() { + private void start(boolean fromTrayMenu) { LOG.debug("Starting JavaFX runtime..."); Platform.startup(() -> { assert Platform.isFxApplicationThread(); LOG.debug("JavaFX Runtime started."); - FxApplication app = fxAppComponent.build().application(); + FxApplication app = fxAppComponent.trayMenuSupported(fromTrayMenu).build().application(); app.start(); future.complete(app); }); diff --git a/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuComponent.java b/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuComponent.java index 4575da95d..1af978b4c 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuComponent.java +++ b/main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayMenuComponent.java @@ -15,11 +15,14 @@ public interface TrayMenuComponent { TrayIconController trayIconController(); + FxApplicationStarter fxAppStarter(); + default void addIconToSystemTray() { if (SystemTray.isSupported()) { trayIconController().initializeTrayIcon(); } else { - // TODO what? + // show main window directly without any tray support: + fxAppStarter().get(false).showMainWindow(); } } 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 64266d74f..e2217c810 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 @@ -57,11 +57,11 @@ class TrayMenuController { } private void showMainWindow(ActionEvent actionEvent) { - fxApplicationStarter.get().showMainWindow(); + fxApplicationStarter.get(true).showMainWindow(); } private void showPreferencesWindow(EventObject actionEvent) { - fxApplicationStarter.get().showPreferencesWindow(); + fxApplicationStarter.get(true).showPreferencesWindow(); } private void quitApplication(ActionEvent actionEvent) {