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

Reply via email to