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

Print this page

        

*** 2348,2415 **** } } 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) { 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(); 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())); ! } 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) { try { awtLockWait(timeout); } catch (InterruptedException e) { throw new RuntimeException(e); } --- 2348,2429 ---- } } private static XEventDispatcher oops_waiter; private static boolean oops_updated; private XAtom oops; /** * @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.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(); } } } }; } 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; // Wait for selection notify for oops on win long event_number = getEventNumber(); ! 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) { try { awtLockWait(timeout); } catch (InterruptedException e) { throw new RuntimeException(e); }
*** 2417,2440 **** // 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; } finally { removeEventDispatcher(win.getWindow(), oops_waiter); eventLog.finer("Exiting syncNativeQueue"); awtUnlock(); } --- 2431,2441 ---- // 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)); } } ! return getEventNumber() - event_number > 3; } finally { removeEventDispatcher(win.getWindow(), oops_waiter); eventLog.finer("Exiting syncNativeQueue"); awtUnlock(); }