From 3ebaf17c0d376d8b2a5279a2eff150282e4c3585 Mon Sep 17 00:00:00 2001 From: crschnick Date: Mon, 1 Apr 2024 08:06:14 +0000 Subject: [PATCH] Rework kitty macos support --- .../app/terminal/ExternalTerminalType.java | 43 +--------- .../xpipe/app/terminal/KittyTerminalType.java | 82 ++++++++++++++----- 2 files changed, 61 insertions(+), 64 deletions(-) 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 df111b0a5..46cf87421 100644 --- a/app/src/main/java/io/xpipe/app/terminal/ExternalTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/ExternalTerminalType.java @@ -584,47 +584,6 @@ public interface ExternalTerminalType extends PrefsChoiceValue { ExternalApplicationHelper.startAsync(c); } }; - ExternalTerminalType KITTY_MACOS = new MacOsType("app.kitty", "kitty") { - - @Override - public boolean supportsTabs() { - return false; - } - - @Override - public boolean supportsColoredTitle() { - return false; - } - - @Override - public void launch(LaunchConfiguration configuration) throws Exception { - if (!MacOsPermissions.waitForAccessibilityPermissions()) { - return; - } - - try (ShellControl pc = LocalShell.getShell()) { - pc.osascriptCommand(String.format( - """ - if application "Kitty" is running then - tell application "Kitty" to activate - tell application "System Events" to tell process "Kitty" to keystroke "t" using command down - else - tell application "Kitty" to activate - end if - delay 1 - tell application "System Events" - tell process "Kitty" - keystroke "%s" - delay 0.01 - key code 36 - end tell - end tell - """, - configuration.getScriptFile().toString().replaceAll("\"", "\\\\\""))) - .execute(); - } - } - }; ExternalTerminalType CUSTOM = new CustomType(); List WINDOWS_TERMINALS = List.of( TABBY_WINDOWS, @@ -653,7 +612,7 @@ public interface ExternalTerminalType extends PrefsChoiceValue { DEEPIN_TERMINAL, Q_TERMINAL); List MACOS_TERMINALS = - List.of(ITERM2, TABBY_MAC_OS, ALACRITTY_MACOS, KITTY_MACOS, WARP, WEZ_MACOS, MACOS_TERMINAL); + List.of(ITERM2, TABBY_MAC_OS, ALACRITTY_MACOS, KittyTerminalType.KITTY_MACOS, WARP, WEZ_MACOS, MACOS_TERMINAL); @SuppressWarnings("TrivialFunctionalExpressionUsage") List ALL = ((Supplier>) () -> { 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 10e2d80ff..942effeb3 100644 --- a/app/src/main/java/io/xpipe/app/terminal/KittyTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/KittyTerminalType.java @@ -25,10 +25,64 @@ public class KittyTerminalType { @Override public void launch(LaunchConfiguration configuration) throws Exception { + try (var sc = LocalShell.getShell().start()) { + CommandSupport.isInPathOrThrow(sc, "kitty", "Kitty", null); + CommandSupport.isInPathOrThrow(sc, "socat", "socat", null); + } + var toClose = prepare(); - open(configuration); + var socketWrite = CommandBuilder.of().add("socat", "-"); + open(configuration, socketWrite); if (toClose) { - closeInitial(); + closeInitial(socketWrite); + } + } + + private boolean prepare() throws Exception { + var socket = getSocket(); + try (var sc = LocalShell.getShell().start()) { + 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; + } + } + }; + + public static final ExternalTerminalType KITTY_MACOS = new ExternalTerminalType.MacOsType("app.kitty", "kitty") { + + @Override + public boolean supportsTabs() { + return true; + } + + @Override + public void launch(LaunchConfiguration configuration) throws Exception { + try (var sc = LocalShell.getShell().start()) { + CommandSupport.isInPathOrThrow(sc, "nc", "Netcat", null); + } + + var toClose = prepare(); + var socketWrite = CommandBuilder.of().add("nc", "-U"); + open(configuration, socketWrite); + if (toClose) { + closeInitial(socketWrite); + } + } + + private boolean prepare() throws Exception { + var socket = getSocket(); + try (var sc = LocalShell.getShell().start()) { + if (sc.executeSimpleBooleanCommand("test -w " + sc.getShellDialect().fileArgument(socket))) { + return false; + } + + sc.executeSimpleCommand(CommandBuilder.of().add("open", "-a", "kitty.app", "--args").add("-o", "allow_remote_control=socket-only", "--listen-on", "unix:" + getSocket())); + ThreadHelper.sleep(1000); + return true; } } }; @@ -41,23 +95,7 @@ public class KittyTerminalType { } } - private static boolean prepare() throws Exception { - var socket = getSocket(); - try (var sc = LocalShell.getShell().start()) { - CommandSupport.isInPathOrThrow(sc, "kitty", "Kitty", null); - CommandSupport.isInPathOrThrow(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 { + private static void open(ExternalTerminalType.LaunchConfiguration configuration, CommandBuilder socketWrite) throws Exception { try (var sc = LocalShell.getShell().start()) { var payload = JsonNodeFactory.instance.objectNode(); var args = configuration.getDialectLaunchCommand().buildBaseParts(sc); @@ -75,11 +113,11 @@ public class KittyTerminalType { var jsonString = json.toString(); var echoString = "'\\eP@kitty-cmd" + jsonString + "\\e\\\\'"; - sc.executeSimpleCommand(CommandBuilder.of().add("echo", "-en", echoString, "|", "socat", "-").addFile(getSocket())); + sc.executeSimpleCommand(CommandBuilder.of().add("echo", "-en", echoString, "|").add(socketWrite).addFile(getSocket())); } } - private static void closeInitial() throws Exception { + private static void closeInitial( CommandBuilder socketWrite) throws Exception { try (var sc = LocalShell.getShell().start()) { var payload = JsonNodeFactory.instance.objectNode(); payload.put("match", "not recent:0"); @@ -91,7 +129,7 @@ public class KittyTerminalType { var jsonString = json.toString(); var echoString = "'\\eP@kitty-cmd" + jsonString + "\\e\\\\'"; - sc.executeSimpleCommand(CommandBuilder.of().add("echo", "-en", echoString, "|", "socat", "-").addFile(getSocket())); + sc.executeSimpleCommand(CommandBuilder.of().add("echo", "-en", echoString, "|").add(socketWrite).addFile(getSocket())); } } }