On Tue, Sep 16, 2014 at 4:02 AM, patrick keshishian <[email protected]> wrote:
> Hi,
>
> Digging more after I couldn't reproduce the issue with
> "stock" fvwm, I believe the problem is blackbox's code
> calling XSetInputFocus() with a "stale" time. With attached
> patch I am unable to reproduce the issue.
>
> Would appreciate if this could be put in.
>
> Certainly a change in X made this bug show up. If any
> X11 guru knows what change, I'm very curious to find out.
>
> Cheers,
> --patrick
>
>
>
> On 9/14/14, patrick keshishian <[email protected]> wrote:
>> Visual aid demonstraiting the issue described here:
>>
>>       http://youtu.be/gl49UBVOUog
>>
>> --patrick
>>
>> On 9/14/14, patrick keshishian <[email protected]> wrote:
>>> Hi,
>>>
>>> Moving to 2014-SEP-09 snapshot (amd64)[1] I started to notice
>>> something strange with my wm (blackbox) and window focus
>>> events. I have it set to "sloppy" focus, where focus follows the
>>> mouse, but doesn't leave the last visited window, until the mouse
>>> enters a new window.
>>>
>>> Every so often moving the mouse from one window to another,
>>> the latter does not get focus.
>>>
>>> I tried to capture the condition with xev. Here the first sequence
>>> of EnterNotify -> KeymapNotify -> FocusIn -> LeaveNotify ->
>>> FocusOut shows an expected behavior where mouse moved
>>> from xterm to xev window, xev window:
>>>
>>> 1. EnterNotify (mouse moved from xterm -> xev window)
>>> 2. FocusIn (xev window got focus)
>>> 3. bunch of MotionNotify events as mouse moved around
>>> 4. LeaveNotify (mouse left xev window)
>>> 5. FocusOut (mouse entered xterm window)
>>>
>>> EnterNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82741873, (13,137), root:(960,467),
>>>     mode NotifyNormal, detail NotifyAncestor, same_screen YES,
>>>     focus NO, state 0
>>>
>>> KeymapNotify event, serial 35, synthetic NO, window 0x0,
>>>     keys:  4294967224 0   0   0   0   0   0   0   0   0   0   0   0   0
>>> 0
>>>  0
>>>            0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
>>>
>>> MotionNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82741877, (13,137), root:(960,467),
>>>     state 0x0, is_hint 0, same_screen YES
>>>
>>> FocusIn event, serial 35, synthetic NO, window 0x1c00001,
>>>     mode NotifyNormal, detail NotifyNonlinear
>>>
>>> KeymapNotify event, serial 35, synthetic NO, window 0x0,
>>>     keys:  4294967224 0   0   0   0   0   0   0   0   0   0   0   0   0
>>> 0
>>>  0
>>>            0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
>>>
>>> MotionNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82741889, (47,139), root:(994,469),
>>>     state 0x0, is_hint 0, same_screen YES
>>>
>>> MotionNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82741903, (72,139), root:(1019,469),
>>>     state 0x0, is_hint 0, same_screen YES
>>>
>>> MotionNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82741913, (82,139), root:(1029,469),
>>>     state 0x0, is_hint 0, same_screen YES
>>>
>>> MotionNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82741926, (84,139), root:(1031,469),
>>>     state 0x0, is_hint 0, same_screen YES
>>>
>>> MotionNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82741937, (84,139), root:(1031,469),
>>>     state 0x0, is_hint 0, same_screen YES
>>>
>>> MotionNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82742392, (79,139), root:(1026,469),
>>>     state 0x0, is_hint 0, same_screen YES
>>>
>>> MotionNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82742404, (67,138), root:(1014,468),
>>>     state 0x0, is_hint 0, same_screen YES
>>>
>>> MotionNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82742416, (41,134), root:(988,464),
>>>     state 0x0, is_hint 0, same_screen YES
>>>
>>> MotionNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82742428, (10,133), root:(957,463),
>>>     state 0x0, is_hint 0, same_screen YES
>>>
>>> LeaveNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82742433, (-22,131), root:(925,461),
>>>     mode NotifyNormal, detail NotifyAncestor, same_screen YES,
>>>     focus YES, state 0
>>>
>>> FocusOut event, serial 35, synthetic NO, window 0x1c00001,
>>>     mode NotifyNormal, detail NotifyNonlinear
>>>
>>>
>>> This next sequence shows the problem:
>>>
>>> 1. EnterNotify (mouse moved from xterm -> xev window)
>>> 2. FocusIn (xev window got focus - briefly?)
>>> 3. FocusOut (mouse still in xev window, but window w/o focus)
>>>     XXX What happened here?
>>> 4. bunch of MotionNotify events as mouse moved around
>>> 5. LeaveNotify (mouse left xev window)
>>>
>>> Notice no FocusOut event at the end of the sequence. Why
>>> did the FocusOut event happen early? What causes this?
>>>
>>>
>>> EnterNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82742834, (23,139), root:(970,469),
>>>     mode NotifyNormal, detail NotifyAncestor, same_screen YES,
>>>     focus NO, state 0
>>>
>>> KeymapNotify event, serial 35, synthetic NO, window 0x0,
>>>     keys:  4294967224 0   0   0   0   0   0   0   0   0   0   0   0   0
>>> 0
>>>  0
>>>            0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
>>>
>>> MotionNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82742837, (23,139), root:(970,469),
>>>     state 0x0, is_hint 0, same_screen YES
>>>
>>> FocusIn event, serial 35, synthetic NO, window 0x1c00001,
>>>     mode NotifyNormal, detail NotifyNonlinear
>>>
>>> KeymapNotify event, serial 35, synthetic NO, window 0x0,
>>>     keys:  4294967224 0   0   0   0   0   0   0   0   0   0   0   0   0
>>> 0
>>>  0
>>>            0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
>>>
>>> FocusOut event, serial 35, synthetic NO, window 0x1c00001,
>>>     mode NotifyNormal, detail NotifyNonlinear
>>>
>>> MotionNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82742850, (66,139), root:(1013,469),
>>>     state 0x0, is_hint 0, same_screen YES
>>>
>>> MotionNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82742862, (101,139), root:(1048,469),
>>>     state 0x0, is_hint 0, same_screen YES
>>>
>>> MotionNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82742874, (126,139), root:(1073,469),
>>>     state 0x0, is_hint 0, same_screen YES
>>>
>>> MotionNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82742886, (132,139), root:(1079,469),
>>>     state 0x0, is_hint 0, same_screen YES
>>>
>>> MotionNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82752228, (132,143), root:(1079,473),
>>>     state 0x0, is_hint 0, same_screen YES
>>>
>>> MotionNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82752240, (132,144), root:(1079,474),
>>>     state 0x0, is_hint 0, same_screen YES
>>>
>>> MotionNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82752252, (132,149), root:(1079,479),
>>>     state 0x0, is_hint 0, same_screen YES
>>>
>>> MotionNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82752264, (132,154), root:(1079,484),
>>>     state 0x0, is_hint 0, same_screen YES
>>>
>>> MotionNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82752275, (132,159), root:(1079,489),
>>>     state 0x0, is_hint 0, same_screen YES
>>>
>>> MotionNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82752288, (132,170), root:(1079,500),
>>>     state 0x0, is_hint 0, same_screen YES
>>>
>>> LeaveNotify event, serial 35, synthetic NO, window 0x1c00001,
>>>     root 0x2b8, subw 0x0, time 82752294, (132,185), root:(1079,515),
>>>     mode NotifyNormal, detail NotifyNonlinear, same_screen YES,
>>>     focus NO, state 0
>>>
>>>
>>> Anyone else seeing this behavior, possibly with other WMs?
>>> Thoughts as to the cause? or when this might have been
>>> introduced? My last snapshot was pretty old (2014-MAR-21)
>>> and didn't display this issue.
>>>
>>> --patrick
>>>
>>> [1] dmesg:
>>> OpenBSD 5.6-current (GENERIC.MP) #368: Tue Sep  9 00:28:20 MDT 2014
>>>     [email protected]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
> [dd]

