From 2fedf9ab34aaa5d37839b01fe04d2bd952ddaf8d Mon Sep 17 00:00:00 2001 From: crschnick Date: Mon, 3 Feb 2025 06:04:38 +0000 Subject: [PATCH] Rework terminal loading --- app/src/main/java/io/xpipe/app/Main.java | 2 +- .../impl/TerminalPrepareExchangeImpl.java | 28 +++++++++++++++ .../beacon/impl/TerminalWaitExchangeImpl.java | 4 +-- .../app/terminal/AlacrittyTerminalType.java | 2 +- .../xpipe/app/terminal/CmdTerminalType.java | 7 +++- .../app/terminal/CustomTerminalType.java | 2 +- .../app/terminal/ExternalTerminalType.java | 36 ++++++++++--------- .../xpipe/app/terminal/GnomeTerminalType.java | 2 +- .../xpipe/app/terminal/KittyTerminalType.java | 2 +- .../app/terminal/MobaXTermTerminalType.java | 2 +- .../app/terminal/PowerShellTerminalType.java | 7 +++- .../xpipe/app/terminal/PwshTerminalType.java | 7 +++- .../app/terminal/SecureCrtTerminalType.java | 2 +- .../xpipe/app/terminal/TabbyTerminalType.java | 2 +- .../xpipe/app/terminal/TerminalLauncher.java | 2 +- .../app/terminal/TerminalLauncherManager.java | 23 +++++++++--- .../app/terminal/TermiusTerminalType.java | 2 +- .../xpipe/app/terminal/WarpTerminalType.java | 2 +- .../xpipe/app/terminal/WaveTerminalType.java | 2 +- .../xpipe/app/terminal/WezTerminalType.java | 2 +- .../app/terminal/WindowsTerminalType.java | 2 +- .../app/terminal/XShellTerminalType.java | 2 +- app/src/main/java/module-info.java | 1 + .../beacon/api/TerminalLaunchExchange.java | 2 +- .../beacon/api/TerminalPrepareExchange.java | 36 +++++++++++++++++++ .../beacon/api/TerminalWaitExchange.java | 4 +-- beacon/src/main/java/module-info.java | 1 + 27 files changed, 141 insertions(+), 45 deletions(-) create mode 100644 app/src/main/java/io/xpipe/app/beacon/impl/TerminalPrepareExchangeImpl.java create mode 100644 beacon/src/main/java/io/xpipe/beacon/api/TerminalPrepareExchange.java diff --git a/app/src/main/java/io/xpipe/app/Main.java b/app/src/main/java/io/xpipe/app/Main.java index 1f87356fb..0943ff784 100644 --- a/app/src/main/java/io/xpipe/app/Main.java +++ b/app/src/main/java/io/xpipe/app/Main.java @@ -19,7 +19,7 @@ public class Main { """ The daemon executable xpiped does not accept any command-line arguments. - For a reference on what you can do from the CLI, take a look at the xpipe CLI executable instead. + For a reference on how to use xpipe from the command-line, take a look at https://docs.xpipe.io/cli. """); return; } diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/TerminalPrepareExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/TerminalPrepareExchangeImpl.java new file mode 100644 index 000000000..92a0f1cb2 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/beacon/impl/TerminalPrepareExchangeImpl.java @@ -0,0 +1,28 @@ +package io.xpipe.app.beacon.impl; + +import com.sun.net.httpserver.HttpExchange; +import io.xpipe.app.prefs.AppPrefs; +import io.xpipe.app.terminal.TerminalLauncherManager; +import io.xpipe.app.terminal.TerminalView; +import io.xpipe.beacon.BeaconClientException; +import io.xpipe.beacon.BeaconServerException; +import io.xpipe.beacon.api.TerminalPrepareExchange; + +public class TerminalPrepareExchangeImpl extends TerminalPrepareExchange { + + @Override + public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException, BeaconServerException { + TerminalView.get().open(msg.getRequest(), msg.getPid()); + TerminalLauncherManager.registerPid(msg.getRequest(), msg.getPid()); + var term = AppPrefs.get().terminalType().getValue(); + var unicode = true; + var escapes = term.supportsEscapes(); + var finished = TerminalLauncherManager.isCompletedSuccessfully(msg.getRequest()); + return Response.builder().supportsUnicode(unicode).supportsEscapeSequences(escapes).alreadyFinished(finished).build(); + } + + @Override + public boolean requiresEnabledApi() { + return false; + } +} diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/TerminalWaitExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/TerminalWaitExchangeImpl.java index 131450996..16974f86f 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/TerminalWaitExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/impl/TerminalWaitExchangeImpl.java @@ -9,10 +9,10 @@ import io.xpipe.beacon.api.TerminalWaitExchange; import com.sun.net.httpserver.HttpExchange; public class TerminalWaitExchangeImpl extends TerminalWaitExchange { + @Override public Object handle(HttpExchange exchange, Request msg) throws BeaconClientException, BeaconServerException { - TerminalView.get().open(msg.getRequest(), msg.getPid()); - TerminalLauncherManager.waitExchange(msg.getRequest(), msg.getPid()); + TerminalLauncherManager.waitExchange(msg.getRequest()); return Response.builder().build(); } diff --git a/app/src/main/java/io/xpipe/app/terminal/AlacrittyTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/AlacrittyTerminalType.java index 9f220ddf9..acaa7c60f 100644 --- a/app/src/main/java/io/xpipe/app/terminal/AlacrittyTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/AlacrittyTerminalType.java @@ -25,7 +25,7 @@ public interface AlacrittyTerminalType extends ExternalTerminalType, TrackableTe } @Override - default boolean supportsColoredTitle() { + default boolean useColoredTitle() { return false; } diff --git a/app/src/main/java/io/xpipe/app/terminal/CmdTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/CmdTerminalType.java index 8b2a2dcb0..374a98eb5 100644 --- a/app/src/main/java/io/xpipe/app/terminal/CmdTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/CmdTerminalType.java @@ -11,6 +11,11 @@ public class CmdTerminalType extends ExternalTerminalType.SimplePathType impleme super("app.cmd", "cmd.exe", true); } + @Override + public boolean supportsEscapes() { + return false; + } + @Override public TerminalOpenFormat getOpenFormat() { return TerminalOpenFormat.NEW_WINDOW; @@ -29,7 +34,7 @@ public class CmdTerminalType extends ExternalTerminalType.SimplePathType impleme } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return false; } diff --git a/app/src/main/java/io/xpipe/app/terminal/CustomTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/CustomTerminalType.java index a239590be..433d3f82b 100644 --- a/app/src/main/java/io/xpipe/app/terminal/CustomTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/CustomTerminalType.java @@ -26,7 +26,7 @@ public class CustomTerminalType extends ExternalApplicationType implements Exter } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return true; } diff --git a/app/src/main/java/io/xpipe/app/terminal/ExternalTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/ExternalTerminalType.java index 81522c910..ccd4eaaa0 100644 --- a/app/src/main/java/io/xpipe/app/terminal/ExternalTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/ExternalTerminalType.java @@ -117,7 +117,7 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return false; } @@ -149,7 +149,7 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return true; } @@ -180,7 +180,7 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return true; } @@ -210,7 +210,7 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return true; } @@ -239,7 +239,7 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return true; } @@ -264,7 +264,7 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return true; } @@ -295,7 +295,7 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return true; } @@ -327,7 +327,7 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return true; } @@ -359,7 +359,7 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return true; } @@ -390,7 +390,7 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return true; } @@ -421,7 +421,7 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return false; } @@ -457,7 +457,7 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return true; } @@ -489,7 +489,7 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return true; } @@ -516,7 +516,7 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return true; } @@ -552,7 +552,7 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return true; } @@ -679,7 +679,11 @@ public interface ExternalTerminalType extends PrefsChoiceValue { boolean isRecommended(); - boolean supportsColoredTitle(); + boolean useColoredTitle(); + + default boolean supportsEscapes() { + return true; + } default boolean shouldClear() { return true; diff --git a/app/src/main/java/io/xpipe/app/terminal/GnomeTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/GnomeTerminalType.java index 108ea0da5..3ff06309d 100644 --- a/app/src/main/java/io/xpipe/app/terminal/GnomeTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/GnomeTerminalType.java @@ -27,7 +27,7 @@ public class GnomeTerminalType extends ExternalTerminalType.PathCheckType implem } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return false; } diff --git a/app/src/main/java/io/xpipe/app/terminal/KittyTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/KittyTerminalType.java index 0d9ba1ae7..e686ceef6 100644 --- a/app/src/main/java/io/xpipe/app/terminal/KittyTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/KittyTerminalType.java @@ -89,7 +89,7 @@ public interface KittyTerminalType extends ExternalTerminalType, TrackableTermin } @Override - default boolean supportsColoredTitle() { + default boolean useColoredTitle() { return true; } diff --git a/app/src/main/java/io/xpipe/app/terminal/MobaXTermTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/MobaXTermTerminalType.java index 4f9a0d0d9..c3b4a3ef0 100644 --- a/app/src/main/java/io/xpipe/app/terminal/MobaXTermTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/MobaXTermTerminalType.java @@ -40,7 +40,7 @@ public class MobaXTermTerminalType extends ExternalTerminalType.WindowsType { } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return true; } diff --git a/app/src/main/java/io/xpipe/app/terminal/PowerShellTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/PowerShellTerminalType.java index cfa267892..c96b2fd16 100644 --- a/app/src/main/java/io/xpipe/app/terminal/PowerShellTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/PowerShellTerminalType.java @@ -10,6 +10,11 @@ import java.util.Base64; public class PowerShellTerminalType extends ExternalTerminalType.SimplePathType implements TrackableTerminalType { + @Override + public boolean supportsEscapes() { + return false; + } + public PowerShellTerminalType() { super("app.powershell", "powershell", true); } @@ -32,7 +37,7 @@ public class PowerShellTerminalType extends ExternalTerminalType.SimplePathType } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return false; } diff --git a/app/src/main/java/io/xpipe/app/terminal/PwshTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/PwshTerminalType.java index 2d3703c08..a6dea668d 100644 --- a/app/src/main/java/io/xpipe/app/terminal/PwshTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/PwshTerminalType.java @@ -11,6 +11,11 @@ public class PwshTerminalType extends ExternalTerminalType.SimplePathType implem super("app.pwsh", "pwsh", true); } + @Override + public boolean supportsEscapes() { + return false; + } + @Override public TerminalOpenFormat getOpenFormat() { return TerminalOpenFormat.NEW_WINDOW; @@ -27,7 +32,7 @@ public class PwshTerminalType extends ExternalTerminalType.SimplePathType implem } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return false; } diff --git a/app/src/main/java/io/xpipe/app/terminal/SecureCrtTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/SecureCrtTerminalType.java index 389902fac..c3b5f7773 100644 --- a/app/src/main/java/io/xpipe/app/terminal/SecureCrtTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/SecureCrtTerminalType.java @@ -43,7 +43,7 @@ public class SecureCrtTerminalType extends ExternalTerminalType.WindowsType { } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return false; } diff --git a/app/src/main/java/io/xpipe/app/terminal/TabbyTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/TabbyTerminalType.java index 5cf0a238d..7b2a90eb9 100644 --- a/app/src/main/java/io/xpipe/app/terminal/TabbyTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/TabbyTerminalType.java @@ -25,7 +25,7 @@ public interface TabbyTerminalType extends ExternalTerminalType, TrackableTermin } @Override - default boolean supportsColoredTitle() { + default boolean useColoredTitle() { return true; } diff --git a/app/src/main/java/io/xpipe/app/terminal/TerminalLauncher.java b/app/src/main/java/io/xpipe/app/terminal/TerminalLauncher.java index ad0d56ec7..cf757d275 100644 --- a/app/src/main/java/io/xpipe/app/terminal/TerminalLauncher.java +++ b/app/src/main/java/io/xpipe/app/terminal/TerminalLauncher.java @@ -59,7 +59,7 @@ public class TerminalLauncher { } var color = entry != null ? DataStorage.get().getEffectiveColor(entry) : null; - var prefix = entry != null && color != null && type.supportsColoredTitle() ? color.getEmoji() + " " : ""; + var prefix = entry != null && color != null && type.useColoredTitle() ? color.getEmoji() + " " : ""; var cleanTitle = (title != null ? title : entry != null ? entry.getName() : "?"); var adjustedTitle = prefix + cleanTitle; var log = AppPrefs.get().enableTerminalLogging().get(); diff --git a/app/src/main/java/io/xpipe/app/terminal/TerminalLauncherManager.java b/app/src/main/java/io/xpipe/app/terminal/TerminalLauncherManager.java index 8a97d0aa0..d3cfd628b 100644 --- a/app/src/main/java/io/xpipe/app/terminal/TerminalLauncherManager.java +++ b/app/src/main/java/io/xpipe/app/terminal/TerminalLauncherManager.java @@ -61,15 +61,18 @@ public class TerminalLauncherManager { return last.waitForCompletion(); } - public static Path waitExchange(UUID request, long pid) throws BeaconClientException, BeaconServerException { + public static boolean isCompletedSuccessfully(UUID request) { + synchronized (entries) { + var req = entries.get(request); + return req.getResult() instanceof TerminalLaunchResult.ResultSuccess; + } + } + + public static void registerPid(UUID request, long pid) throws BeaconClientException { TerminalLaunchRequest req; synchronized (entries) { req = entries.get(request); } - if (req == null) { - throw new BeaconClientException("Unknown launch request " + request); - } - var byPid = ProcessHandle.of(pid); if (byPid.isEmpty()) { throw new BeaconClientException("Unable to find terminal child process " + pid); @@ -79,6 +82,16 @@ public class TerminalLauncherManager { throw new BeaconClientException("Wrong launch context"); } req.setPid(shell.pid()); + } + + public static Path waitExchange(UUID request) throws BeaconClientException, BeaconServerException { + TerminalLaunchRequest req; + synchronized (entries) { + req = entries.get(request); + } + if (req == null) { + throw new BeaconClientException("Unknown launch request " + request); + } if (req.isSetupCompleted()) { submitAsync(req.getRequest(), req.getProcessControl(), req.getConfig(), req.getWorkingDirectory()); diff --git a/app/src/main/java/io/xpipe/app/terminal/TermiusTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/TermiusTerminalType.java index 652c3bcc1..6c040e808 100644 --- a/app/src/main/java/io/xpipe/app/terminal/TermiusTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/TermiusTerminalType.java @@ -61,7 +61,7 @@ public class TermiusTerminalType implements ExternalTerminalType { } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return true; } diff --git a/app/src/main/java/io/xpipe/app/terminal/WarpTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/WarpTerminalType.java index 88eeb5fd9..8aac25781 100644 --- a/app/src/main/java/io/xpipe/app/terminal/WarpTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/WarpTerminalType.java @@ -32,7 +32,7 @@ public class WarpTerminalType extends ExternalTerminalType.MacOsType { } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return true; } diff --git a/app/src/main/java/io/xpipe/app/terminal/WaveTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/WaveTerminalType.java index 046185b98..b559bef9f 100644 --- a/app/src/main/java/io/xpipe/app/terminal/WaveTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/WaveTerminalType.java @@ -28,7 +28,7 @@ public interface WaveTerminalType extends ExternalTerminalType, TrackableTermina } @Override - default boolean supportsColoredTitle() { + default boolean useColoredTitle() { return true; } diff --git a/app/src/main/java/io/xpipe/app/terminal/WezTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/WezTerminalType.java index a6d9573ec..c224066ba 100644 --- a/app/src/main/java/io/xpipe/app/terminal/WezTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/WezTerminalType.java @@ -29,7 +29,7 @@ public interface WezTerminalType extends ExternalTerminalType, TrackableTerminal } @Override - default boolean supportsColoredTitle() { + default boolean useColoredTitle() { return true; } diff --git a/app/src/main/java/io/xpipe/app/terminal/WindowsTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/WindowsTerminalType.java index 8d79730ea..8d7571771 100644 --- a/app/src/main/java/io/xpipe/app/terminal/WindowsTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/WindowsTerminalType.java @@ -124,7 +124,7 @@ public interface WindowsTerminalType extends ExternalTerminalType, TrackableTerm } @Override - default boolean supportsColoredTitle() { + default boolean useColoredTitle() { return false; } diff --git a/app/src/main/java/io/xpipe/app/terminal/XShellTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/XShellTerminalType.java index 11ec59ebb..7cf623f7f 100644 --- a/app/src/main/java/io/xpipe/app/terminal/XShellTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/XShellTerminalType.java @@ -50,7 +50,7 @@ public class XShellTerminalType extends ExternalTerminalType.WindowsType { } @Override - public boolean supportsColoredTitle() { + public boolean useColoredTitle() { return false; } diff --git a/app/src/main/java/module-info.java b/app/src/main/java/module-info.java index 2ae799105..c000ae695 100644 --- a/app/src/main/java/module-info.java +++ b/app/src/main/java/module-info.java @@ -148,6 +148,7 @@ open module io.xpipe.app { FsScriptExchangeImpl, FsWriteExchangeImpl, AskpassExchangeImpl, + TerminalPrepareExchangeImpl, TerminalWaitExchangeImpl, TerminalLaunchExchangeImpl, SshLaunchExchangeImpl, diff --git a/beacon/src/main/java/io/xpipe/beacon/api/TerminalLaunchExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/TerminalLaunchExchange.java index 3d28ce709..757b34a7f 100644 --- a/beacon/src/main/java/io/xpipe/beacon/api/TerminalLaunchExchange.java +++ b/beacon/src/main/java/io/xpipe/beacon/api/TerminalLaunchExchange.java @@ -14,7 +14,7 @@ public class TerminalLaunchExchange extends BeaconInterface { + + @Override + public String getPath() { + return "/terminal/prepare"; + } + + @Jacksonized + @Builder + @Value + public static class Request { + @NonNull + UUID request; + + long pid; + } + + @Jacksonized + @Builder + @Value + public static class Response { + boolean supportsUnicode; + boolean supportsEscapeSequences; + boolean alreadyFinished; + } +} diff --git a/beacon/src/main/java/io/xpipe/beacon/api/TerminalWaitExchange.java b/beacon/src/main/java/io/xpipe/beacon/api/TerminalWaitExchange.java index 71d9dcd76..1864c923b 100644 --- a/beacon/src/main/java/io/xpipe/beacon/api/TerminalWaitExchange.java +++ b/beacon/src/main/java/io/xpipe/beacon/api/TerminalWaitExchange.java @@ -13,7 +13,7 @@ public class TerminalWaitExchange extends BeaconInterface