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 @@
+
\ 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 @@
+
\ 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 @@
+
\ 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