From e46b1504bd3763ea93b83c0e4fa769e79e3d60b5 Mon Sep 17 00:00:00 2001 From: crschnick Date: Wed, 26 Nov 2025 10:56:35 +0000 Subject: [PATCH] Rework --- .../app/prefs/ExternalApplicationType.java | 2 +- .../xpipe/app/prefs/ExternalEditorType.java | 4 +- .../java/io/xpipe/app/process/ShellTemp.java | 5 +- .../java/io/xpipe/app/rdp/FreeRdpClient.java | 2 +- .../xpipe/app/terminal/KittyTerminalType.java | 2 - .../xpipe/app/terminal/WezTerminalType.java | 50 +++++++++++++++++-- .../java/io/xpipe/app/util/FlatpakCache.java | 2 +- 7 files changed, 53 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java b/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java index 600a9e054..51e06975e 100644 --- a/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java +++ b/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java @@ -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 { diff --git a/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java b/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java index a88b3ae0f..d0b32bd96 100644 --- a/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java +++ b/app/src/main/java/io/xpipe/app/prefs/ExternalEditorType.java @@ -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); } } diff --git a/app/src/main/java/io/xpipe/app/process/ShellTemp.java b/app/src/main/java/io/xpipe/app/process/ShellTemp.java index 3330bc08e..cf75c0967 100644 --- a/app/src/main/java/io/xpipe/app/process/ShellTemp.java +++ b/app/src/main/java/io/xpipe/app/process/ShellTemp.java @@ -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(); diff --git a/app/src/main/java/io/xpipe/app/rdp/FreeRdpClient.java b/app/src/main/java/io/xpipe/app/rdp/FreeRdpClient.java index 3d0e70884..04dd0b408 100644 --- a/app/src/main/java/io/xpipe/app/rdp/FreeRdpClient.java +++ b/app/src/main/java/io/xpipe/app/rdp/FreeRdpClient.java @@ -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"); 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 6feb0608f..2e8e9efa8 100644 --- a/app/src/main/java/io/xpipe/app/terminal/KittyTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/KittyTerminalType.java @@ -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; } diff --git a/app/src/main/java/io/xpipe/app/terminal/WezTerminalType.java b/app/src/main/java/io/xpipe/app/terminal/WezTerminalType.java index 8cfe669ec..c9bef01ba 100644 --- a/app/src/main/java/io/xpipe/app/terminal/WezTerminalType.java +++ b/app/src/main/java/io/xpipe/app/terminal/WezTerminalType.java @@ -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; diff --git a/app/src/main/java/io/xpipe/app/util/FlatpakCache.java b/app/src/main/java/io/xpipe/app/util/FlatpakCache.java index a77fd8d62..91b55f454 100644 --- a/app/src/main/java/io/xpipe/app/util/FlatpakCache.java +++ b/app/src/main/java/io/xpipe/app/util/FlatpakCache.java @@ -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())