handle both Focusable's as m_cycling_next

m_cycling_next can either be WinClient or a FluxboxWindow
In case of the latter, client->fbwindow() needs to be matched in
setFocusedWindow when protecting against client side focus juggling.

BUG: 1148
This commit is contained in:
Thomas Lübking 2016-07-30 14:55:45 +02:00
parent f6132b7602
commit 6defd9391d

View file

@ -591,11 +591,14 @@ void FocusControl::setFocusedWindow(WinClient *client) {
BScreen *screen = client ? &client->screen() : 0;
if (client && screen && screen->focusControl().isCycling()) {
Focusable *next = screen->focusControl().m_cycling_next;
if (next && next != client && screen->focusControl().m_cycling_list->contains(*next)) {
WinClient *nextClient = dynamic_cast<WinClient*>(next);
FluxboxWindow *nextWindow = nextClient ? 0 : dynamic_cast<FluxboxWindow*>(next);
if (next && nextClient != client && nextWindow != client->fbwindow() &&
screen->focusControl().m_cycling_list->contains(*next)) {
// if we're currently cycling and the client tries to juggle around focus
// on FocusIn events to provide client-side modality - don't let him
next->focus();
if (WinClient *nextClient = dynamic_cast<WinClient*>(next))
if (nextClient)
setFocusedWindow(nextClient); // doesn't happen automatically while cycling, 1148
return;
}