EVALUATION
The only reasonable solution to this problem is introducing the system property sun.awt.disablegrab which, if passed as the boolean value of true, effectively disables acquiring grabs on X11 platforms. If the user wishes to debug an application and sets a breakpoint in an event handler that gets fired while a popup window is opened (like a combobox popup), the user must specify this system property before debugging the application as follows:
java -Dsun.awt.disablegrab=true ...<other_options>...
All known IDEs allow specifying the user-supplied command line options to the java command, making this solution easily adoptable. For instance, in Netbeans open the properties of the project, go to the Run section and type the text "-Dsun.awt.disablegrab=true" (w/o the quotes) into the VM Options editbox. Of course, the project must be configured to run with a JRE having the suggested fix in place.
|
SUGGESTED FIX
--- old/src/solaris/classes/sun/awt/X11/XBaseWindow.java 2008-06-27 13:01:13.000000000 +0400
+++ new/src/solaris/classes/sun/awt/X11/XBaseWindow.java 2008-06-27 13:01:13.000000000 +0400
@@ -854,28 +854,35 @@
| EnterWindowMask | LeaveWindowMask | PointerMotionMask
| ButtonMotionMask);
final int ownerEvents = 1;
-
- int ptrGrab = XlibWrapper.XGrabPointer(XToolkit.getDisplay(),
- getContentWindow(), ownerEvents, eventMask, GrabModeAsync,
- GrabModeAsync, None, (XWM.isMotif() ? XToolkit.arrowCursor : None),
- CurrentTime);
- // Check grab results to be consistent with X server grab
- if (ptrGrab != GrabSuccess) {
- XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), CurrentTime);
- XAwtState.setGrabWindow(null);
- grabLog.fine(" Grab Failure - mouse");
- return false;
- }
-
- int keyGrab = XlibWrapper.XGrabKeyboard(XToolkit.getDisplay(),
- getContentWindow(), ownerEvents, GrabModeAsync, GrabModeAsync,
- CurrentTime);
- if (keyGrab != GrabSuccess) {
- XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), CurrentTime);
- XlibWrapper.XUngrabKeyboard(XToolkit.getDisplay(), CurrentTime);
- XAwtState.setGrabWindow(null);
- grabLog.fine(" Grab Failure - keyboard");
- return false;
+
+ //6714678: IDE (Netbeans, Eclipse, JDeveloper) Debugger hangs
+ //process on Linux
+ //The user must pass the sun.awt.disableGrab property to disable
+ //taking grabs. This prevents hanging of the GUI when a breakpoint
+ //is hit while a popup window taking the grab is open.
+ if (!XToolkit.getSunAwtDisableGrab()) {
+ int ptrGrab = XlibWrapper.XGrabPointer(XToolkit.getDisplay(),
+ getContentWindow(), ownerEvents, eventMask, GrabModeAsync,
+ GrabModeAsync, None, (XWM.isMotif() ? XToolkit.arrowCursor : None),
+ CurrentTime);
+ // Check grab results to be consistent with X server grab
+ if (ptrGrab != GrabSuccess) {
+ XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), CurrentTime);
+ XAwtState.setGrabWindow(null);
+ grabLog.fine(" Grab Failure - mouse");
+ return false;
+ }
+
+ int keyGrab = XlibWrapper.XGrabKeyboard(XToolkit.getDisplay(),
+ getContentWindow(), ownerEvents, GrabModeAsync, GrabModeAsync,
+ CurrentTime);
+ if (keyGrab != GrabSuccess) {
+ XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), CurrentTime);
+ XlibWrapper.XUngrabKeyboard(XToolkit.getDisplay(), CurrentTime);
+ XAwtState.setGrabWindow(null);
+ grabLog.fine(" Grab Failure - keyboard");
+ return false;
+ }
}
if (prevGrabWindow != null) {
prevGrabWindow.ungrabInputImpl();
@@ -895,8 +902,10 @@
grabLog.log(Level.FINE, "UnGrab input on {0}", new Object[] {grabWindow});
if (grabWindow != null) {
grabWindow.ungrabInputImpl();
- XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), CurrentTime);
- XlibWrapper.XUngrabKeyboard(XToolkit.getDisplay(), CurrentTime);
+ if (!XToolkit.getSunAwtDisableGrab()) {
+ XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), CurrentTime);
+ XlibWrapper.XUngrabKeyboard(XToolkit.getDisplay(), CurrentTime);
+ }
XAwtState.setGrabWindow(null);
// we need to call XFlush() here to force ungrab
// see 6384219 for details
--- old/src/solaris/classes/sun/awt/X11/XToolkit.java 2008-06-27 13:01:14.000000000 +0400
+++ new/src/solaris/classes/sun/awt/X11/XToolkit.java 2008-06-27 13:01:14.000000000 +0400
@@ -30,6 +30,7 @@
import sun.font.FontManager;
import sun.misc.PerformanceLogger;
import sun.print.PrintJob2D;
+import sun.security.action.GetBooleanAction;
import java.lang.reflect.*;
public class XToolkit extends UNIXToolkit implements Runnable, XConstants {
@@ -2151,5 +2152,13 @@
new AwtGraphicsConfigData(((X11GraphicsConfig)gc).getAData());
return 0 != graphicsConfigData.get_isTranslucencySupported();
}
+
+ /**
+ * Returns the value of "sun.awt.disableGrab" property. Default
+ * value is {@code false}.
+ */
+ public static boolean getSunAwtDisableGrab() {
+ return AccessController.doPrivileged(new GetBooleanAction("sun.awt.disableGrab"));
+ }
}
|