From a7b027ccd901b4b9c003881edf596cd7340cbaca Mon Sep 17 00:00:00 2001 From: crschnick Date: Tue, 23 Jun 2026 13:38:20 +0000 Subject: [PATCH] Rework --- .../java/io/xpipe/app/beacon/mcp/McpToolHandler.java | 4 ++++ .../main/java/io/xpipe/app/core/AppLayoutModel.java | 2 +- .../io/xpipe/app/core/mode/AppOperationMode.java | 2 +- .../java/io/xpipe/app/prefs/WorkspaceManager.java | 2 ++ .../io/xpipe/app/webtop/WebtopAppListDialog.java | 2 +- .../io/xpipe/app/webtop/WebtopAppListManager.java | 6 ++++-- .../java/io/xpipe/app/webtop/WebtopDisplayScale.java | 9 +++++++++ .../main/java/io/xpipe/app/webtop/WebtopMode.java | 11 +++++------ .../resources/io/xpipe/app/resources/style/style.css | 12 ++++++++++-- 9 files changed, 37 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/beacon/mcp/McpToolHandler.java b/app/src/main/java/io/xpipe/app/beacon/mcp/McpToolHandler.java index fb67aafd8..458c698dd 100644 --- a/app/src/main/java/io/xpipe/app/beacon/mcp/McpToolHandler.java +++ b/app/src/main/java/io/xpipe/app/beacon/mcp/McpToolHandler.java @@ -81,6 +81,10 @@ public interface McpToolHandler } public String getStringArgument(String key) throws BeaconClientException { + if (request.arguments() == null) { + throw new BeaconClientException("Missing argument for key " + key); + } + var o = request.arguments().get(key); if (o == null) { throw new BeaconClientException("Missing argument for key " + key); diff --git a/app/src/main/java/io/xpipe/app/core/AppLayoutModel.java b/app/src/main/java/io/xpipe/app/core/AppLayoutModel.java index e68025c0c..cc3d50889 100644 --- a/app/src/main/java/io/xpipe/app/core/AppLayoutModel.java +++ b/app/src/main/java/io/xpipe/app/core/AppLayoutModel.java @@ -225,7 +225,7 @@ public class AppLayoutModel { null, () -> Hyperlinks.open(DocumentationLink.getRoot()), null))); - if (AppDistributionType.get() != AppDistributionType.WEBTOP) { + if (AppDistributionType.get() == AppDistributionType.WEBTOP) { l.add( new Entry( AppI18n.observable("visitGithubRepository"), diff --git a/app/src/main/java/io/xpipe/app/core/mode/AppOperationMode.java b/app/src/main/java/io/xpipe/app/core/mode/AppOperationMode.java index 67f2e2dd3..9ba66ca96 100644 --- a/app/src/main/java/io/xpipe/app/core/mode/AppOperationMode.java +++ b/app/src/main/java/io/xpipe/app/core/mode/AppOperationMode.java @@ -279,7 +279,7 @@ public abstract class AppOperationMode { // In case we perform any operations such as opening a terminal // give it some time to open while this process is still alive // Otherwise it might quit because the parent process is dead already - ThreadHelper.sleep(100); + ThreadHelper.sleep(500); AppOperationMode.halt(0); }; diff --git a/app/src/main/java/io/xpipe/app/prefs/WorkspaceManager.java b/app/src/main/java/io/xpipe/app/prefs/WorkspaceManager.java index c1a107652..cd75a5bc0 100644 --- a/app/src/main/java/io/xpipe/app/prefs/WorkspaceManager.java +++ b/app/src/main/java/io/xpipe/app/prefs/WorkspaceManager.java @@ -21,6 +21,7 @@ import javafx.collections.ObservableList; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.type.TypeFactory; import lombok.Getter; +import org.apache.commons.io.FileUtils; import java.nio.file.Files; import java.nio.file.Path; @@ -50,6 +51,7 @@ public class WorkspaceManager { } } catch (Exception e) { ErrorEventFactory.fromThrowable(e).expected().handle(); + FileUtils.deleteQuietly(file.toFile()); } } diff --git a/app/src/main/java/io/xpipe/app/webtop/WebtopAppListDialog.java b/app/src/main/java/io/xpipe/app/webtop/WebtopAppListDialog.java index 915bda25b..005db6641 100644 --- a/app/src/main/java/io/xpipe/app/webtop/WebtopAppListDialog.java +++ b/app/src/main/java/io/xpipe/app/webtop/WebtopAppListDialog.java @@ -15,7 +15,7 @@ public class WebtopAppListDialog { private static List lastShown; public static synchronized void show(List include) { - if (include.equals(lastShown)) { + if (!include.isEmpty() && include.equals(lastShown)) { return; } diff --git a/app/src/main/java/io/xpipe/app/webtop/WebtopAppListManager.java b/app/src/main/java/io/xpipe/app/webtop/WebtopAppListManager.java index a26d182b3..7c386bc04 100644 --- a/app/src/main/java/io/xpipe/app/webtop/WebtopAppListManager.java +++ b/app/src/main/java/io/xpipe/app/webtop/WebtopAppListManager.java @@ -1,5 +1,6 @@ package io.xpipe.app.webtop; +import io.xpipe.app.core.AppInstallation; import io.xpipe.app.core.AppSystemInfo; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.prefs.AppPrefs; @@ -200,7 +201,8 @@ public class WebtopAppListManager { var command = "/apps/install.sh " + rem.stream() .map(webtopApp -> webtopApp.getId()) .collect(Collectors.joining(" ")); - var restartCommand = requiresRestart ? "xpipe daemon stop --wait\nxpipe open" : null; - TerminalLaunch.builder().title("Install packages").localScript(ShellScript.lines(command, restartCommand)).pauseOnExit(false).launch(); + var exec = AppInstallation.ofCurrent().getCliExecutablePath(); + var endCommand = requiresRestart ? exec + " daemon stop --wait\n" + exec + " open" : exec + " open"; + TerminalLaunch.builder().title("Install packages").localScript(ShellScript.lines(command, endCommand)).pauseOnExit(false).launch(); } } diff --git a/app/src/main/java/io/xpipe/app/webtop/WebtopDisplayScale.java b/app/src/main/java/io/xpipe/app/webtop/WebtopDisplayScale.java index 2d14297ac..df83c3502 100644 --- a/app/src/main/java/io/xpipe/app/webtop/WebtopDisplayScale.java +++ b/app/src/main/java/io/xpipe/app/webtop/WebtopDisplayScale.java @@ -12,6 +12,7 @@ import io.xpipe.app.update.AppDistributionType; import io.xpipe.app.util.GlobalTimer; import java.time.Duration; +import java.util.Optional; import java.util.OptionalInt; public class WebtopDisplayScale { @@ -52,6 +53,14 @@ public class WebtopDisplayScale { } private static OptionalInt getDpi() throws Exception { + if (AppOperationMode.isInStartup() || AppOperationMode.isInShutdown()) { + return OptionalInt.empty(); + } + + if (!LocalShell.isInitialized()) { + return OptionalInt.empty(); + } + var out = LocalShell.getShell().command(CommandBuilder.of().add("xrdb", "-query")) .sensitive() .readStdoutIfPossible(); diff --git a/app/src/main/java/io/xpipe/app/webtop/WebtopMode.java b/app/src/main/java/io/xpipe/app/webtop/WebtopMode.java index 4f1358ff8..aefd9564e 100644 --- a/app/src/main/java/io/xpipe/app/webtop/WebtopMode.java +++ b/app/src/main/java/io/xpipe/app/webtop/WebtopMode.java @@ -1,5 +1,6 @@ package io.xpipe.app.webtop; +import io.xpipe.app.core.AppInstallation; import io.xpipe.app.core.AppSystemInfo; import io.xpipe.app.core.mode.AppOperationMode; import io.xpipe.app.prefs.ExternalApplicationHelper; @@ -8,6 +9,7 @@ import io.xpipe.app.util.LocalExec; import io.xpipe.app.util.ThreadHelper; import java.nio.file.Files; +import java.nio.file.StandardOpenOption; public class WebtopMode { @@ -24,14 +26,11 @@ public class WebtopMode { public static void set(boolean mobile) { AppOperationMode.executeAfterShutdown(() -> { - var file = AppSystemInfo.ofCurrent().getUserHome().resolve(".xpipe", "webtop", "mobile"); + var exec = AppInstallation.ofCurrent().getCliExecutablePath(); if (!mobile) { - Files.deleteIfExists(file); - ExternalApplicationHelper.startAsync(CommandBuilder.of().add("bash", "-c").addQuoted("sleep 3 && /defaults/desktop.sh && plasmashell --replace && xpipe open")); + ExternalApplicationHelper.startAsync(CommandBuilder.of().add("bash", "-c").addQuoted("/defaults/desktop.sh && /defaults/reload.sh && /defaults/waitx.sh && " + exec + " open")); } else { - Files.createDirectories(file.getParent()); - Files.createFile(file); - ExternalApplicationHelper.startAsync(CommandBuilder.of().add("bash", "-c").addQuoted("sleep 3 && /defaults/mobile.sh && plasmashell --replace && xpipe open")); + ExternalApplicationHelper.startAsync(CommandBuilder.of().add("bash", "-c").addQuoted("/defaults/mobile.sh && /defaults/reload.sh && /defaults/waitx.sh && " + exec + " open")); } }); } diff --git a/app/src/main/resources/io/xpipe/app/resources/style/style.css b/app/src/main/resources/io/xpipe/app/resources/style/style.css index f5dd0306c..826b2a27e 100644 --- a/app/src/main/resources/io/xpipe/app/resources/style/style.css +++ b/app/src/main/resources/io/xpipe/app/resources/style/style.css @@ -278,14 +278,22 @@ } .webtop-mode { - -fx-font-size: 1.7em; + -fx-font-size: 1.6em; -fx-padding: 1em; } .webtop-mode .toggle-button { + -fx-background-color: -color-bg-default; + -fx-text-fill: -color-fg-default; + -fx-border-color: -color-border-default; -fx-padding: 1em; + -fx-border-radius: 4; +} + +.webtop-mode .toggle-button:selected { + -fx-border-color: -color-accent-muted; } .webtop-mode .ikonli-font-icon { - -fx-icon-size: 50; + -fx-icon-size: 35; }