Skip to content

Commit 4769cde

Browse files
committed
Wayland restore token
1 parent 6623852 commit 4769cde

File tree

2 files changed

+38
-22
lines changed

2 files changed

+38
-22
lines changed

src/main/java/org/dpsoftware/config/Configuration.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,8 @@ public class Configuration implements Cloneable {
148148
private String algo = Enums.Algo.AVG_COLOR.getBaseI18n();
149149
// Color correction, Hue-Saturation (using HSV 360° wheel)
150150
private Map<Enums.ColorEnum, HSLColor> hueMap;
151+
// DBUS ScreenCast Restore Token (XDG Portal)
152+
private String screenCastRestoreToken;
151153
// LED Matrix Map
152154
private Map<String, LinkedHashMap<Integer, LEDCoordinate>> ledMatrix;
153155

src/main/java/org/dpsoftware/managers/PipelineManager.java

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,9 @@
5353
import org.freedesktop.dbus.types.Variant;
5454

5555
import java.awt.*;
56-
import java.util.Collections;
56+
import java.io.IOException;
5757
import java.util.List;
58-
import java.util.Map;
59-
import java.util.UUID;
58+
import java.util.*;
6059
import java.util.concurrent.CompletableFuture;
6160
import java.util.concurrent.Executors;
6261
import java.util.concurrent.ScheduledExecutorService;
@@ -73,13 +72,15 @@ public class PipelineManager {
7372
private ScheduledExecutorService scheduledExecutorService;
7473

7574

76-
record XdgStreamDetails(Integer streamId, FileDescriptor fileDescriptor) {}
75+
record XdgStreamDetails(Integer streamId, FileDescriptor fileDescriptor) {
76+
}
77+
7778
/**
7879
* Uses D-BUS to get the XDG ScreenCast stream ID & pipewire filedescriptor
7980
*
80-
* @throws RuntimeException on any concurrency or D-BUS issues
8181
* @return XDG ScreenCast stream details containing the ID from org.freedesktop.portal.ScreenCast:Start and
8282
* FileDescriptor from org.freedesktop.portal.ScreenCast:OpenPipeWireRemote
83+
* @throws RuntimeException on any concurrency or D-BUS issues
8384
*/
8485
@SneakyThrows
8586
@SuppressWarnings("all")
@@ -96,38 +97,51 @@ public static XdgStreamDetails getXdgStreamDetails() {
9697
dBusConnection.addGenericSigHandler(matchRule, signal -> {
9798
try {
9899
if (signal.getParameters().length == 2 // verify amount of arguments
99-
&& signal.getParameters()[0] instanceof UInt32 // verify argument types
100-
&& signal.getParameters()[1] instanceof DBusMap
101-
&& ((UInt32)signal.getParameters()[0]).intValue() == 0 // verify success-code
100+
&& signal.getParameters()[0] instanceof UInt32 // verify argument types
101+
&& signal.getParameters()[1] instanceof DBusMap
102+
&& ((UInt32) signal.getParameters()[0]).intValue() == 0 // verify success-code
102103
) {
103104
// parse signal & set appropriate Future as the result
104105
if (((DBusMap<?, ?>) signal.getParameters()[1]).containsKey("session_handle")) {
105-
sessionHandleMaybe.complete((String)(((Variant<?>)((DBusMap<?, ?>) signal.getParameters()[1]).get("session_handle")).getValue()));
106+
sessionHandleMaybe.complete((String) (((Variant<?>) ((DBusMap<?, ?>) signal.getParameters()[1]).get("session_handle")).getValue()));
106107
} else if (((DBusMap<?, ?>) signal.getParameters()[1]).containsKey("streams")) {
107-
streamIdMaybe.complete(((UInt32)((Object[]) ((List<?>) (((Variant<?>) ((DBusMap<?, ?>) signal.getParameters()[1]).get("streams")).getValue())).get(0))[0]).intValue());
108+
if (((DBusMap<?, ?>) signal.getParameters()[1]).get("restore_token") != null) {
109+
String restoreToken = (String) ((Variant<?>) ((DBusMap<?, ?>) signal.getParameters()[1]).get("restore_token")).getValue();
110+
try {
111+
if (!restoreToken.equals(MainSingleton.getInstance().config.getScreenCastRestoreToken())) {
112+
MainSingleton.getInstance().config.setScreenCastRestoreToken((String) ((Variant<?>) ((DBusMap<?, ?>) signal.getParameters()[1]).get("restore_token")).getValue());
113+
StorageManager storageManager = new StorageManager();
114+
storageManager.writeConfig(MainSingleton.getInstance().config, null);
115+
}
116+
} catch (IOException e) {
117+
log.error("Can't write config file.");
118+
}
119+
}
120+
streamIdMaybe.complete(((UInt32) ((Object[]) ((List<?>) (((Variant<?>) ((DBusMap<?, ?>) signal.getParameters()[1]).get("streams")).getValue())).get(0))[0]).intValue());
108121
}
109122
}
110123
} catch (DBusException e) {
111124
throw new RuntimeException(e); // couldn't parse, fail early
112125
}
113126
});
114-
115127
screenCastIface.CreateSession(Map.of("session_handle_token", new Variant<>(handleToken)));
116128
DBusPath receivedSessionHandle = new DBusPath(sessionHandleMaybe.get());
117-
118-
screenCastIface.SelectSources(receivedSessionHandle,
119-
Map.of(
120-
"multiple", new Variant<>(false),
121-
"types", new Variant<>(new UInt32(1|2)) // bitmask, 1 - screens, 2 - windows
122-
)
123-
);
129+
String restoreToken = MainSingleton.getInstance().config.getScreenCastRestoreToken();
130+
Map<String, Variant<?>> selectSourcesMap = new HashMap<>() {{
131+
put("multiple", new Variant<>(false));
132+
put("types", new Variant<>(new UInt32(1 | 2))); // bitmask, 1 - screens, 2 - windows
133+
put("persist_mode", new Variant<>(new UInt32(2)));
134+
}};
135+
if (restoreToken != null) {
136+
selectSourcesMap.put("restore_token", new Variant<>(restoreToken));
137+
}
138+
screenCastIface.SelectSources(receivedSessionHandle, selectSourcesMap);
124139
screenCastIface.Start(receivedSessionHandle, "", Collections.emptyMap());
125-
126-
return streamIdMaybe.thenApply(streamId -> {
140+
var c = streamIdMaybe.thenApply(streamId -> {
127141
FileDescriptor fileDescriptor = screenCastIface.OpenPipeWireRemote(receivedSessionHandle, Collections.emptyMap()); // block until stream started before calling OpenPipeWireRemote
128-
129142
return new XdgStreamDetails(streamId, fileDescriptor);
130143
}).get();
144+
return c;
131145
}
132146

133147
/**
@@ -139,7 +153,7 @@ public static String getLinuxPipelineParams() {
139153
String gstreamerPipeline;
140154
String pipeline;
141155
if (MainSingleton.getInstance().config.getCaptureMethod().equals(Configuration.CaptureMethod.PIPEWIREXDG.name())
142-
|| MainSingleton.getInstance().config.getCaptureMethod().equals(Configuration.CaptureMethod.PIPEWIREXDG_NVIDIA.name())) {
156+
|| MainSingleton.getInstance().config.getCaptureMethod().equals(Configuration.CaptureMethod.PIPEWIREXDG_NVIDIA.name())) {
143157
if (MainSingleton.getInstance().config.getCaptureMethod().equals(Configuration.CaptureMethod.PIPEWIREXDG.name())) {
144158
pipeline = Constants.GSTREAMER_PIPELINE_PIPEWIREXDG;
145159
} else {

0 commit comments

Comments
 (0)