public inbox for cygwin-xfree@sourceware.org
help / color / mirror / Atom feed
From: Richard Evans <richard.evans@datanomic.com>
To: <cygwin-xfree@cygwin.com>,	"Jon TURNEY" <jon.turney@dronecode.org.uk>
Subject: RE: Mouse offset when using java swing based gui applications
Date: Thu, 22 Jul 2010 08:39:00 -0000	[thread overview]
Message-ID: <974066EF77EEA44EB8AED6ADA05DBD0202038CEE@THHS2EXBE1X.hostedservice2.net> (raw)
In-Reply-To: <4C474580.3090309@dronecode.org.uk>

Yes, my experience is the same as yours.  The menus test starts with the
frame hidden off the top left, as before, but when I move the window,
the menus _do_ work OK.

Apps which set an initial location (add jframe.setLocation(400, 400);
after the pack() call) appear correctly and the menus still work.
Interestingly with the 1.7.3 XWin, the app would appear in the right
place but would tend to snap back to the top left if you tried to resize
the window.  This does not seem to happen with the patched server.

Richard

-----Original Message-----
From: Jon TURNEY [mailto:jon.turney@dronecode.org.uk] 
Sent: 21 July 2010 20:08
To: cygwin-xfree@cygwin.com; Richard Evans
Subject: Re: Mouse offset when using java swing based gui applications

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.j
ava 
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/


      parent reply	other threads:[~2010-07-22  8:39 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-07-13 21:57 Jonas Winkler
2010-07-15 13:38 ` Jon TURNEY
2010-07-15 14:41   ` Richard Evans
2010-07-19 15:51     ` Jon TURNEY
2010-07-19 16:28       ` Richard Evans
2010-07-21 19:07         ` Jon TURNEY
2010-07-21 19:11           ` [PATCH] Cygwin/X: Internal WM workaround for Java AWT bug Jon TURNEY
2010-07-22  8:39           ` Richard Evans [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=974066EF77EEA44EB8AED6ADA05DBD0202038CEE@THHS2EXBE1X.hostedservice2.net \
    --to=richard.evans@datanomic.com \
    --cc=cygwin-xfree@cygwin.com \
    --cc=jon.turney@dronecode.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).