--- old/src/solaris/classes/sun/awt/X11/XToolkit.java 2013-09-23 14:56:12.902053953 +0400 +++ new/src/solaris/classes/sun/awt/X11/XToolkit.java 2013-09-23 14:56:12.725965948 +0400 @@ -2350,9 +2350,7 @@ 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 @@ -2363,21 +2361,36 @@ 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(); } - } } }; @@ -2388,17 +2401,18 @@ } 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); @@ -2407,7 +2421,7 @@ eventLog.finer("Requested OOPS"); long start = System.currentTimeMillis(); - while (!oops_updated && !oops_failed) { + while (!oops_updated) { try { awtLockWait(timeout); } catch (InterruptedException e) { @@ -2419,20 +2433,7 @@ 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");