all repos — fluxbox @ abd5c9e478ac99f457a1df6292729b615f58bbda

custom fork of the fluxbox windowmanager

smart handling of NotifyUngrab crossing events

closing a keyboard driven popup had the sideeffect to return the focus
where the pointer is, regardless of whether that window had the focus
before (due to a NotifyUngrab crossing event), bug #597
This was resolved by simply ignoring NotifyUngrab mode crossings, but
that had the unfortunate sideeffects to break focus passing when the
mouse was actually moved (in a DnD operation, 730) or the focus shall be
passed on for strict mouse focus and a mouse triggered lower action (1012)

So instead we record the window that was last entered by a *real*
crossing and only ignore the NotifyUngrab event if this window didn't
change.

BUG: 1012
BUG: 730
CCBUG: 597
Thomas Lübking thomas.luebking@gmail.com
commit

abd5c9e478ac99f457a1df6292729b615f58bbda

parent

848875eb922c1ab2eb61d7f8750cdbeed2629b37

2 files changed, 12 insertions(+), 5 deletions(-)

jump to
M src/FbTk/EventManager.ccsrc/FbTk/EventManager.cc

@@ -179,9 +179,7 @@ case Expose:

evhand->exposeEvent(ev.xexpose); break; case EnterNotify: - if (ev.xcrossing.mode != NotifyGrab && - ev.xcrossing.mode != NotifyUngrab) - evhand->enterNotifyEvent(ev.xcrossing); + evhand->enterNotifyEvent(ev.xcrossing); break; case LeaveNotify: if (ev.xcrossing.mode != NotifyGrab &&
M src/Window.ccsrc/Window.cc

@@ -2716,12 +2716,21 @@ }

void FluxboxWindow::enterNotifyEvent(XCrossingEvent &ev) { + static FluxboxWindow *s_last_really_entered = 0; + + if (ev.mode == NotifyUngrab && s_last_really_entered == this) { + // if this results from an ungrab, only act if the window really changed. + // otherwise we might pollute the focus which could have been assigned + // by alt+tab (bug #597) + return; + } + // ignore grab activates, or if we're not visible - if (ev.mode == NotifyGrab || ev.mode == NotifyUngrab || - !isVisible()) { + if (ev.mode == NotifyGrab || !isVisible()) { return; } + s_last_really_entered = this; if (ev.window == frame().window()) Fluxbox::instance()->keys()->doAction(ev.type, ev.state, 0, Keys::ON_WINDOW, m_client);