diff --git a/src/solaris/classes/sun/awt/X11/XRootWindow.java b/src/solaris/classes/sun/awt/X11/XRootWindow.java index 1a35581d550e5db550f4ac7a4a29b8b1ae806916..6b8b1620da28aa548023eae50262e09f41794033 100644 --- a/src/solaris/classes/sun/awt/X11/XRootWindow.java +++ b/src/solaris/classes/sun/awt/X11/XRootWindow.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -46,7 +46,8 @@ class XRootWindow extends XBaseWindow { } private XRootWindow() { - super(new XCreateWindowParams(new Object[] {DELAYED, Boolean.TRUE})); + super(new XCreateWindowParams(new Object[] { DELAYED, Boolean.TRUE, + EVENT_MASK, XConstants.StructureNotifyMask })); } public void postInit(XCreateWindowParams params){ diff --git a/src/solaris/classes/sun/awt/X11/XToolkit.java b/src/solaris/classes/sun/awt/X11/XToolkit.java index 2a628ecfc05f872ab688fccb00ef8f74e1f4daf5..800be8f6056225d55a96b486f73f1bfcfe506691 100644 --- a/src/solaris/classes/sun/awt/X11/XToolkit.java +++ b/src/solaris/classes/sun/awt/X11/XToolkit.java @@ -2354,9 +2354,7 @@ public final class XToolkit extends UNIXToolkit implements Runnable { 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; + private static boolean oops_move; /** * @inheritDoc @@ -2367,52 +2365,33 @@ public final class XToolkit extends UNIXToolkit implements Runnable { 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 (e.get_type() == XConstants.ConfigureNotify) { + // OOPS ConfigureNotify event catched + oops_updated = 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); + // Generate OOPS ConfigureNotify event + XlibWrapper.XMoveWindow(getDisplay(), win.getWindow(), oops_move ? 0 : 1, 0); + // Change win position each time to avoid system optimization + oops_move = !oops_move; XSync(); - eventLog.finer("Requested OOPS"); + eventLog.finer("Generated OOPS ConfigureNotify event"); long start = System.currentTimeMillis(); - while (!oops_updated && !oops_failed) { + while (!oops_updated) { try { + // Wait for OOPS ConfigureNotify event awtLockWait(timeout); } catch (InterruptedException e) { throw new RuntimeException(e); @@ -2423,20 +2402,8 @@ public final class XToolkit extends UNIXToolkit implements Runnable { 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; + // Don't take into account OOPS ConfigureNotify event + return getEventNumber() - event_number > 1; } finally { removeEventDispatcher(win.getWindow(), oops_waiter); eventLog.finer("Exiting syncNativeQueue");