[PATCH] Fix right-click detection in Linux and Solaris

Alex Henrie alexhenrie24 at gmail.com
Mon Aug 25 05:59:17 UTC 2014


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


More information about the jdk9-dev mailing list