GitHub user xxDark edited a comment on the discussion: Windows clipboard issues discussion
Modify my test as follows, this will be 1:1 of what is happening in NetBeans: ``` import java.awt.EventQueue; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.ClipboardOwner; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.IOException; import java.util.UUID; public class ClipboardTest { public static void main(String[] args) throws Exception { var clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); // Comment out to "fix" the bug. clipboard.addFlavorListener(e -> { //Dummy listener. }); EventQueue.invokeLater(() -> { // Dummy task. }); for (var thread : Thread.getAllStackTraces().keySet()) { var name = thread.getName(); if (name.contains("AWT")) { System.out.printf("%s is running%n", name); } } var r = new Runnable() { final ClipboardContent content = new ClipboardContent(); State state = new State.SetContent(); int iteration; @Override public void run() { try { switch (state) { case State.SetContent ignored -> { var current = this.content; var owner = current.owner; owner.lost = false; try { clipboard.setContents(current.selection, owner); } catch (IllegalStateException ex) { return; } state = new State.CheckOwnership(System.currentTimeMillis() + 7000L); } case State.CheckOwnership state -> { if (content.owner.lost) { // OK this.state = new State.SetContent(); iteration++; } else if (System.currentTimeMillis() > state.deadline) { System.err.printf("Ownership should've been lost (failed at %d iterations)%n", iteration); this.state = new State.CheckOwnership(Long.MAX_VALUE); Thread.ofPlatform().start(() -> { do { try { System.out.println(clipboard.getContents(null).getTransferData(DataFlavor.stringFlavor)); } catch (UnsupportedFlavorException | IOException e) { e.printStackTrace(); } try { Thread.sleep(1000L); } catch (InterruptedException ignored) {} } while (true); }); } } } } finally { EventQueue.invokeLater(this); } } }; EventQueue.invokeLater(r); Thread.sleep(60000L); System.out.printf("Did %d iterations%n", r.iteration); Runtime.getRuntime().halt(0); } private sealed interface State { record SetContent() implements State { } record CheckOwnership(long deadline) implements State { } } private static final class ClipboardContent { final OwnershipTracker owner = new OwnershipTracker(); final String content = UUID.randomUUID().toString(); final StringSelection selection = new StringSelection(content); } private static final class OwnershipTracker implements ClipboardOwner { volatile boolean lost; @Override public void lostOwnership(Clipboard clipboard, Transferable contents) { lost = true; } } } ``` When you see "Ownership should've been lost" message, try copying something from another application. `getContents` will now be returning bogus data. Previous steps still apply: hold ctrl+C in the code area till the "ownership should've been lost" message appears GitHub link: https://github.com/apache/netbeans/discussions/7051#discussioncomment-12768814 ---- This is an automatically sent email for notifications@netbeans.apache.org. To unsubscribe, please send an email to: notifications-unsubscr...@netbeans.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: notifications-unsubscr...@netbeans.apache.org For additional commands, e-mail: notifications-h...@netbeans.apache.org For further information about the NetBeans mailing lists, visit: https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists