From 1db33aee530ec2c4eaf57d2e98f7d964ce1a7fcc Mon Sep 17 00:00:00 2001 From: crschnick Date: Wed, 26 Aug 2026 00:51:38 +0000 Subject: [PATCH] Rework [stage] --- app/src/main/java/io/xpipe/app/core/AppTrayIcon.java | 6 +++++- .../main/java/io/xpipe/app/core/mode/AppBaseMode.java | 7 +++++++ .../main/java/io/xpipe/app/core/mode/AppGuiMode.java | 9 ++++++--- .../main/java/io/xpipe/app/core/mode/AppTrayMode.java | 10 +++++++--- version | 2 +- 5 files changed, 26 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/core/AppTrayIcon.java b/app/src/main/java/io/xpipe/app/core/AppTrayIcon.java index 9b9f204be..b86cadbd5 100644 --- a/app/src/main/java/io/xpipe/app/core/AppTrayIcon.java +++ b/app/src/main/java/io/xpipe/app/core/AppTrayIcon.java @@ -45,13 +45,17 @@ public class AppTrayIcon { { var quit = new MenuItem(AppI18n.get("quit")); quit.addActionListener(e -> { - tray.remove(trayIcon); + trayIcon.setPopupMenu(null); AppOperationMode.shutdown(false); }); popupMenu.add(quit); } trayIcon.addActionListener(e -> { + if (AppOperationMode.isInShutdown()) { + return; + } + if (OsType.ofLocal() != OsType.MACOS) { tray.remove(trayIcon); AppOperationMode.switchToAsync(AppOperationMode.GUI); diff --git a/app/src/main/java/io/xpipe/app/core/mode/AppBaseMode.java b/app/src/main/java/io/xpipe/app/core/mode/AppBaseMode.java index 06f93f04d..59e25bd12 100644 --- a/app/src/main/java/io/xpipe/app/core/mode/AppBaseMode.java +++ b/app/src/main/java/io/xpipe/app/core/mode/AppBaseMode.java @@ -21,6 +21,7 @@ import io.xpipe.app.icon.SystemIconManager; import io.xpipe.app.issue.TrackEvent; import io.xpipe.app.platform.PlatformInit; import io.xpipe.app.platform.PlatformState; +import io.xpipe.app.platform.PlatformThread; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.prefs.WorkspaceManager; import io.xpipe.app.process.LocalShell; @@ -228,6 +229,12 @@ public class AppBaseMode extends AppOperationMode { BrowserLocalFileSystem.reset(); ProcModuleProvider.get().reset(); AppBeaconServer.reset(); + + AppMainWindow.get().hide(); + if (AppTray.get() != null) { + PlatformThread.runLaterIfNeededBlocking(() -> AppTray.get().hide()); + } + StoreViewState.reset(); StoreFilterState.reset(); AppLayoutModel.reset(); diff --git a/app/src/main/java/io/xpipe/app/core/mode/AppGuiMode.java b/app/src/main/java/io/xpipe/app/core/mode/AppGuiMode.java index d121d7f08..8178f8749 100644 --- a/app/src/main/java/io/xpipe/app/core/mode/AppGuiMode.java +++ b/app/src/main/java/io/xpipe/app/core/mode/AppGuiMode.java @@ -37,10 +37,13 @@ public class AppGuiMode extends AppOperationMode { .toList() .forEach(w -> w.hide()); - // If we are in an externally started shutdown hook, don't close the windows until the platform exits - // That way, it is kept open to block for shutdowns on Windows systems - if (OsType.ofLocal() != OsType.WINDOWS || !AppOperationMode.isInShutdownHook()) { + // When changing between modes, close window instantly + // Otherwise, the background mode shutdown closes this + if (!AppOperationMode.isInShutdown()) { AppMainWindow.get().hide(); + } else { + // Show teardown screen + AppMainWindow.resetContent(); } }); } diff --git a/app/src/main/java/io/xpipe/app/core/mode/AppTrayMode.java b/app/src/main/java/io/xpipe/app/core/mode/AppTrayMode.java index 078ee1b0f..42ed4307d 100644 --- a/app/src/main/java/io/xpipe/app/core/mode/AppTrayMode.java +++ b/app/src/main/java/io/xpipe/app/core/mode/AppTrayMode.java @@ -1,6 +1,7 @@ package io.xpipe.app.core.mode; import io.xpipe.app.core.AppTray; +import io.xpipe.app.core.window.AppMainWindow; import io.xpipe.app.issue.*; import io.xpipe.app.platform.PlatformInit; import io.xpipe.app.platform.PlatformThread; @@ -38,9 +39,12 @@ public class AppTrayMode extends AppOperationMode { @Override public void onSwitchFrom() { - if (AppTray.get() != null) { - TrackEvent.info("Closing tray"); - PlatformThread.runLaterIfNeededBlocking(() -> AppTray.get().hide()); + // When changing between modes, close tray instantly + // Otherwise, the background mode shutdown closes this + if (!AppOperationMode.isInShutdown()) { + if (AppTray.get() != null) { + PlatformThread.runLaterIfNeededBlocking(() -> AppTray.get().hide()); + } } } diff --git a/version b/version index 901d9b65c..28c7f5fcc 100644 --- a/version +++ b/version @@ -1 +1 @@ -24.0-57 +24.0-58