diff --git a/app/src/main/java/io/xpipe/app/issue/GuiErrorHandler.java b/app/src/main/java/io/xpipe/app/issue/GuiErrorHandler.java index ec8fc6e4..db4f9121 100644 --- a/app/src/main/java/io/xpipe/app/issue/GuiErrorHandler.java +++ b/app/src/main/java/io/xpipe/app/issue/GuiErrorHandler.java @@ -31,6 +31,7 @@ public class GuiErrorHandler extends GuiErrorHandlerBase implements ErrorHandler if (event.getThrowable() instanceof LicenseRequiredException lex) { LicenseProvider.get().showLicenseAlert(lex); + event.setShouldSendDiagnostics(true); } else { ErrorHandlerComp.showAndTryWait(event, true); } diff --git a/app/src/main/java/io/xpipe/app/prefs/ExternalTerminalType.java b/app/src/main/java/io/xpipe/app/prefs/ExternalTerminalType.java index f9e0075e..5bf6f6b9 100644 --- a/app/src/main/java/io/xpipe/app/prefs/ExternalTerminalType.java +++ b/app/src/main/java/io/xpipe/app/prefs/ExternalTerminalType.java @@ -46,6 +46,11 @@ public interface ExternalTerminalType extends PrefsChoiceValue { ExternalTerminalType POWERSHELL_WINDOWS = new SimplePathType("app.powershell", "powershell") { + @Override + public boolean supportsColoredTitle() { + return false; + } + @Override protected CommandBuilder toCommand(String name, String file) { return CommandBuilder.of() @@ -60,6 +65,11 @@ public interface ExternalTerminalType extends PrefsChoiceValue { ExternalTerminalType PWSH_WINDOWS = new SimplePathType("app.pwsh", "pwsh") { + @Override + public boolean supportsColoredTitle() { + return false; + } + @Override protected CommandBuilder toCommand(String name, String file) { // Fix for https://github.com/PowerShell/PowerShell/issues/18530#issuecomment-1325691850 @@ -243,6 +253,11 @@ public interface ExternalTerminalType extends PrefsChoiceValue { ExternalTerminalType KONSOLE = new SimplePathType("app.konsole", "konsole") { + @Override + public boolean supportsColoredTitle() { + return false; + } + @Override protected CommandBuilder toCommand(String name, String file) { // Note for later: When debugging konsole launches, it will always open as a child process of @@ -309,7 +324,7 @@ public interface ExternalTerminalType extends PrefsChoiceValue { @Override protected CommandBuilder toCommand(String name, String file) { - return CommandBuilder.of().add("-T").addQuoted(name).addQuoted(file); + return CommandBuilder.of().add("-1").add("-T").addQuoted(name).addQuoted(file); } @Override @@ -533,6 +548,11 @@ public interface ExternalTerminalType extends PrefsChoiceValue { super("app.custom"); } + @Override + public boolean supportsColoredTitle() { + return false; + } + @Override public void launch(LaunchConfiguration configuration) throws Exception { var custom = AppPrefs.get().customTerminalCommand().getValue(); diff --git a/app/src/main/java/io/xpipe/app/storage/DataStorage.java b/app/src/main/java/io/xpipe/app/storage/DataStorage.java index 98022acb..3ba24c9e 100644 --- a/app/src/main/java/io/xpipe/app/storage/DataStorage.java +++ b/app/src/main/java/io/xpipe/app/storage/DataStorage.java @@ -212,6 +212,10 @@ public abstract class DataStorage { } public DataStoreEntry getRootForEntry(DataStoreEntry entry) { + if (entry == null) { + return null; + } + if (isRootEntry(entry)) { return entry; } diff --git a/app/src/main/java/io/xpipe/app/util/LicenseRequiredException.java b/app/src/main/java/io/xpipe/app/util/LicenseRequiredException.java index cdf77c38..a0f3794b 100644 --- a/app/src/main/java/io/xpipe/app/util/LicenseRequiredException.java +++ b/app/src/main/java/io/xpipe/app/util/LicenseRequiredException.java @@ -12,7 +12,7 @@ public class LicenseRequiredException extends RuntimeException { LicenseType minLicense; public LicenseRequiredException(String featureName, boolean plural, LicenseType minLicense) { - super(featureName + " are only supported with a " + minLicense.name().toLowerCase() + " license"); + super(featureName + (plural ? " are" : " is") + " only supported with a " + minLicense.name().toLowerCase() + " license"); this.featureName = featureName; this.plural = plural; this.minLicense = minLicense; diff --git a/app/src/main/java/io/xpipe/app/util/TerminalHelper.java b/app/src/main/java/io/xpipe/app/util/TerminalHelper.java index bd2e2b31..4e008787 100644 --- a/app/src/main/java/io/xpipe/app/util/TerminalHelper.java +++ b/app/src/main/java/io/xpipe/app/util/TerminalHelper.java @@ -23,7 +23,7 @@ public class TerminalHelper { throw ErrorEvent.unreportable(new IllegalStateException(AppI18n.get("noTerminalSet"))); } - var color = DataStorage.get().getRootForEntry(entry).getColor(); + var color = entry != null ? DataStorage.get().getRootForEntry(entry).getColor() : null; var prefix = entry != null && color != null && type.supportsColoredTitle() ? color.getEmoji() + " " : ""; diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/freebsd-color.svg b/app/src/main/resources/io/xpipe/app/resources/img/os/freebsd-color.svg new file mode 100644 index 00000000..5adb316f --- /dev/null +++ b/app/src/main/resources/io/xpipe/app/resources/img/os/freebsd-color.svg @@ -0,0 +1 @@ +FreeBSD \ No newline at end of file diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/netbsd-color.svg b/app/src/main/resources/io/xpipe/app/resources/img/os/netbsd-color.svg new file mode 100644 index 00000000..21c247f2 --- /dev/null +++ b/app/src/main/resources/io/xpipe/app/resources/img/os/netbsd-color.svg @@ -0,0 +1 @@ +NetBSD \ No newline at end of file diff --git a/app/src/main/resources/io/xpipe/app/resources/img/os/openbsd-color.svg b/app/src/main/resources/io/xpipe/app/resources/img/os/openbsd-color.svg new file mode 100644 index 00000000..01ebf316 --- /dev/null +++ b/app/src/main/resources/io/xpipe/app/resources/img/os/openbsd-color.svg @@ -0,0 +1 @@ +OpenBSD \ No newline at end of file diff --git a/core/src/main/java/io/xpipe/core/process/ShellDialect.java b/core/src/main/java/io/xpipe/core/process/ShellDialect.java index eedd24e7..c147d567 100644 --- a/core/src/main/java/io/xpipe/core/process/ShellDialect.java +++ b/core/src/main/java/io/xpipe/core/process/ShellDialect.java @@ -6,6 +6,7 @@ import io.xpipe.core.charsetter.StreamCharset; import io.xpipe.core.store.FileSystem; import io.xpipe.core.util.SecretValue; +import java.io.IOException; import java.nio.charset.Charset; import java.util.List; import java.util.Map; @@ -25,7 +26,7 @@ public interface ShellDialect { .collect(Collectors.joining(" ")); } - default boolean isSupported() { + default boolean isSelectable() { return true; } @@ -93,6 +94,10 @@ public interface ShellDialect { String prepareScriptContent(String content); + default void exit(ShellControl sc) throws IOException { + sc.writeLine("exit"); + } + default String getExitCommand() { return "exit"; } diff --git a/core/src/main/java/io/xpipe/core/process/ShellDialects.java b/core/src/main/java/io/xpipe/core/process/ShellDialects.java index a5e59331..49930653 100644 --- a/core/src/main/java/io/xpipe/core/process/ShellDialects.java +++ b/core/src/main/java/io/xpipe/core/process/ShellDialects.java @@ -9,6 +9,7 @@ import java.util.ServiceLoader; public class ShellDialects { public static final List ALL = new ArrayList<>(); + public static ShellDialect OPNSENSE; public static ShellDialect POWERSHELL; public static ShellDialect POWERSHELL_CORE; public static ShellDialect CMD; @@ -31,6 +32,7 @@ public class ShellDialects { CMD = byName("cmd"); POWERSHELL = byName("powershell"); POWERSHELL_CORE = byName("pwsh"); + OPNSENSE = byName("opnsense"); FISH = byName("fish"); DASH = byName("dash"); BASH = byName("bash"); diff --git a/dist/changelogs/1.7.0.md b/dist/changelogs/1.7.0.md index d46e4c16..d3643efb 100644 --- a/dist/changelogs/1.7.0.md +++ b/dist/changelogs/1.7.0.md @@ -19,6 +19,7 @@ It also enables a custom display and instant updates of the information displaye ### Other changes +- Add support for bsd-based servers - Fix OPNsense shells timing out - Make window transparency setting a slider - Save configuration data more frequently to avoid any data loss