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();
}