With this patch applied, only clicks on the mouse's right button and not clicks to the mouse's forward or back buttons trigger a context menu (MouseEvent.isPopupTrigger() == true).
Class XWindow tried to map physical mouse buttons to logical mouse buttons, but this unnecessary because that mapping is already handled automatically in Xlib: http://www.x.org/archive/X11R7.5/doc/man/man3/XKeyEvent.3.html Also, XGetPointerMapping returns the total number of physical mouse buttons (16 on my computer), not the value of a map entry: http://www.x.org/archive/X11R7.5/doc/man/man3/XGetPointerMapping.3.html This JDK bug has to be fixed before https://netbeans.org/bugzilla/show_bug.cgi?id=198885 can be fixed. This patch will probably also fix https://bugs.openjdk.java.net/browse/JDK-6624085 A test program is attached. This is my first time contributing code to OpenJDK, so if I've done something wrong, please be nice ;-) -Alex diff --git a/src/java.desktop/unix/classes/sun/awt/X11/XWindow.java b/src/java.desktop/unix/classes/sun/awt/X11/XWindow.java --- a/src/java.desktop/unix/classes/sun/awt/X11/XWindow.java +++ b/src/java.desktop/unix/classes/sun/awt/X11/XWindow.java @@ -50,17 +50,16 @@ class XWindow extends XBaseWindow implem private static final PlatformLogger focusLog = PlatformLogger.getLogger("sun.awt.X11.focus.XWindow"); private static PlatformLogger keyEventLog = PlatformLogger.getLogger("sun.awt.X11.kye.XWindow"); /* If a motion comes in while a multi-click is pending, * allow a smudge factor so that moving the mouse by a small * amount does not wipe out the multi-click state variables. */ private final static int AWT_MULTICLICK_SMUDGE = 4; // ButtonXXX events stuff - static int rbutton = 0; static int lastX = 0, lastY = 0; static long lastTime = 0; static long lastButton = 0; static WeakReference<XWindow> lastWindowRef = null; static int clickCount = 0; // used to check if we need to re-create surfaceData. int oldWidth = -1; @@ -627,33 +626,16 @@ class XWindow extends XBaseWindow implem res |= XToolkit.metaMask; } if ((mods & (InputEvent.ALT_GRAPH_DOWN_MASK | InputEvent.ALT_GRAPH_MASK)) != 0) { res |= XToolkit.modeSwitchMask; } return res; } - /** - * Returns true if this event is disabled and shouldn't be passed to Java. - * Default implementation returns false for all events. - */ - static int getRightButtonNumber() { - if (rbutton == 0) { // not initialized yet - XToolkit.awtLock(); - try { - rbutton = XlibWrapper.XGetPointerMapping(XToolkit.getDisplay(), XlibWrapper.ibuffer, 3); - } - finally { - XToolkit.awtUnlock(); - } - } - return rbutton; - } - static int getMouseMovementSmudge() { //TODO: It's possible to read corresponding settings return AWT_MULTICLICK_SMUDGE; } public void handleButtonPressRelease(XEvent xev) { super.handleButtonPressRelease(xev); XButtonEvent xbe = xev.get_xbutton(); @@ -711,21 +693,17 @@ class XWindow extends XBaseWindow implem lastY = y; } lastTime = when; /* Check for popup trigger !! */ - if (lbutton == getRightButtonNumber() || lbutton > 2) { - popupTrigger = true; - } else { - popupTrigger = false; - } + popupTrigger = (lbutton == 3); } button = XConstants.buttons[lbutton - 1]; // 4 and 5 buttons are usually considered assigned to a first wheel if (lbutton == XConstants.buttons[3] || lbutton == XConstants.buttons[4]) { wheel_mouse = true; }
MouseDebug.tar.xz
Description: Binary data