This commit is contained in:
crschnick
2025-11-26 10:56:35 +00:00
parent b6a23c30da
commit e46b1504bd
7 changed files with 53 additions and 14 deletions
@@ -139,7 +139,7 @@ public interface ExternalApplicationType extends PrefsValue {
+ " not installed. Install it and refresh the environment by restarting XPipe"));
}
args.add(0, FlatpakCache.runCommand(getFlatpakId()));
args.add(0, FlatpakCache.getRunCommand(getFlatpakId()));
if (detach()) {
ExternalApplicationHelper.startAsync(args);
} else {
@@ -436,7 +436,7 @@ public interface ExternalEditorType extends PrefsChoiceValue {
public void launch(Path file) throws Exception {
var exec = CommandSupport.isInLocalPath(getExecutable())
? CommandBuilder.of().addFile(getExecutable())
: FlatpakCache.runCommand(getFlatpakId());
: FlatpakCache.getRunCommand(getFlatpakId());
if (FlatpakCache.getApp(getFlatpakId()).isEmpty()) {
CommandSupport.isInPathOrThrow(LocalShell.getShell(), getExecutable());
@@ -807,7 +807,7 @@ public interface ExternalEditorType extends PrefsChoiceValue {
CommandSupport.isInPathOrThrow(LocalShell.getShell(), getExecutable());
}
var builder = FlatpakCache.runCommand(getFlatpakId()).addFile(file.toString());
var builder = FlatpakCache.getRunCommand(getFlatpakId()).addFile(file.toString());
ExternalApplicationHelper.startAsync(builder);
}
}
@@ -42,13 +42,12 @@ public class ShellTemp {
if (proc.getOsType() != OsType.WINDOWS && proc.getOsType() != OsType.MACOS) {
var temp = proc.getSystemTemporaryDirectory();
base = temp.join("xpipe");
proc.command(proc.getShellDialect().getMkdirsCommand(base.toString()))
.execute();
proc.view().mkdir(base);
// We have to make sure that also other users can create files here
// This command should work in all shells
proc.command("chmod 777 " + proc.getShellDialect().fileArgument(base))
.executeAndCheck();
var user = proc.getShellDialect().printUsernameCommand(proc).readStdoutOrThrow();
var user = proc.view().user();
base = base.join(user);
} else {
var temp = proc.getSystemTemporaryDirectory();
@@ -26,7 +26,7 @@ public class FreeRdpClient implements ExternalRdpClient {
if (!v2 && OsType.ofLocal() == OsType.LINUX) {
var flatpak = FlatpakCache.getApp("com.freerdp.FreeRDP");
if (flatpak.isPresent()) {
exec = FlatpakCache.runCommand("com.freerdp.FreeRDP");
exec = FlatpakCache.getRunCommand("com.freerdp.FreeRDP");
v3 = true;
} else {
CommandSupport.isInPathOrThrow(LocalShell.getShell(), "xfreerdp");
@@ -34,7 +34,6 @@ public interface KittyTerminalType extends ExternalTerminalType, TrackableTermin
private static FilePath getSocket() throws Exception {
try (var sc = LocalShell.getShell().start()) {
var temp = ShellTemp.createUserSpecificTempDataDirectory(sc, null);
sc.executeSimpleCommand(sc.getShellDialect().getMkdirsCommand(temp.toString()));
return temp.join(AppNames.ofCurrent().getSnakeName() + "_kitty");
}
}
@@ -134,7 +133,6 @@ public interface KittyTerminalType extends ExternalTerminalType, TrackableTermin
@Override
default boolean isRecommended() {
// There are some race conditions with the socket, although that should be fixed to some degree
return true;
}
@@ -1,12 +1,14 @@
package io.xpipe.app.terminal;
import io.xpipe.app.issue.ErrorEventFactory;
import io.xpipe.app.prefs.AppPrefs;
import io.xpipe.app.prefs.ExternalApplicationHelper;
import io.xpipe.app.prefs.ExternalApplicationType;
import io.xpipe.app.process.CommandBuilder;
import io.xpipe.app.process.CommandSupport;
import io.xpipe.app.process.LocalShell;
import io.xpipe.app.util.FlatpakCache;
import io.xpipe.app.util.ThreadHelper;
import io.xpipe.app.util.WindowsRegistry;
import io.xpipe.core.OsType;
@@ -95,6 +97,11 @@ public interface WezTerminalType extends ExternalTerminalType, TrackableTerminal
class Linux implements ExternalApplicationType, WezTerminalType {
@Override
public boolean supportsSplitView() {
return true;
}
@Override
public TerminalOpenFormat getOpenFormat() {
return TerminalOpenFormat.NEW_WINDOW_OR_TABBED;
@@ -110,7 +117,7 @@ public interface WezTerminalType extends ExternalTerminalType, TrackableTerminal
base = CommandBuilder.of().addFile("wezterm");
} else {
if (flatpak.isPresent()) {
base = FlatpakCache.runCommand("org.wezfurlong.wezterm");
base = FlatpakCache.getRunCommand("org.wezfurlong.wezterm");
} else {
base = CommandBuilder.of().addFile("wezterm");
}
@@ -120,23 +127,53 @@ public interface WezTerminalType extends ExternalTerminalType, TrackableTerminal
.command(CommandBuilder.of()
.add(base)
.add("cli", "spawn")
.addFile(configuration.single().getScriptFile()))
.addFile(configuration.getPanes().getFirst().getScriptFile()))
.executeAndCheck();
}
if (runGui) {
var start = System.currentTimeMillis();
CommandBuilder base;
if (CommandSupport.isInLocalPath("wezterm-gui")) {
base = CommandBuilder.of().addFile("wezterm-gui");
} else {
if (flatpak.isPresent()) {
base = FlatpakCache.runCommand("org.wezfurlong.wezterm");
base = FlatpakCache.getRunCommand("org.wezfurlong.wezterm");
} else {
base = CommandBuilder.of().addFile("wezterm-gui");
}
}
ExternalApplicationHelper.startAsync(
CommandBuilder.of().add(base).add("start").addFile(configuration.single().getScriptFile()));
CommandBuilder.of().add(base).add("start").addFile(configuration.getPanes().getFirst().getScriptFile()));
var elapsed = System.currentTimeMillis() - start;
// Is there a better way?
ThreadHelper.sleep(elapsed * 10);
}
if (configuration.getPanes().size() > 1) {
CommandBuilder base;
if (CommandSupport.isInLocalPath("wezterm")) {
base = CommandBuilder.of().addFile("wezterm");
} else {
if (flatpak.isPresent()) {
base = FlatpakCache.getRunCommand("org.wezfurlong.wezterm");
} else {
base = CommandBuilder.of().addFile("wezterm");
}
}
var direction = AppPrefs.get().terminalSplitStrategy().getValue();
for (int i = 1; i < configuration.getPanes().size(); i++) {
LocalShell.getShell()
.command(CommandBuilder.of()
.add(base)
.add("cli", "split-pane")
.addIf(direction == TerminalSplitStrategy.HORIZONTAL, "--horizontal")
.addIf(direction == TerminalSplitStrategy.VERTICAL, "--verical")
.addFile(configuration.getPanes().getFirst().getScriptFile()))
.executeAndCheck();
}
}
}
@@ -157,6 +194,11 @@ public interface WezTerminalType extends ExternalTerminalType, TrackableTerminal
class MacOs implements ExternalApplicationType.MacApplication, WezTerminalType {
@Override
public boolean supportsSplitView() {
return true;
}
@Override
public TerminalOpenFormat getOpenFormat() {
return TerminalOpenFormat.NEW_WINDOW_OR_TABBED;
@@ -44,7 +44,7 @@ public class FlatpakCache {
return Optional.ofNullable(app);
}
public static CommandBuilder runCommand(String id) {
public static CommandBuilder getRunCommand(String id) {
return CommandBuilder.of()
.add("flatpak", "run")
.add("--filesystem=" + AppSystemInfo.ofLinux().getTemp())