From a481ffd42d6144490bd1062c4e8fc74a32154aa3 Mon Sep 17 00:00:00 2001 From: crschnick Date: Wed, 4 Jun 2025 15:26:56 +0000 Subject: [PATCH] Rework --- .../app/prefs/ExternalApplicationType.java | 8 +++- .../java/io/xpipe/app/vnc/RealVncClient.java | 4 +- .../xpipe/app/vnc/ScreenSharingVncClient.java | 42 +++++++++++++++++++ .../java/io/xpipe/app/vnc/TigerVncClient.java | 23 ++++++++-- 4 files changed, 69 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/io/xpipe/app/vnc/ScreenSharingVncClient.java 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 b31a00efe..c2fed27af 100644 --- a/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java +++ b/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java @@ -7,6 +7,7 @@ import io.xpipe.app.util.CommandSupport; import io.xpipe.app.util.LocalShell; import io.xpipe.app.util.Translatable; import io.xpipe.core.process.CommandBuilder; +import io.xpipe.core.process.CommandControl; import io.xpipe.core.process.OsType; import io.xpipe.core.process.ShellControl; @@ -21,10 +22,13 @@ public interface ExternalApplicationType extends PrefsValue { public interface MacApplication extends ExternalApplicationType { - default void launch(CommandBuilder builder) throws Exception { + default CommandControl launchCommand(CommandBuilder builder, boolean args) throws Exception { + if (args) { + builder.add(0, "--args"); + } builder.addQuoted(getApplicationName()); builder.add(0, "open", "-a"); - LocalShell.getShell().executeSimpleCommand(builder); + return LocalShell.getShell().command(builder); } @Override diff --git a/app/src/main/java/io/xpipe/app/vnc/RealVncClient.java b/app/src/main/java/io/xpipe/app/vnc/RealVncClient.java index d98edee51..ef3319a23 100644 --- a/app/src/main/java/io/xpipe/app/vnc/RealVncClient.java +++ b/app/src/main/java/io/xpipe/app/vnc/RealVncClient.java @@ -95,12 +95,12 @@ public abstract class RealVncClient implements ExternalVncClient { @Override public void launch(VncLaunchConfig configuration) throws Exception { var builder = createBuilder(configuration); - launch(builder); + launchCommand(builder, true).execute(); } @Override public String getApplicationName() { - return "RealVNC.app"; + return "VNC Viewer"; } } } diff --git a/app/src/main/java/io/xpipe/app/vnc/ScreenSharingVncClient.java b/app/src/main/java/io/xpipe/app/vnc/ScreenSharingVncClient.java new file mode 100644 index 000000000..932bfb467 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/vnc/ScreenSharingVncClient.java @@ -0,0 +1,42 @@ +package io.xpipe.app.vnc; + +import com.fasterxml.jackson.annotation.JsonTypeName; +import io.xpipe.app.prefs.ExternalApplicationType; +import io.xpipe.app.util.LocalShell; +import io.xpipe.core.process.CommandBuilder; +import io.xpipe.core.util.SecretValue; +import lombok.Builder; +import lombok.extern.jackson.Jacksonized; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Optional; + +@Builder +@Jacksonized +@JsonTypeName("screenSharing") +public class ScreenSharingVncClient implements ExternalApplicationType.MacApplication, ExternalVncClient { + + @Override + public boolean supportsPasswords() { + return true; + } + + @Override + public void launch(VncLaunchConfig configuration) throws Exception { + var pw = configuration.retrievePassword(); + var credentials = (configuration.retrieveUsername().orElse("") + pw.map(secretValue -> ":" + secretValue.getSecretValue()).orElse("")); + var address = configuration.getHost() + ":" + configuration.getPort(); + var args = "vnc://" + credentials + "@" + address; + var command = launchCommand(CommandBuilder.of().add(args), false); + if (pw.isPresent()) { + command.sensitive(); + } + command.execute(); + } + + @Override + public String getApplicationName() { + return "Screen Sharing"; + } +} diff --git a/app/src/main/java/io/xpipe/app/vnc/TigerVncClient.java b/app/src/main/java/io/xpipe/app/vnc/TigerVncClient.java index c65bccef5..9db4d6d6e 100644 --- a/app/src/main/java/io/xpipe/app/vnc/TigerVncClient.java +++ b/app/src/main/java/io/xpipe/app/vnc/TigerVncClient.java @@ -8,6 +8,7 @@ import io.xpipe.core.process.CommandBuilder; import lombok.Builder; import lombok.extern.jackson.Jacksonized; +import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.Optional; @@ -104,12 +105,15 @@ public abstract class TigerVncClient implements ExternalVncClient { @Builder @Jacksonized @JsonTypeName("tigerVnc") - public static class MacOs extends TigerVncClient implements ExternalApplicationType.MacApplication { + public static class MacOs extends TigerVncClient implements ExternalApplicationType.InstallLocationType { @Override public void launch(VncLaunchConfig configuration) throws Exception { + var loc = findExecutable(); var builder = createBuilder(configuration); - launch(builder); + var open = CommandBuilder.of().add("open", "-a").addFile(loc).add("--args"); + builder.add(0, open); + LocalShell.getShell().command(builder).execute(); } @Override @@ -118,8 +122,19 @@ public abstract class TigerVncClient implements ExternalVncClient { } @Override - public String getApplicationName() { - return "TigerVNC.app"; + public String getExecutable() { + return "VNCViewer"; + } + + @Override + public Optional determineInstallation() { + try (var appsStream = Files.list(Path.of("/Applications"))) { + var dirs = appsStream.toList(); + return dirs.stream().filter(path -> path.toString().startsWith("TigerVNC")).findFirst(); + } catch (IOException e) { + ErrorEvent.fromThrowable(e).handle(); + return Optional.empty(); + } } } }