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
This commit is contained in:
parent
848875eb92
commit
abd5c9e478
2 changed files with 13 additions and 6 deletions
|
@ -179,8 +179,6 @@ void EventManager::dispatch(Window win, XEvent &ev, bool parent) {
|
|||
evhand->exposeEvent(ev.xexpose);
|
||||
break;
|
||||
case EnterNotify:
|
||||
if (ev.xcrossing.mode != NotifyGrab &&
|
||||
ev.xcrossing.mode != NotifyUngrab)
|
||||
evhand->enterNotifyEvent(ev.xcrossing);
|
||||
break;
|
||||
case LeaveNotify:
|
||||
|
|
|
@ -2716,12 +2716,21 @@ void FluxboxWindow::motionNotifyEvent(XMotionEvent &me) {
|
|||
|
||||
void FluxboxWindow::enterNotifyEvent(XCrossingEvent &ev) {
|
||||
|
||||
// ignore grab activates, or if we're not visible
|
||||
if (ev.mode == NotifyGrab || ev.mode == NotifyUngrab ||
|
||||
!isVisible()) {
|
||||
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 || !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);
|
||||
|
|
Loading…
Reference in a new issue