src/solaris/classes/sun/awt/X11/XToolkit.java

Print this page

        

@@ -2348,68 +2348,82 @@
         }
     }
 
     private static XEventDispatcher oops_waiter;
     private static boolean oops_updated;
-    private static boolean oops_failed;
     private XAtom oops;
-    private static final long WORKAROUND_SLEEP = 100;
 
     /**
      * @inheritDoc
      */
     protected boolean syncNativeQueue(final long timeout) {
         XBaseWindow win = XBaseWindow.getXAWTRootWindow();
 
         if (oops_waiter == null) {
             oops_waiter = new XEventDispatcher() {
                     public void dispatchEvent(XEvent e) {
-                        if (e.get_type() == XConstants.SelectionNotify) {
+                        if (e.get_type() == XConstants.SelectionRequest) {
+                            XSelectionRequestEvent xsre = e.get_xselectionrequest();
+                            XSelectionEvent xse = new XSelectionEvent();
+                            try {
+                                xse.set_type(XConstants.SelectionNotify);
+                                xse.set_send_event(true);
+                                xse.set_requestor(xsre.get_requestor());
+                                xse.set_selection(xsre.get_selection());
+                                xse.set_target(xsre.get_target());
+                                xse.set_property(xsre.get_property());
+                                xse.set_time(xsre.get_time());
+
+                                XToolkit.awtLock();
+                                try {
+                                    XlibWrapper.XSendEvent(XToolkit.getDisplay(), win.getWindow(), false,
+                                            XConstants.NoEventMask, xse.pData);
+                                } finally {
+                                    XToolkit.awtUnlock();
+                                }
+                            } finally {
+                                xse.dispose();
+                            }
+
+                        }
+                        else if (e.get_type() == XConstants.SelectionNotify) {
                             XSelectionEvent pe = e.get_xselection();
                             if (pe.get_property() == oops.getAtom()) {
                                 oops_updated = true;
                                 awtLockNotifyAll();
-                            } else if (pe.get_selection() == XAtom.get("WM_S0").getAtom() &&
-                                       pe.get_target() == XAtom.get("VERSION").getAtom() &&
-                                       pe.get_property() == 0 &&
-                                       XlibWrapper.XGetSelectionOwner(getDisplay(), XAtom.get("WM_S0").getAtom()) == 0)
-                            {
-                                // WM forgot to acquire selection  or there is no WM
-                                oops_failed = true;
-                                awtLockNotifyAll();
                             }
-
                         }
                     }
                 };
         }
 
         if (oops == null) {
             oops = XAtom.get("OOPS");
         }
 
         awtLock();
+
+        if (XlibWrapper.XGetSelectionOwner(getDisplay(), XAtom.get("XTOOLKIT").getAtom()) == 0) {
+            XlibWrapper.XSetSelectionOwner(getDisplay(), XAtom.get("XTOOLKIT").getAtom(), win.getWindow(), XConstants.CurrentTime);
+        }
+
         try {
             addEventDispatcher(win.getWindow(), oops_waiter);
 
             oops_updated = false;
-            oops_failed = false;
             // Wait for selection notify for oops on win
             long event_number = getEventNumber();
-            XAtom atom = XAtom.get("WM_S0");
-            if (eventLog.isLoggable(PlatformLogger.Level.FINER)) {
-                eventLog.finer("WM_S0 selection owner {0}", XlibWrapper.XGetSelectionOwner(getDisplay(), atom.getAtom()));
-            }
+            XAtom atom = XAtom.get("XTOOLKIT");
             XlibWrapper.XConvertSelection(getDisplay(), atom.getAtom(),
                                           XAtom.get("VERSION").getAtom(), oops.getAtom(),
                                           win.getWindow(), XConstants.CurrentTime);
             XSync();
 
             eventLog.finer("Requested OOPS");
 
             long start = System.currentTimeMillis();
-            while (!oops_updated && !oops_failed) {
+            while (!oops_updated) {
                 try {
                     awtLockWait(timeout);
                 } catch (InterruptedException e) {
                     throw new RuntimeException(e);
                 }

@@ -2417,24 +2431,11 @@
                 // wake-ups.  However, we shouldn't wait for too long
                 if ((System.currentTimeMillis() - start > timeout) && timeout >= 0) {
                     throw new OperationTimedOut(Long.toString(System.currentTimeMillis() - start));
                 }
             }
-            if (oops_failed && getEventNumber() - event_number == 1) {
-                // If selection update failed we can simply wait some time
-                // hoping some events will arrive
-                awtUnlock();
-                eventLog.finest("Emergency sleep");
-                try {
-                    Thread.sleep(WORKAROUND_SLEEP);
-                } catch (InterruptedException ie) {
-                    throw new RuntimeException(ie);
-                } finally {
-                    awtLock();
-                }
-            }
-            return getEventNumber() - event_number > 2;
+            return getEventNumber() - event_number > 3;
         } finally {
             removeEventDispatcher(win.getWindow(), oops_waiter);
             eventLog.finer("Exiting syncNativeQueue");
             awtUnlock();
         }