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 cf1ec243..d4ff6cc5 100644 --- a/app/src/main/java/io/xpipe/app/terminal/ExternalTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/ExternalTerminalType.java @@ -577,7 +577,8 @@ public interface ExternalTerminalType extends PrefsChoiceValue { } @Override - public String additionalInitCommands(ShellControl sc) { + public TerminalInitFunction additionalInitCommands() { + return TerminalInitFunction.of(sc -> { if (sc.getShellDialect() == ShellDialects.ZSH) { return "printf '\\eP$f{\"hook\": \"SourcedRcFileForWarp\", \"value\": { \"shell\": \"zsh\"}}\\x9c'"; } @@ -588,6 +589,7 @@ public interface ExternalTerminalType extends PrefsChoiceValue { return "printf '\\eP$f{\"hook\": \"SourcedRcFileForWarp\", \"value\": { \"shell\": \"fish\"}}\\x9c'"; } return null; + }); } }; ExternalTerminalType CUSTOM = new CustomTerminalType(); @@ -670,8 +672,8 @@ public interface ExternalTerminalType extends PrefsChoiceValue { .orElse(null); } - default String additionalInitCommands(ShellControl sc) { - return null; + default TerminalInitFunction additionalInitCommands() { + return TerminalInitFunction.none(); } boolean supportsTabs(); diff --git a/app/src/main/java/io/xpipe/app/util/TerminalLauncher.java b/app/src/main/java/io/xpipe/app/util/TerminalLauncher.java index ef0ec776..47ea33bf 100644 --- a/app/src/main/java/io/xpipe/app/util/TerminalLauncher.java +++ b/app/src/main/java/io/xpipe/app/util/TerminalLauncher.java @@ -32,7 +32,7 @@ public class TerminalLauncher { title, type.shouldClear() && AppPrefs.get().clearTerminalOnInit().get(), - type.additionalInitCommands(sc))); + null)); var config = new ExternalTerminalType.LaunchConfiguration(null, title, title, script, sc.getShellDialect()); type.launch(config); } @@ -55,7 +55,7 @@ public class TerminalLauncher { var terminalConfig = new TerminalInitScriptConfig( adjustedTitle, type.shouldClear() && AppPrefs.get().clearTerminalOnInit().get(), - cc instanceof ShellControl sc ? type.additionalInitCommands(sc) : null); + cc instanceof ShellControl sc ? type.additionalInitCommands() : TerminalInitFunction.none()); var request = UUID.randomUUID(); var d = ProcessControlProvider.get().getEffectiveLocalDialect(); diff --git a/core/src/main/java/io/xpipe/core/process/ShellControl.java b/core/src/main/java/io/xpipe/core/process/ShellControl.java index 3515386e..72b702fa 100644 --- a/core/src/main/java/io/xpipe/core/process/ShellControl.java +++ b/core/src/main/java/io/xpipe/core/process/ShellControl.java @@ -94,7 +94,7 @@ public interface ShellControl extends ProcessControl { ShellControl withErrorFormatter(Function formatter); String prepareIntermediateTerminalOpen( - String content, TerminalInitScriptConfig config, WorkingDirectoryFunction workingDirectory) + TerminalInitFunction content, TerminalInitScriptConfig config, WorkingDirectoryFunction workingDirectory) throws Exception; FilePath getSystemTemporaryDirectory(); diff --git a/core/src/main/java/io/xpipe/core/process/TerminalInitFunction.java b/core/src/main/java/io/xpipe/core/process/TerminalInitFunction.java new file mode 100644 index 00000000..01afa6d5 --- /dev/null +++ b/core/src/main/java/io/xpipe/core/process/TerminalInitFunction.java @@ -0,0 +1,69 @@ +package io.xpipe.core.process; + +import io.xpipe.core.util.FailableFunction; + +public interface TerminalInitFunction { + + static TerminalInitFunction of(FailableFunction f) { + return new TerminalInitFunction() { + @Override + public boolean isFixed() { + return false; + } + + @Override + public boolean isSpecified() { + return true; + } + + @Override + public String apply(ShellControl shellControl) throws Exception { + return f.apply(shellControl); + } + }; + } + + static TerminalInitFunction fixed(String s) { + return new TerminalInitFunction() { + @Override + public boolean isFixed() { + return true; + } + + @Override + public boolean isSpecified() { + return true; + } + + @Override + public String apply(ShellControl shellControl) { + return s; + } + }; + } + + static TerminalInitFunction none() { + return new TerminalInitFunction() { + @Override + public boolean isFixed() { + return true; + } + + @Override + public boolean isSpecified() { + return false; + } + + @Override + public String apply(ShellControl shellControl) { + return null; + } + }; + } + + boolean isFixed(); + + boolean isSpecified(); + + String apply(ShellControl shellControl) throws Exception; +} diff --git a/core/src/main/java/io/xpipe/core/process/TerminalInitScriptConfig.java b/core/src/main/java/io/xpipe/core/process/TerminalInitScriptConfig.java index 2c20987e..5e2fe983 100644 --- a/core/src/main/java/io/xpipe/core/process/TerminalInitScriptConfig.java +++ b/core/src/main/java/io/xpipe/core/process/TerminalInitScriptConfig.java @@ -7,7 +7,7 @@ public class TerminalInitScriptConfig { String displayName; boolean clearScreen; - String terminalSpecificCommands; + TerminalInitFunction terminalSpecificCommands; public static TerminalInitScriptConfig ofName(String name) { return new TerminalInitScriptConfig(name, true, null);