⚡️ Synchronize window scanning
authorDavid Roden <github-a8in@qsheltier.de>
Mon, 27 Jan 2025 20:38:24 +0000 (21:38 +0100)
committerDavid Roden <github-a8in@qsheltier.de>
Mon, 27 Jan 2025 20:38:24 +0000 (21:38 +0100)
server/src/main/java/de/qsheltier/msta/Server.java

index 9cb7cb7..4ca790b 100644 (file)
@@ -15,10 +15,12 @@ import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
+import java.lang.reflect.InvocationTargetException;
 import java.net.InetSocketAddress;
 import java.net.ServerSocket;
 import java.net.Socket;
 import java.net.SocketAddress;
+import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
@@ -26,6 +28,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.Consumer;
+import javax.swing.SwingUtilities;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static java.util.Arrays.stream;
@@ -137,7 +140,13 @@ public class Server implements Closeable {
 
        private void scanForWindows() {
                while (!closed.get()) {
-                       var currentlyOpenWindows = stream(Window.getWindows()).filter(Component::isVisible).toList();
+                       var currentlyOpenWindows = new ArrayList<Window>();
+                       try {
+                               Thread.sleep(100);
+                               SwingUtilities.invokeAndWait(() -> stream(Window.getWindows()).filter(Component::isVisible).forEach(currentlyOpenWindows::add));
+                       } catch (InterruptedException | InvocationTargetException e) {
+                               /* ignore. */
+                       }
                        var newWindows = currentlyOpenWindows.stream().filter(window -> !windows.containsValue(window)).toList();
                        newWindows.forEach(newWindow -> {
                                synchronized (outputWriters) {
@@ -145,7 +154,6 @@ public class Server implements Closeable {
                                }
                                windows.put(newWindow.getName(), newWindow);
                        });
-                       Thread.yield();
                        synchronized (this) {
                                notifyAll();
                        }