This commit is contained in:
crschnick
2026-04-29 07:28:47 +00:00
parent eda4ad6ccb
commit 4bf1ede5a8
11 changed files with 54 additions and 16 deletions
@@ -15,6 +15,7 @@ import javafx.scene.image.ImageView;
import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
import java.lang.ref.WeakReference;
import java.util.function.Consumer;
public class PrettyImageComp extends SimpleRegionBuilder {
@@ -113,8 +114,12 @@ public class PrettyImageComp extends SimpleRegionBuilder {
value.subscribe(update);
if (AppPrefs.get() != null) {
var ref = new WeakReference<>(update);
AppPrefs.get().theme().addListener((observable, oldValue, newValue) -> {
update.accept(value.getValue());
var v = ref.get();
if (v != null) {
v.accept(value.getValue());
}
});
}
@@ -58,13 +58,18 @@ public class SideMenuBarComp extends RegionBuilder<VBox> {
value.setValue(e);
}
});
b.describe(d -> d.name(e.name()));
var stack = createStyle(e, b);
var shortcut = e.combination();
if (shortcut != null) {
stack.apply(struc -> struc.getProperties().put("shortcut", shortcut));
}
b.describe(d -> {
d.name(e.name());
if (shortcut != null) {
d.shortcut(shortcut);
}
});
vbox.getChildren().add(stack.build());
}
@@ -118,7 +118,7 @@ public class AppMainWindow {
AppWindowStyle.addStylesheets(stage.getScene());
AppWindowStyle.addClickShield(stage);
AppWindowStyle.addMaximizedPseudoClass(stage);
AppWindowStyle.addFontSize(stage);
AppWindowStyle.addFontSize(scene);
AppTheme.initThemeHandlers(stage);
AppWindowTitle.getTitle().subscribe(s -> {
@@ -39,7 +39,7 @@ public class AppSideWindow {
event.consume();
});
AppWindowBounds.fixInvalidStagePosition(s);
AppWindowStyle.addFontSize(s);
AppWindowStyle.addFontSize(s.getScene());
a.getDialogPane().getScene().addEventHandler(KeyEvent.KEY_PRESSED, event -> {
if (new KeyCodeCombination(KeyCode.W, KeyCombination.SHORTCUT_DOWN).match(event)) {
s.close();
@@ -27,8 +27,8 @@ public class AppWindowStyle {
});
}
public static void addFontSize(Stage stage) {
stage.getScene().rootProperty().subscribe(root -> {
public static void addFontSize(Scene scene) {
scene.rootProperty().subscribe(root -> {
AppFontSizes.base(root);
});
}
@@ -47,7 +47,8 @@ public abstract class ProcessControlProvider {
public abstract ShellStore subShellEnvironment(DataStoreEntryRef<ShellStore> s, ShellDialect dialect);
public abstract RemoteDesktopDockContentEntry createVncSession(
DataStoreEntryRef<VncBaseStore> ref
DataStoreEntryRef<VncBaseStore> ref,
Runnable onKill
);
public abstract DataStoreEntryRef<ShellStore> elevated(DataStoreEntryRef<ShellStore> e);
@@ -23,15 +23,21 @@ import javafx.stage.Window;
public class AskpassAlert {
public static SecretQueryResult queryRaw(String prompt, InPlaceSecretValue secretValue, boolean stealFocus) {
prompt = prompt.strip();
if (prompt.endsWith(":") || prompt.endsWith("?")) {
prompt = prompt.substring(0, prompt.length() - 1);
}
var prop = new SimpleObjectProperty<>(secretValue);
var finalPrompt = prompt;
var r = AppSideWindow.showBlockingAlert(alert -> {
alert.initModality(Modality.NONE);
alert.setTitle(AppI18n.get("askpassAlertTitle"));
alert.setHeaderText(prompt);
alert.setHeaderText(finalPrompt);
alert.setAlertType(Alert.AlertType.CONFIRMATION);
// Link to help page for double prompt
if (SecretManager.disableCachingForPrompt(prompt)) {
if (SecretManager.disableCachingForPrompt(finalPrompt)) {
var type = new ButtonType("Help", ButtonBar.ButtonData.HELP);
alert.getButtonTypes().add(type);
var button = alert.getDialogPane().lookupButton(type);
@@ -81,15 +81,20 @@ public class RemoteDesktopDockComp extends SimpleRegionBuilder {
private void fillToolbar(Region content, ToolBar bar, List<? extends RemoteDesktopDockEntry> list) {
var w = RemoteDesktopWindow.get();
bar.getItems().forEach(node -> node.getProperties().clear());
bar.getItems().clear();
for (var entry : list) {
var entryRef = new WeakReference<>(entry);
var graphic = PrettyImageHelper.ofFixedSizeSquare(entry.getIcon(), 16).style("graphic").build();
var label = new LabelComp(entry.getName()).build();
label.setGraphic(graphic);
var close = new IconButtonComp("mdi2c-close", () -> {
w.close(entry);
var v = entryRef.get();
if (v != null) {
w.close(v);
}
}).style("close-button")
.describe(d -> d.nameKey("close")).build();
AppFontSizes.sm(close);
@@ -108,7 +113,10 @@ public class RemoteDesktopDockComp extends SimpleRegionBuilder {
b.getStyleClass().add("tab-button");
b.getProperties().put("entry", entry);
b.setOnAction(event -> {
w.select(entry);
var v = entryRef.get();
if (v != null) {
w.select(v);
}
event.consume();
});
bar.getItems().add(b);
@@ -6,6 +6,10 @@ import lombok.Getter;
@Getter
public abstract class RemoteDesktopDockContentEntry {
private final Runnable onKill;
protected RemoteDesktopDockContentEntry(Runnable onKill) {this.onKill = onKill;}
public abstract BaseRegionBuilder<?, ?> comp();
public abstract void init() throws Exception;
@@ -115,7 +115,8 @@ public class RemoteDesktopWindow {
AppWindowStyle.addStylesheets(stage.getScene());
AppWindowStyle.addClickShield(stage);
AppWindowStyle.addMaximizedPseudoClass(stage);
AppWindowStyle.addFontSize(stage);
AppWindowStyle.addFontSize(scene);
AppWindowStyle.addNavigationPseudoClasses(scene);
AppTheme.initThemeHandlers(stage);
setupWindowListeners();
@@ -179,9 +180,10 @@ public class RemoteDesktopWindow {
model.closeWindow(entry);
}
public void trackInternal(String name, String icon, DataStoreColor color, DataStoreEntry e, RemoteDesktopDockContentEntry entry) {
public RemoteDesktopDockEntry trackInternal(String name, String icon, DataStoreColor color, DataStoreEntry e, RemoteDesktopDockContentEntry entry) {
var toTrack = new RemoteDesktopDockEntry(name, icon, color, e, null, entry, null, null);
model.track(toTrack);
return toTrack;
}
public void trackExternal(String name, String icon, DataStoreColor color, DataStoreEntry e, int w, int h, Process process, Duration maxWait, Predicate<ControllableWindowProcess> filter) {
@@ -8,11 +8,14 @@ import io.xpipe.app.storage.DataStorage;
import io.xpipe.app.util.DocumentationLink;
import com.fasterxml.jackson.annotation.JsonTypeName;
import io.xpipe.app.util.RemoteDesktopDockEntry;
import io.xpipe.app.util.RemoteDesktopWindow;
import javafx.beans.property.ReadOnlyBooleanWrapper;
import lombok.Builder;
import lombok.extern.jackson.Jacksonized;
import java.util.concurrent.atomic.AtomicReference;
@Builder
@Jacksonized
@JsonTypeName("integratedXPipeVncClient")
@@ -22,12 +25,16 @@ public class InternalVncClient implements ExternalVncClient {
public void launch(VncLaunchConfig configuration) throws Exception {
var w = RemoteDesktopWindow.get();
w.show();
var session = ProcessControlProvider.get().createVncSession(configuration.getEntry());
w.trackInternal(DataStorage.get().getStoreEntryDisplayName(configuration.getEntry().get()),
var ref = new AtomicReference<RemoteDesktopDockEntry>();
var session = ProcessControlProvider.get().createVncSession(configuration.getEntry(), () -> {
w.close(ref.get());
});
ref.set(w.trackInternal(
DataStorage.get().getStoreEntryDisplayName(configuration.getEntry().get()),
configuration.getEntry().get().getEffectiveIconFile(),
DataStorage.get().getEffectiveColor(configuration.getEntry().get()),
configuration.getEntry().get(),
session);
session));
}
@Override