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 2fe552e8..96f63e75 100644 --- a/app/src/main/java/io/xpipe/app/terminal/KittyTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/KittyTerminalType.java @@ -1,7 +1,10 @@ package io.xpipe.app.terminal; import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import io.xpipe.app.util.ApplicationHelper; import io.xpipe.app.util.LocalShell; +import io.xpipe.app.util.ShellTemp; +import io.xpipe.app.util.ThreadHelper; import io.xpipe.core.process.CommandBuilder; import io.xpipe.core.store.FilePath; import io.xpipe.core.util.XPipeInstallation; @@ -12,7 +15,7 @@ public class KittyTerminalType { @Override public String getId() { - return "app.tabby"; + return "app.kitty"; } @Override @@ -22,33 +25,42 @@ public class KittyTerminalType { @Override public void launch(LaunchConfiguration configuration) throws Exception { - launchInstanceIfNeeded(); + var toClose = prepare(); open(configuration); + if (toClose) { + closeInitial(); + } } }; private static FilePath getSocket() throws Exception { try (var sc = LocalShell.getShell().start()) { - var temp = sc.getSystemTemporaryDirectory(); + var temp = ShellTemp.getUserSpecificTempDataDirectory(sc, null); + sc.executeSimpleCommand(sc.getShellDialect().getMkdirsCommand(temp.toString())); return temp.join("xpipe_kitty"); } } - private static void launchInstanceIfNeeded() throws Exception { + private static boolean prepare() throws Exception { var socket = getSocket(); try (var sc = LocalShell.getShell().start()) { - if (sc.getShellDialect().createFileExistsCommand(sc,socket.toString()).executeAndCheck()) { - return; + ApplicationHelper.checkIsInPath(sc, "kitty", "Kitty", null); + ApplicationHelper.checkIsInPath(sc, "socat", "socat", null); + + if (sc.executeSimpleBooleanCommand("test -w " + sc.getShellDialect().fileArgument(socket))) { + return false; } sc.executeSimpleCommand(CommandBuilder.of().add("kitty").add("-o", "allow_remote_control=socket-only", "--listen-on", "unix:" + getSocket(), "--detach")); + ThreadHelper.sleep(1500); + return true; } } private static void open(ExternalTerminalType.LaunchConfiguration configuration) throws Exception { try (var sc = LocalShell.getShell().start()) { var payload = JsonNodeFactory.instance.objectNode(); - payload.put("args", configuration.getDialectLaunchCommand().buildString(sc)); + payload.putArray("args").add("bash"); payload.put("tab_title",configuration.getColoredTitle()); payload.put("type", "tab"); payload.put("logo_alpha", 0.01); @@ -57,6 +69,23 @@ public class KittyTerminalType { var json = JsonNodeFactory.instance.objectNode(); json.put("cmd", "launch"); json.set("payload", payload); + json.putArray("version").add(0).add(14).add(2); + var jsonString = json.toString(); + var echoString = "'\\eP@kitty-cmd" + jsonString + "\\e\\\\'"; + + sc.executeSimpleCommand(CommandBuilder.of().add("echo", "-en", echoString, "|", "socat", "-").addFile(getSocket())); + } + } + + private static void closeInitial() throws Exception { + try (var sc = LocalShell.getShell().start()) { + var payload = JsonNodeFactory.instance.objectNode(); + payload.put("match", "not recent:0"); + + var json = JsonNodeFactory.instance.objectNode(); + json.put("cmd", "close-tab"); + json.set("payload", payload); + json.putArray("version").add(0).add(14).add(2); var jsonString = json.toString(); var echoString = "'\\eP@kitty-cmd" + jsonString + "\\e\\\\'"; diff --git a/app/src/main/java/io/xpipe/app/util/ShellTemp.java b/app/src/main/java/io/xpipe/app/util/ShellTemp.java index 0cf01faa..e2a26ca1 100644 --- a/app/src/main/java/io/xpipe/app/util/ShellTemp.java +++ b/app/src/main/java/io/xpipe/app/util/ShellTemp.java @@ -52,7 +52,7 @@ public class ShellTemp { var temp = proc.getSystemTemporaryDirectory(); base = temp.join("xpipe"); } - return base.join(sub); + return sub != null ? base.join(sub) : base; } public static void checkTempDirectory(ShellControl proc) throws Exception { diff --git a/core/src/main/java/io/xpipe/core/process/CommandBuilder.java b/core/src/main/java/io/xpipe/core/process/CommandBuilder.java index 86898b2c..4da59cb6 100644 --- a/core/src/main/java/io/xpipe/core/process/CommandBuilder.java +++ b/core/src/main/java/io/xpipe/core/process/CommandBuilder.java @@ -187,7 +187,7 @@ public class CommandBuilder { } public CommandBuilder addFile(FilePath s) { - return addFile(shellControl -> shellControl.getShellDialect().fileArgument(s)); + return addFile(s.toString()); } public CommandBuilder addLiteral(String s) {