Mouse offset when using java swing based gui applications

Jon TURNEY jon.turney@dronecode.org.uk
Wed Jul 21 19:07:00 GMT 2010


On 19/07/2010 17:27, Richard Evans wrote:
> I've attached a small test case which shows the menu problems.

Thanks very much, that was very helpful in investigating this problem.

> This menu behaviour has been seen for all versions of JDK 1.6 as far as
> I remember; it certainly happens with 1.6u3 and 1.6u4.

Yes, I wasn't testing what I thought I was testing, and was completely wrong 
when I said sun bug #6434227 was fixed in the JRE that it claims it's fixed in.

It's fixed in JDK1.7 and OpenJDK, but that bug lies when it says the fix is in 
1.6 as well.

However, it does identify what's going wrong.  The significant difference in 
XDecoratedPeer.java between 1.6u21 and a fixed version is:

--- 
/opt/wip/jdk-1_6_0/j2se/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java 
2010-07-21 15:46:33.281250000 +0100
+++ /opt/wip/openjdk/jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java 
  2010-06-21 22:15:43.000000000 +0100
@@ -752,79 +748,69 @@
              Point newLocation = targetBounds.getLocation();
-            if (xe.get_send_event()) {
+        if (xe.get_send_event() || runningWM == XWM.NO_WM || 
XWM.isNonReparentingWM()) {
                  // Location, Client size + insets
                  newLocation = new Point(xe.get_x() - currentInsets.left, 
xe.get_y() - currentInsets.top);
              } else {
                  // CDE/MWM/Metacity/Sawfish bug: if shell is resized using
                  // top or left border, we don't receive synthetic
                  // ConfigureNotify, only the one from X with zero
                  // coordinates.  This is the workaround to get real
                  // location, 6261336
-                // Do the same for non-reparenting WMs (Compiz, Looking Glass)
                  switch (XWM.getWMID()) {
                    case XWM.CDE_WM:
                    case XWM.MOTIF_WM:
                    case XWM.METACITY_WM:
                    case XWM.SAWFISH_WM:
-                  case XWM.COMPIZ_WM:
-                  case XWM.LG3D_WM:
                    {
                        Point xlocation = queryXLocation();
                        if (log.isLoggable(Level.FINE)) {
                            log.log(Level.FINE, "New X location: {0}",
                                    new Object[]{String.valueOf(xlocation)});
                        }
                        if (xlocation != null) {
                            newLocation = xlocation;
                        }
                        break;
                    }
                    default:
                        break;
                  }
              }

Location updates from ConfigureNotify are not processed in the NO_WM case,
presumably causing the menus behave as if the window was still located where 
it was created.

There are 2 possible workarounds which occur to me:

(i) Lie and pretend we are a non-reparenting WM on the list that AWT knows 
about, like LG3D.  This one of the workarounds suggested in the manpage for 
dwm (a non-reparenting, tiling WM)

Unfortunately, we have to tell a more lies to get AWT to accept this lie, and 
in particular, we have to claim to support EWMH, which the internal WM doesn't 
really (although it should), so I'm not too keen on this approach.

(ii) Alternatively, it's a straightforward workaround to add to the internal 
WM to cause it to send synthetic ConfigureNotify for these windows when a 
non-synthetic ConfigureNotify occurs.

 From a quick test, this approach seems to work ok.  But the Java window still 
appears with the frame off the top-left, rather than getting nudged away from 
the origin so the frame is visible, which is rather mysterious.

I've uploaded a build with this change at [1], patch to follow.  Perhaps you 
could try it out and see if it works for you?

[1] ftp://cygwin.com/pub/cygwinx/XWin.20100721-git-2704058015f198ce.exe.bz2

-- 
Jon TURNEY
Volunteer Cygwin/X X Server maintainer

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://x.cygwin.com/docs/
FAQ:                   http://x.cygwin.com/docs/faq/



More information about the Cygwin-xfree mailing list