[Xquartz-dev] Fix FFM behaviour

Marcus Crestani crestani at informatik.uni-tuebingen.de
Sat Feb 14 12:31:34 PST 2009


Instead of XQuartz, I am using Ion-3 as my default window manager in
rootless mode.  The window manager Ion grabs the whole desktop and
allows me to tile it into frames.  Each frame can hold several windows
of X11 applications.  Ion makes heavy use of focus follows mouse, as
it moves focus to the frame then thus to the window where the mouse
moves to.  Ion was unusable since Xquartz-1.3.0-apple13, see this
discussion on x11-users:
http://lists.apple.com/archives/x11-users/2008/Apr/msg00131.html .

Short version: When I open a non-X11 application, i.e. native
application, the native window opens up in front of my X11 windows and
has the focus.  As soon as I move the mouse into another X11 window
that is somewhere in the background, this window pops to front and
gets painted over the native window.  The native window still has the
focus, though (text I tpye ends up in the native window).

The situation improved with this patch:
  http://cgit.freedesktop.org/xorg/xserver/commit/?h=xorg-server-1.4-apple&id=10090a132a0110fe24c8c886d9f53e6e947f8038

Now, X11 only gets events when the mouse is over an X11 window.  If
the mouse does not leave the native window, X11 does not receive an
event and thus the X11 windows does not pop to front.  As soon as I
leave the native window, the underlying X11 window pops to front, but
the focus stays with the native window, same as before.
   
To improve my situation even further, I meanwhile run the latest
development xorg-server-1.4 with following patch, that prevents move
events from beeing sent to X11 without any problems:

diff --git a/hw/xquartz/X11Application.m b/hw/xquartz/X11Application.m
index 7bf4d71..41a140b 100644
--- a/hw/xquartz/X11Application.m
+++ b/hw/xquartz/X11Application.m
@@ -1065,6 +1065,8 @@ static inline int ensure_flag(int flags, int device_independent, int device_depe
             if(!quartzServerVisible) {
                 xp_window_id wid;
 
+                if (ev_button==0) return;
+
                 /* Sigh. Need to check that we're really over one of
                  * our windows. (We need to receive pointer events while
                  * not in the foreground, but we don't want to receive them

With this patch, move events are not passed to the background X11, but
as soon as I click into a X11 window in the background, the focus
change happens.  Fine for me.  But I am not sure, if I miss something
and if my workaround breaks something that I haven't realized yet.

Can someone please explain to me, why the comments states "we need to
receive pointer events while not in the foreground"?  For me, pushing
all the pointer events to the background X11 breaks Ion.  Thus, I'd
like to see the possibility to prevent this from happening, maybe with
a preference setting.  Do you have a better solution to my problem?

Thanks in advance for your help!

-- 
Marcus


More information about the Xquartz-dev mailing list