diff --git a/app/src/main/java/io/xpipe/app/util/PlatformThread.java b/app/src/main/java/io/xpipe/app/util/PlatformThread.java index 67ea72413..217472402 100644 --- a/app/src/main/java/io/xpipe/app/util/PlatformThread.java +++ b/app/src/main/java/io/xpipe/app/util/PlatformThread.java @@ -22,59 +22,15 @@ import java.util.concurrent.atomic.AtomicBoolean; @SuppressWarnings("unchecked") public class PlatformThread { - public static ObservableValue syncHighFrequency(ObservableValue observable) { - var prop = new SimpleObjectProperty<>(observable.getValue()); - var applied = new AtomicBoolean(true); - observable.addListener((observable1, oldValue, newValue) -> { - if (Platform.isFxApplicationThread()) { - prop.set(newValue); - } else { - if (applied.get()) { - applied.set(false); - Platform.runLater(() -> { - applied.set(true); - prop.set(observable.getValue()); - }); - } - } - }); - BindingsHelper.preserve(prop, observable); - return prop; - } - - public static Observable sync(Observable o) { - Objects.requireNonNull(o); - return new Observable() { - - private final Map invListenerMap = new ConcurrentHashMap<>(); - - @Override - public void addListener(InvalidationListener listener) { - InvalidationListener l = o -> { - PlatformThread.runLaterIfNeeded(() -> listener.invalidated(o)); - }; - - invListenerMap.put(listener, l); - o.addListener(l); - } - - @Override - public void removeListener(InvalidationListener listener) { - o.removeListener(invListenerMap.getOrDefault(listener, listener)); - } - }; - } - public static ObservableValue sync(ObservableValue ov) { Objects.requireNonNull(ov); ObservableValue obs = new ObservableValue<>() { - private final Map, ChangeListener> changeListenerMap = - new ConcurrentHashMap<>(); - private final Map invListenerMap = new ConcurrentHashMap<>(); + private final Map, ChangeListener> changeListenerMap = new HashMap<>(); + private final Map invListenerMap = new HashMap<>(); @Override - public void addListener(ChangeListener listener) { + public synchronized void addListener(ChangeListener listener) { ChangeListener l = (c, o, n) -> { PlatformThread.runLaterIfNeeded(() -> listener.changed(c, o, n)); }; @@ -84,8 +40,11 @@ public class PlatformThread { } @Override - public void removeListener(ChangeListener listener) { - ov.removeListener(changeListenerMap.getOrDefault(listener, listener)); + public synchronized void removeListener(ChangeListener listener) { + var r = changeListenerMap.remove(listener); + if (r != null) { + ov.removeListener(r); + } } @Override @@ -94,7 +53,7 @@ public class PlatformThread { } @Override - public void addListener(InvalidationListener listener) { + public synchronized void addListener(InvalidationListener listener) { InvalidationListener l = o -> { PlatformThread.runLaterIfNeeded(() -> listener.invalidated(o)); }; @@ -104,8 +63,11 @@ public class PlatformThread { } @Override - public void removeListener(InvalidationListener listener) { - ov.removeListener(invListenerMap.getOrDefault(listener, listener)); + public synchronized void removeListener(InvalidationListener listener) { + var r = invListenerMap.remove(listener); + if (r != null) { + ov.removeListener(r); + } } }; return obs; @@ -116,11 +78,12 @@ public class PlatformThread { ObservableList obs = new ObservableList<>() { private final Map, ListChangeListener> listChangeListenerMap = - new ConcurrentHashMap<>(); - private final Map invListenerMap = new ConcurrentHashMap<>(); + new HashMap<>(); + private final Map invListenerMap = new HashMap<>(); + @Override - public void addListener(ListChangeListener listener) { + public synchronized void addListener(ListChangeListener listener) { ListChangeListener l = (lc) -> { PlatformThread.runLaterIfNeeded(() -> listener.onChanged(lc)); }; @@ -130,8 +93,11 @@ public class PlatformThread { } @Override - public void removeListener(ListChangeListener listener) { - ol.removeListener(listChangeListenerMap.getOrDefault(listener, listener)); + public synchronized void removeListener(ListChangeListener listener) { + var r = listChangeListenerMap.remove(listener); + if (r != null) { + ol.removeListener(r); + } } @Override @@ -279,8 +245,9 @@ public class PlatformThread { return ol.subList(fromIndex, toIndex); } + @Override - public void addListener(InvalidationListener listener) { + public synchronized void addListener(InvalidationListener listener) { InvalidationListener l = o -> { PlatformThread.runLaterIfNeeded(() -> listener.invalidated(o)); }; @@ -290,8 +257,11 @@ public class PlatformThread { } @Override - public void removeListener(InvalidationListener listener) { - ol.removeListener(invListenerMap.getOrDefault(listener, listener)); + public synchronized void removeListener(InvalidationListener listener) { + var r = invListenerMap.remove(listener); + if (r != null) { + ol.removeListener(r); + } } }; return obs;