This has been forgotten.

Seems good to me, ok dcoppa@ if you want to commit it.

Ciao,
David
Index: Makefile
===================================================================
RCS file: /cvs/obsd/ports/x11/blackbox/Makefile,v
retrieving revision 1.52
diff -u -p -u -p -r1.52 Makefile
--- Makefile    1 Sep 2013 12:49:09 -0000       1.52
+++ Makefile    16 Sep 2014 01:56:03 -0000
@@ -3,7 +3,7 @@
 COMMENT=       small & pretty window manager for 8 and more bits displays
 
 DISTNAME=              blackbox-0.70.1
-REVISION=              4
+REVISION=              5
 CATEGORIES=            x11
 
 HOMEPAGE=              http://blackboxwm.sourceforge.net/
Index: patches/patch-src_Window_cc
===================================================================
RCS file: patches/patch-src_Window_cc
diff -N patches/patch-src_Window_cc
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_Window_cc 16 Sep 2014 01:56:03 -0000
@@ -0,0 +1,21 @@
+$OpenBSD$
+
+- Calling XSetInputFocus() with non-"stale" time.
+  I believe a change in Xorg facilitated this bug where, occasionally,
+  a FocusOut event would immediately follow a FocusIn event, leaving
+  focus reverted to Root window.
+  References:
+       https://bugs.freedesktop.org/show_bug.cgi?id=83900
+       http://marc.info/?l=openbsd-misc&m=141067888307365&w=2
+
+--- src/Window.cc.orig Mon Sep 15 18:35:18 2014
++++ src/Window.cc      Mon Sep 15 18:35:33 2014
+@@ -2194,7 +2194,7 @@ bool BlackboxWindow::setInputFocus(void) {
+   }
+ 
+   XSetInputFocus(blackbox->XDisplay(), client.window,
+-                 RevertToPointerRoot, blackbox->XTime());
++                 RevertToPointerRoot, CurrentTime);
+ 
+   if (client.wmprotocols.wm_take_focus) {
+     XEvent ce;

Reply via email to